<?xml version="1.0"?>
<News hasArchived="true" page="8026" pageCount="10743" pageSize="10" timestamp="Sun, 09 Aug 2026 11:33:27 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=8026">
<NewsItem contentIssues="true" id="38802" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38802">
<Title>Hiring PAID Sustainability Outreach Intern - Spring 2014</Title>
<Tagline>On-campus Internship with OCSS (apply by 1/24/14)</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p>PAID Sustainability Outreach Intern (Spring 2014) </p>DESCRIPTION: The Sustainability Outreach Intern at Off-Campus Student Services will promote, support, and raise awareness about sustainability as it relates to commuter students. To accomplish this, the intern will assist in the design and delivery of social and educational events related to alternative transportation (e.g., UMBC Transit Shuttles, MTA public transportation, carpooling, zipcar, etc.) and recycling. Also, the 
    intern will collaborate on events with other UMBC department and student leaders. Through social media and other digital advertising avenues, 
    the intern will promote UMBC’s sustainability initiatives and assist 
    with UMBC’s new Casual Carpooling<br><p>community. <span>Work hours: approximately 8 hours per week. </span></p>QUALIFICATIONS<br><br><ul>
    <li>Majors: Geography, Environmental Science, Public Policy, Political Science,<br>Environmental Engineering and Sustainability, Education, or a related field</li>
    <li>2.5 GPA</li>
    <li>Sophomore, Junior, or Senior standing (undergraduate students)<br>
    </li>
    <li>Passion for sustainability</li>
    <li>Knowledge of advertising through social media</li>
    <li>Experience planning and promoting social and/or educational events is preferred.</li>
    </ul>
    <p>BENEFITS: </p>
    <ul>
    <li>$900 Stipend</li>
    <li>Transcript notation and academic credit</li>
    <li>Participation in social events hosted by OCSS</li>
    <li>Attendance at professional development seminars and events related to sustainability</li>
    <li>Experience creating and facilitating instructional programs in a professional environment</li>
    <li>Professional networking opportunities through coordinating with various UMBC departments, campus members, and student leaders</li>
    <li>Learn professional skills useful for future employment</li>
    <li>A flexible work schedule that compliments your class schedule</li>
    </ul>
    <p><span>To apply, you need to have your resume reviewed and approved by a 
    Coordinator at The Shriver Center. Please call their front desk at 
    410-455-2493 for an appointment or contact <a href="mailto:shrivercenter@umbc.edu" rel="nofollow external" class="bo">shrivercenter@umbc.edu</a>,<a href="mailto:umbcworks@umbc.edu" rel="nofollow external" class="bo"> umbcwor</a><a href="mailto:ks@umbc.edu" rel="nofollow external" class="bo">ks@umbc.edu</a>
     for more information. The internship listing can be found at UMBCworks 
    (ID#: 9262157). The deadline to apply is January 24, 2014. Submit your 
    resume through UMBCworks. Submit your cover letter and unofficial 
    transcript to Jessica Sadler, OCSS Graduate Assistant, 
    <a href="mailto:jsadler1@umbc.edu">jsadler1@umbc.edu</a>.</span></p>
    </div>
]]>
</Body>
<Summary>PAID Sustainability Outreach Intern (Spring 2014)  DESCRIPTION: The Sustainability Outreach Intern at Off-Campus Student Services will promote, support, and raise awareness about sustainability as...</Summary>
<Website>http://umbc.edu/ocss</Website>
<AttachmentKind>Document</AttachmentKind>
<AttachmentUrl>https://assets4-my.umbc.edu/system/shared/attachments/429ef0d80d75773dd73d9ebb547eb21e/6a789dc7/news/000/038/802/56921b5830dc422b9e197e0df48c5b8c/Intern Position Description.pdf?1389715634</AttachmentUrl>
<Attachments>
<Attachment kind="Document" url="https://my3.my.umbc.edu/posts/38802/attachments/12199"></Attachment>
</Attachments>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38802/guest@my.umbc.edu/3b5f418dcccbba51f58c3930284b6914/api/pixel</TrackingUrl>
<Group token="ocss">Commuter Connections </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/ocss</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/xsmall.png?1770828767</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/original.png?1770828767</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/xxlarge.png?1770828767</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/xlarge.png?1770828767</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/large.png?1770828767</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/medium.png?1770828767</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/small.png?1770828767</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/xsmall.png?1770828767</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/369/e9220286d22558b24422af119b418d0c/xxsmall.png?1770828767</AvatarUrl>
<Sponsor>Off-Campus Student Services</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/xxlarge.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/xlarge.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/large.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/medium.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/small.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/xsmall.jpg?1385397013</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/038/802/b5a223831a6480f68ee075531fe18d91/xxsmall.jpg?1385397013</ThumbnailUrl>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 25 Nov 2013 11:30:50 -0500</PostedAt>
<EditAt>Tue, 14 Jan 2014 11:07:14 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="38800" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38800">
<Title>Blackberry Chief Removes Some Top Executives</Title>
<Body>
<![CDATA[
    <div class="html-content">The troubled smartphone maker said its chief operating officer and chief marketing officer were gone from the company. The chief financial officer has been replaced.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F26%2Fbusiness%2Finternational%2Fblackberry-chief-removes-some-top-executives.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Blackberry+Chief+Removes+Some+Top+Executives" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F26%2Fbusiness%2Finternational%2Fblackberry-chief-removes-some-top-executives.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Blackberry+Chief+Removes+Some+Top+Executives" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F26%2Fbusiness%2Finternational%2Fblackberry-chief-removes-some-top-executives.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Blackberry+Chief+Removes+Some+Top+Executives" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F26%2Fbusiness%2Finternational%2Fblackberry-chief-removes-some-top-executives.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Blackberry+Chief+Removes+Some+Top+Executives" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F26%2Fbusiness%2Finternational%2Fblackberry-chief-removes-some-top-executives.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Blackberry+Chief+Removes+Some+Top+Executives" 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/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/sc/24/kg/360/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/kg/360/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180265021956/u/0/f/640387/c/34625/s/34150943/kg/360/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>The troubled smartphone maker said its chief operating officer and chief marketing officer were gone from the company. The chief financial officer has been replaced.      </Summary>
<Website>http://www.nytimes.com/2013/11/26/business/international/blackberry-chief-removes-some-top-executives.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38800/guest@my.umbc.edu/c119b7692bc1dff21d5949411bbb2403/api/pixel</TrackingUrl>
<Tag>appointments-and-executive-changes</Tag>
<Tag>blackberry-bbry-nasdaq</Tag>
<Tag>chen-john-s</Tag>
<Tag>cognos-incorporated-cogn-nasdaq</Tag>
<Tag>international-business-machines-corporation-ibm-nyse</Tag>
<Tag>new</Tag>
<Tag>siemens-ag-si-nyse</Tag>
<Tag>smartphones</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, 25 Nov 2013 11:03:47 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38806" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38806">
<Title>ArtsBeat: Beastie Boys Fight Online Video Parody of &#8216;Girls&#8217;</Title>
<Body>
<![CDATA[
    <div class="html-content">On Monday, the band released an open letter to GoldieBlox, a San Francisco-area company behind a popular web video that reworks the Beastie Boys’ song “Girls.”<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fartsbeat.blogs.nytimes.com%2F2013%2F11%2F25%2Fthe-beastie-boys-fight-online-video-parody-of-girls%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=ArtsBeat%3A+Beastie+Boys+Fight+Online+Video+Parody+of+%E2%80%98Girls%E2%80%99" 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%2Fartsbeat.blogs.nytimes.com%2F2013%2F11%2F25%2Fthe-beastie-boys-fight-online-video-parody-of-girls%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=ArtsBeat%3A+Beastie+Boys+Fight+Online+Video+Parody+of+%E2%80%98Girls%E2%80%99" 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%2Fartsbeat.blogs.nytimes.com%2F2013%2F11%2F25%2Fthe-beastie-boys-fight-online-video-parody-of-girls%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=ArtsBeat%3A+Beastie+Boys+Fight+Online+Video+Parody+of+%E2%80%98Girls%E2%80%99" 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%2Fartsbeat.blogs.nytimes.com%2F2013%2F11%2F25%2Fthe-beastie-boys-fight-online-video-parody-of-girls%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=ArtsBeat%3A+Beastie+Boys+Fight+Online+Video+Parody+of+%E2%80%98Girls%E2%80%99" 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%2Fartsbeat.blogs.nytimes.com%2F2013%2F11%2F25%2Fthe-beastie-boys-fight-online-video-parody-of-girls%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=ArtsBeat%3A+Beastie+Boys+Fight+Online+Video+Parody+of+%E2%80%98Girls%E2%80%99" 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/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/sc/38/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180264965655/u/0/f/640387/c/34625/s/341510da/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>On Monday, the band released an open letter to GoldieBlox, a San Francisco-area company behind a popular web video that reworks the Beastie Boys’ song “Girls.”      </Summary>
<Website>http://artsbeat.blogs.nytimes.com/2013/11/25/the-beastie-boys-fight-online-video-parody-of-girls/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38806/guest@my.umbc.edu/e063cd72d1f5610fbe58f4b7c405a61d/api/pixel</TrackingUrl>
<Tag>beastie-boys-music-group</Tag>
<Tag>california</Tag>
<Tag>copyrights-and-copyright-violations</Tag>
<Tag>goldieblox-inc</Tag>
<Tag>music</Tag>
<Tag>new</Tag>
<Tag>san-francisco-calif</Tag>
<Tag>suits-and-litigation-civil</Tag>
<Tag>technology</Tag>
<Tag>video-recordings-and-downloads</Tag>
<Tag>women-and-girls</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, 25 Nov 2013 10:59:15 -0500</PostedAt>
<EditAt>Wed, 27 Nov 2013 10:26:40 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="38837" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38837">
<Title>The Smashing Book Mystery: Have You Figured It Out Yet?</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <table width="650">
    <tbody>
    <tr>
    <td>
    <div>
    <img src="http://statisches.auslieferung.commindo-media-ressourcen.de/advertisement.gif" alt="" style="max-width: 100%; height: auto;"><br><a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=1" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=1" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=2" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=2" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=3" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=3" alt="" style="max-width: 100%; height: auto;"></a>
    </div>
    </td>
    </tr>
    </tbody>
    </table>
    <p>To celebrate the long-awaited release of our <a href="https://shop.smashingmagazine.com" rel="nofollow external" class="bo">new Smashing Book</a> (<em>yaaaay!</em>), we’ve prepared a little mystery for you. Below you’ll find an <strong>animated GIF that contains a hidden message</strong>. Once you resolved the mystery, you’ll see a Twitter hashtag displayed in plain text.</p>
    <p>Are you ready? Action! (<em>Hint: watch out for the file name</em>).</p>
    <p><img alt="Smashing Book Mystery" src="http://provide.smashingmagazine.com/mystery/look-into-the-house.gif" style="max-width: 100%; height: auto;"><br>
    <em>A hint: watch out for the file name.</em></p>
    <h3>What Can You Win?</h3>
    <p>Among the first readers who tweet us with the hashtag we’ll raffle a quite extraordinary, <em>smashing</em> prize (and a couple of other Smashing extras):</p>
    <ul>
    <li>a ticket to the Smashing Conference Oxford 2014,</li>
    <li>a <strong>roundtrip flight to Oxford, UK</strong>,</li>
    <li>full accommodation in a fancy hotel,</li>
    <li>full access to the Smashing eBook Library,</li>
    <li>any Smashing workshop ticket of your choice,</li>
    <li>a signed edition of the <a href="https://shop.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Book #4</a>,</li>
    <li>a truly Smashing laptop bag,</li>
    <li>your very own Smashing caricature, designed just for you.</li>
    </ul>
    <p>Please notice that to avoid spoilers, comments are closed for this post. And sorry, we aren’t going to make it too easy for you. Alright. Let’s get to work. Have you figured it out yet? ;-)</p>
    <hr>
    <p><small>© Vitaly Friedman for <a href="http://www.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Magazine</a>, 2013.</small></p>
    </div>
]]>
</Body>
<Summary>        To celebrate the long-awaited release of our new Smashing Book (yaaaay!), we’ve prepared a little mystery for you. Below you’ll find an animated GIF that contains a hidden message. Once...</Summary>
<Website>http://www.smashingmagazine.com/2013/11/25/the-smashing-book-4-mystery-have-you-figured-it-out-yet/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38837/guest@my.umbc.edu/c06c07f221900f9e2c570d78cc638982/api/pixel</TrackingUrl>
<Tag>books</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>events</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</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>Mon, 25 Nov 2013 10:54:36 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="38796" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38796">
<Title>Walk in Advising Hours December 2nd-6th</Title>
<Tagline>Stop by to see an advisor.</Tagline>
<Body>
<![CDATA[
    <div class="html-content">Monday, December 2nd<br>10am-11:30am<br>1:30-3pm<br><br>Tuesday, December 3rd<br>10am-11:30am<br>1:30-3pm<br><br>Wednesday, December 4th<br>10am-11am<br>2pm-3pm<br><br>Thursday, December 5th<br>10am-11:30am<br>1:30-3pm<br><br>Friday, December 6th<br>10am-11:30am<br><br>Advisors are also available by appointment.<br>
    </div>
]]>
</Body>
<Summary>Monday, December 2nd 10am-11:30am 1:30-3pm  Tuesday, December 3rd 10am-11:30am 1:30-3pm  Wednesday, December 4th 10am-11am 2pm-3pm  Thursday, December 5th 10am-11:30am 1:30-3pm  Friday, December...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38796/guest@my.umbc.edu/ae98ac3c7a280f20cb349af16172375f/api/pixel</TrackingUrl>
<Group token="coeitadvising">College of Engineering &amp;amp; Information Technology Advising</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/coeitadvising</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/xsmall.png?1778247417</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/original.png?1778247417</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/xxlarge.png?1778247417</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/xlarge.png?1778247417</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/large.png?1778247417</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/medium.png?1778247417</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/small.png?1778247417</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/xsmall.png?1778247417</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/564/6207e48bc2612a0b21c093b4a46a3be8/xxsmall.png?1778247417</AvatarUrl>
<Sponsor>Engineering &amp; Computer Science Advising</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 25 Nov 2013 09:30:54 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38798" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38798">
<Title>Making Yourself Redundant</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <table width="650">
    <tbody>
    <tr>
    <td>
    <div>
    <img src="http://statisches.auslieferung.commindo-media-ressourcen.de/advertisement.gif" alt="" style="max-width: 100%; height: auto;"><br><a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=1" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=1" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=2" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=2" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=3" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=3" alt="" style="max-width: 100%; height: auto;"></a>
    </div>
    </td>
    </tr>
    </tbody>
    </table>
    <p>Can you imagine your company having a chief electricity officer? Seems ridiculous doesn’t it, but many large businesses did when electricity first started to power the industrial economy.</p>
    <p>Electricity is such an integral part of our working life that it is impossible to imagine life without it. Companies just couldn’t operate without power, but it wasn’t always that way. <strong>Many business leaders failed to grasp the full potential of electricity</strong> after it was first introduced. Over a decade after introducing electricity, they were still building factories by water, despite no longer needing it to power their machinery. These business leaders needed help integrating the new technology into their thinking and that is where the chief electricity officer came in.</p>
    <h3>Grasping The Potential Of The Web</h3>
    <p>Although we may scoff at the foolish industrialists with their shortsighted vision, most companies are making exactly the same mistake today with the Web. They are failing to grasp the potential of the Web to revolutionize every aspect of their business. Instead, <strong>many have reduced the Web to a marketing tool</strong>.</p>
    <p>What organizations need is the digital equivalent of a chief electricity officer. They need somebody who will champion digital across the organization until it is as ubiquitous as electricity in the modern work place. Many organizations require a digital evangelist sitting on the board (even if only in a non-executive and part-time capacity) so that digital is fully utilized. However, this should only a temporary requirement.</p>
    <h3>Our Role As Web Professionals Should Be Temporary</h3>
    <p>As I have already pointed out, we don’t need chief electricity officers anymore. Once electricity was fully integrated into the organizational processes and culture, their role became superfluous. The same should be true of us as Web professionals.</p>
    <p><a href="http://www.flickr.com/photos/opensourceway/8250688924/" rel="nofollow external" class="bo"><img src="http://media.smashingmagazine.com/wp-content/uploads/2013/11/out-of-the-box.jpg" width="500" height="281" alt="" style="max-width: 100%; height: auto;"></a><br><em>The Web has much more potential than most of us tend to believe. All you need is to take a closer look. (Image credits: <a href="http://www.flickr.com/photos/opensourceway/8250688924/" rel="nofollow external" class="bo">opensourceway</a>)</em></p>
    <p>Whether part of an internal Web team or an external developer, <strong>our eventual aim should be to make our role redundant</strong>, once digital is a part of daily working life. Once that happens you would no longer need a digital team in the same way as we no longer need a chief electricity officer.</p>
    <p>I am aware this may sound like a rather extreme position. It is hard to imagine a world where this is a reality, but I believe we may one day get there. Whether we do is not really the point. The point is that the way we perceive our job is so important and that at the moment the emphasis is slightly wrong.</p>
    <h3>We Shouldn’t Remain The Owners Of Digital</h3>
    <p>At the moment, most Web professionals see their job as executing some form of digital strategy. It falls to them to build, maintain and run digital assets from websites to mobile apps. Sometimes we facilitate the contribution of others through the use of a content management system, but ultimately we feel we should ‘own’ digital.</p>
    <p>In fact, I have heard many argue that internal Web teams don’t have enough ownership over the Web (something I have written myself) and that external teams are seen as implementors rather than providing more of a leadership role. I have also heard many argue that organizations need a digital strategy and that digital teams should be more empowered within organizations.</p>
    <p>All of these arguments I agree with, but feel that although true, they miss the point. Yes, right now we need a strong digital team. Yes, organizations should use external contractors as more than implementors and yes companies need to think about their strategy towards digital. However, these are all transitionary principles. They are merely stepping stones towards a greater aim, which is to make digital ubiquitous within the organization. In the end, <strong>we need a business strategy that includes digital</strong>, rather than a separate digital strategy.</p>
    <h3>Our Primary Role Is Knowledge Transfer</h3>
    <p>If we believe our objective is to make digital ubiquitous, then our primary role as Web professionals is knowledge transfer. It falls to us to teach those within the organizations with which we work, about the potential and power of digital. Ultimately is not our job to own digital or just to build digital assets. <strong>Our job is to teach others how to own digital</strong> and put in place the assets they need. In the short term this may involve us leading by example. We may need to set a strong digital direction and take ownership over digital as a chief electricity officer did, but eventually we will need to let go of the reins.</p>
    <p>Furthermore, if we see our role as educators, facilitators and evangelists then we approach things with a different attitude. Its not about building our digital empire within an organization and wrestling control from the ignorant colleagues that “don’t get digital”. Equally as an external contract our aim is not to ensure a long term revenue stream from clients by making them reliant on our services. Instead it is about facilitating others through improving their understanding of digital.</p>
    <p><a href="http://www.flickr.com/photos/opensourceway/6006269910/" rel="nofollow external" class="bo"><img src="http://media.smashingmagazine.com/wp-content/uploads/2013/11/mobile-airplane.jpg" width="500" height="281" alt="" style="max-width: 100%; height: auto;"></a><br><em>Digital strategy always requires focus on the essential — on what matters most. (Image credits: <a href="http://www.flickr.com/photos/opensourceway/6006269910/" rel="nofollow external" class="bo">opensourceway</a>)</em></p>
    <p>Don’t get me wrong. Many organizations need strong central leadership over digital and the Web team is the place for that. Equally, I have no problem with agencies who work in long-term partnership with clients if that is what is right for the client. However, ultimately <strong>we need to be willing to step aside when we have become a bottleneck</strong> and when the organization has reached a point when digital is deep rooted across the entire company.</p>
    <h3>Are You Building An Empire Or Facilitating Change?</h3>
    <p>It’s time for you to honestly ask yourself what your agenda is. Is it to help organizations facilitate their use of digital or are you more concerned with securing your own position? If it is the latter I would challenge you to think again. <strong>By facilitating others and focusing on knowledge transfer</strong> you will become the go-to person for innovation and the next big thing. Become so concerned with your own job and you will be the roadblock everybody has to work around to get things done.</p>
    <p>Even after 20 years of the Web, <strong>we are still at the beginning of a transformation from an industrial to digital economy</strong>. Adapting to this change is a huge undertaking for most organizations and we can either be facilitators of that change or we can isolate ourselves as some kind of digital elite.</p>
    <p>I know which I choose. What about you?</p>
    <p><strong>Editor’s Note</strong><em>: Paul Boag is writing a new Smashing book on “Digital Adaptation” with guidelines for adapting a business for the digital economy. Coming out in March 2014. If you like, you can <a href="http://eepurl.com/JsT6n" rel="nofollow external" class="bo">subscribe for email updates</a> to be among the first ones to know!</em>
    </p>
    <p>
    <em>(il)</em></p>
    <hr>
    <p><small>© Paul Boag for <a href="http://www.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Magazine</a>, 2013.</small></p>
    </div>
]]>
</Body>
<Summary>        Can you imagine your company having a chief electricity officer? Seems ridiculous doesn’t it, but many large businesses did when electricity first started to power the industrial economy....</Summary>
<Website>http://www.smashingmagazine.com/2013/11/25/making-yourself-redundant/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38798/guest@my.umbc.edu/b720a709bf9d7c04d67ca79c313a6c23/api/pixel</TrackingUrl>
<Tag>business</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>opinion-column</Tag>
<Tag>php</Tag>
<Tag>sql</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>Mon, 25 Nov 2013 09:20:59 -0500</PostedAt>
<EditAt>Mon, 25 Nov 2013 09:20:59 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="38795" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38795">
<Title>The Repository Design Pattern</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=35804&amp;c=1135706073" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=35804&amp;c=1135706073" alt="" style="max-width: 100%; height: auto;"></a><p>The Repository Design Pattern, defined by Eric Evens in his <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" rel="nofollow external" class="bo">Domain Driven Design</a> book, is one of the most useful and most widely applicable design patterns ever invented. Any application has to work with persistence and with some kind of list of items. These can be users, products, networks, disks, or whatever your application is about. If you have a blog for example, you have to deal with lists of blog posts and lists of comments. The problem that all of these list management logics have in common is how to connect business logic, factories and persistence.</p>
    <p></p>
    <hr>
    <h2>The Factory Design Pattern</h2>
    <p>As we mentioned in the introductory paragraph, a Repository will connect Factories with Gateways (persistence). These are also design patterns and if you are not familiar with them, this paragraph will shed some light on the subject.</p>
    <p>A factory is a simple design pattern that defines a convenient way to create objects. It is a class or set of classes responsible for creating the objects our business logic needs. A factory traditionally has a method called <code>"<code>make()</code>"</code> and it will know how to take all the information needed to build an object and do the object building itself and return a ready-to-use object to the business logic.</p>
    <p>Here is a little bit more on the Factory Pattern in an older Nettuts+ tutorial: <a href="http://net.tutsplus.com/articles/general/a-beginners-guide-to-design-patterns/" rel="nofollow external" class="bo">A Beginner’s Guide to Design Patterns</a>. If you prefer a deeper view on the Factory Pattern, check out the first design pattern in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course we have on Tuts+.</p>
    <hr>
    <h2>The Gateway Pattern</h2>
    <p>Also known as “Table Data Gateway” is a simple pattern that offers the connection between the business logic and the database itself. Its main responsibility is to do the queries on the database and provide the retrieved data in a data structure typical for the programming language (like an array in PHP). This data is then usually filtered and modified in the PHP code so that we can obtain the information and variables needed to crate our objects. This information must then be passed to the Factories.</p>
    <p>The Gateway Design Pattern is explained and exemplified in quite great detail in a Nettuts+ tutorial about <a href="http://net.tutsplus.com/tutorials/php/evolving-toward-a-persistence-layer/" rel="nofollow external" class="bo">Evolving Toward a Persistence Layer</a>. Also, in the same <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course the second design pattern lesson is about this subject.</p>
    <hr>
    <h2>The Problems We Need to Solve</h2>
    <h3>Duplication by Data Handling</h3>
    <p>It may not be obvious at first sight, but connecting Gateways to Factories can lead to a lot of duplication. Any considerable sized software needs to create the same objects from different places. In each place you will need to use the Gateway to retrieve a set of raw data, filter and work that data to be ready to be sent to the Factories. From all these places, you will call the same factories with the same data structures but obviously with different data. Your objects will be created and provided to you by the Factories. This will, inevitably lead to a lot of duplication in time. And the duplication will be spread throughout distant classes or modules and will be difficult to notice and to fix.</p>
    <h3>Duplication by Data Retrieval Logic Reimplementation</h3>
    <p>Another problem we have is how to express the queries we need to do with the help of the Gateways. Each time we need some information from the Gateway we need to think about what do we exactly need? Do we need all the data about a single subject? Do we need only some specific information? Do we want to retrieve a specific group from the database and do the sorting or refined filtering in our programming language? All of these questions need to be addressed each time we retrieve information from the persistence layer through our Gateway. Each time we do this, we will have to come up with a solution. In time, as our application grows, we will be confronted with the same dilemmas in different places of our application. Inadvertently we will come up with slightly different solutions to the same problems. This not only takes extra time and effort but also leads to a subtle, mostly very difficult to recognize, duplication. This is the most dangerous type of duplication.</p>
    <h3>Duplication by Data Persistence Logic Reimplementation</h3>
    <p>In the previous two paragraphs we talked only about data retrieval. But the Gateway is bidirectional. Our business logic is bidirectional. We have to somehow persist our objects. This again leads to a lot of repetition if we want to implement this logic as needed throughout different modules and classes of our application.</p>
    <hr>
    <h2>The Main Concepts</h2>
    <h3>Repository for Data Retrieval</h3>
    <p>A Repository can function in two ways: data retrieval and data persistence.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/11/UMLRepoQuery.png" alt="UMLRepoQuery" width="600" height="302" style="max-width: 100%; height: auto;"><br> <p>When used to retrieve objects from persistence, a Repository will be called with a custom query. This query can be a specific method by name or a more common method with parameters. The Repository is responsible to provide and implement these query methods. When such a method is called, the Repository will contact the Gateway to retrieve the raw data from the persistence. The Gateway will provide raw object data (like an array with values). Then the Repository will take this data, do the necessary transformations and call the appropriate Factory methods. The Factories will provide the objects constructed with the data provided by the Repository. The Repository will collect these objects and return them as a set of objects (like an array of objects or a collection object as defined in the Composite Pattern lesson in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course).</p>
    <h3>Repository for Data Persistence</h3>
    <p>The second way a Repository can work is to provide the logic needed to be done in order to extract the information from an object and persist it. This can be as simple as serializing the object and sending the serialized data to the Gateway to persist it or as sophisticated as creating arrays of information with all the fields and state of an object.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/11/UMLRepoPersist.png" alt="UMLRepoPersist" width="489" height="410" style="max-width: 100%; height: auto;"><br> <p>When used to persist information the client class is the one directly communicating with the Factory. Imagine a scenario when a new comment is posted to a blog post. A Comment object is created by our business logic (the Client class) and then sent to the Repository to be persisted. The repository will persist the objects using the Gateway and optionally cache them in a local in memory list. Data needs to be transformed because there are only rare cases when real objects can be directly saved to a persistence system.</p>
    <hr>
    <h2>Connecting the Dots</h2>
    <p>The image below is a higher level view on how to integrate the Repository between the Factories, the Gateway and the Client.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/11/UMLRepository.png" alt="UMLRepository" width="600" height="401" style="max-width: 100%; height: auto;"><br> <p>In the center of the schema is our Repository. On the left, is an Interface for the Gateway, an implementation and the persistence itself. On the right, there is an Interface for the Factories and a Factory implementation. Finally, on the top there is the client class.</p>
    <p>As it can be observed from the direction of the arrows, the dependencies are inverted. Repository only depend on the abstract interfaces for Factories and Gateways. Gateway depends on its interface and the persistence it offers. The Factory depends only on its Interface. The client depends on Repository, which is acceptable because the Repository tends to be less concrete than the Client.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/11/HighLevelDesign.png" alt="HighLevelDesign" width="600" height="388" style="max-width: 100%; height: auto;"><br> <p>Put in perspective, the paragraph above respects our high level architecture and the direction of dependencies we want to achieve.</p>
    <hr>
    <h2>Managing Comments to Blog Posts With a Repository</h2>
    <p>Now that we’ve seen the theory, it is time for a practical example. Imagine we have a blog where we have Post objects and Comment objects. Comments belong to Posts and we have to find a way to persist them and to retrieve them.</p>
    <h3>The Comment</h3>
    <p>We will start with a test that will force us to think about what our Comment object should contain.</p>
    <pre>class RepositoryTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testACommentHasAllItsComposingParts() {&#x000A;    		$postId = 1;&#x000A;    		$commentAuthor = "Joe";&#x000A;    		$commentAuthorEmail = "<a href="mailto:joe@gmail.com">joe@gmail.com</a>";&#x000A;    		$commentSubject = "Joe Has an Opinion about the Repository Pattern";&#x000A;    		$commentBody = "I think it is a good idea to use the Repository Pattern to persist and retrieve objects.";&#x000A;    &#x000A;    		$comment = new Comment($postId, $commentAuthor, $commentAuthorEmail, $commentSubject, $commentBody);&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>At first glance, a Comment will just be a data object. It may not have any functionality, but that is up to the context of our application to decide. For this example just assume it is a simple data object. Constructed with a set of variables.</p>
    <pre>class Comment {&#x000A;    &#x000A;    }</pre>
    <p>Just by creating an empty class and requiring it in the test makes it pass.</p>
    <pre>require_once '../Comment.php';&#x000A;    &#x000A;    class RepositoryTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    [ ... ]&#x000A;    &#x000A;    }</pre>
    <p>But that’s far from perfect. Our test does not test anything yet. Let’s force ourselves to write all the getters on the Comment class.</p>
    <pre>function testACommentsHasAllItsComposingParts() {&#x000A;    	$postId = 1;&#x000A;    	$commentAuthor = "Joe";&#x000A;    	$commentAuthorEmail = "<a href="mailto:joe@gmail.com">joe@gmail.com</a>";&#x000A;    	$commentSubject = "Joe Has an Opinion about the Repository Pattern";&#x000A;    	$commentBody = "I think it is a good idea to use the Repository Pattern to persist and retrieve objects.";&#x000A;    &#x000A;    	$comment = new Comment($postId, $commentAuthor, $commentAuthorEmail, $commentSubject, $commentBody);&#x000A;    &#x000A;    	$this-&gt;assertEquals($postId, $comment-&gt;getPostId());&#x000A;    	$this-&gt;assertEquals($commentAuthor, $comment-&gt;getAuthor());&#x000A;    	$this-&gt;assertEquals($commentAuthorEmail, $comment-&gt;getAuthorEmail());&#x000A;    	$this-&gt;assertEquals($commentSubject, $comment-&gt;getSubject());&#x000A;    	$this-&gt;assertEquals($commentBody, $comment-&gt;getBody());&#x000A;    }</pre>
    <p>To control the length of the tutorial, I wrote all the assertions at once and we will implement them at once as well. In real life, take them one by one.</p>
    <pre>class Comment {&#x000A;    &#x000A;    	private $postId;&#x000A;    	private $author;&#x000A;    	private $authorEmail;&#x000A;    	private $subject;&#x000A;    	private $body;&#x000A;    &#x000A;    	function __construct($postId, $author, $authorEmail, $subject, $body) {&#x000A;    		$this-&gt;postId = $postId;&#x000A;    		$this-&gt;author = $author;&#x000A;    		$this-&gt;authorEmail = $authorEmail;&#x000A;    		$this-&gt;subject = $subject;&#x000A;    		$this-&gt;body = $body;&#x000A;    	}&#x000A;    &#x000A;    	public function getPostId() {&#x000A;    		return $this-&gt;postId;&#x000A;    	}&#x000A;    &#x000A;    	public function getAuthor() {&#x000A;    		return $this-&gt;author;&#x000A;    	}&#x000A;    &#x000A;    	public function getAuthorEmail() {&#x000A;    		return $this-&gt;authorEmail;&#x000A;    	}&#x000A;    &#x000A;    	public function getSubject() {&#x000A;    		return $this-&gt;subject;&#x000A;    	}&#x000A;    &#x000A;    	public function getBody() {&#x000A;    		return $this-&gt;body;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Except for the list of private variables, the rest of the code was generated by my IDE, NetBeans, so testing the auto generated code may be a little bit of overhead some times. If you are not writing these lines by yourself, feel free to do them directly and don’t bother with tests for setters and constructors. Nevertheless, the test helped us better expose our ideas and better document what our Comment class will contain.</p>
    <p>We can also consider these test methods and test classes as our “Client” classes from the schemas.</p>
    <hr>
    <h2>Our Gateway to Persistence</h2>
    <p>To keep this example as simple as possible, we will implement only an InMemoryPersistence so that we do not complicate our existence with file systems or databases.</p>
    <pre>require_once '../InMemoryPersistence.php';&#x000A;    &#x000A;    class InMemoryPersistenceTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testItCanPerisistAndRetrieveASingleDataArray() {&#x000A;    		$data = array('data');&#x000A;    &#x000A;    		$persistence = new InMemoryPersistence();&#x000A;    		$persistence-&gt;persist($data);&#x000A;    &#x000A;    		$this-&gt;assertEquals($data, $persistence-&gt;retrieve(0));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>As usual, we start with the simplest test that could possibly fail and also force us to write some code. This test creates a new <code>InMemoryPersistence</code> object and tries to persist and retrieve an array called <code>data</code>.</p>
    <pre>require_once __DIR__ . '/Persistence.php';&#x000A;    &#x000A;    class InMemoryPersistence implements Persistence {&#x000A;    &#x000A;    	private $data = array();&#x000A;    &#x000A;    	function persist($data) {&#x000A;    		$this-&gt;data = $data;&#x000A;    	}&#x000A;    &#x000A;    	function retrieve($id) {&#x000A;    		return $this-&gt;data;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>The simplest code to make it pass is just to keep the incoming <code>$data</code> in a private variable and return it in the <code>retrieve</code> method. The code as it is right now does not care about the sent in <code>$id</code> variable. It is the simplest thing that could possibly make the test pass. We also took the liberty to introduce and implement an interface called <code>Persistence</code>.</p>
    <pre>interface Persistence {&#x000A;    &#x000A;    	function persist($data);&#x000A;    	function retrieve($ids);&#x000A;    &#x000A;    }</pre>
    <p>This interface defines the two methods any Gateway needs to implement. <code>Persist</code> and <code>retrieve</code>. As you probably already guessed, our Gateway is our <code>InMemoryPersistence</code> class and our physical persistence is the private variable holding our data in the memory. But let’s get back to the implementation of this in memory persistence.</p>
    <pre>function testItCanPerisistSeveralElementsAndRetrieveAnyOfThem() {&#x000A;    	$data1 = array('data1');&#x000A;    	$data2 = array('data2');&#x000A;    &#x000A;    	$persistence = new InMemoryPersistence();&#x000A;    	$persistence-&gt;persist($data1);&#x000A;    	$persistence-&gt;persist($data2);&#x000A;    &#x000A;    	$this-&gt;assertEquals($data1, $persistence-&gt;retrieve(0));&#x000A;    	$this-&gt;assertEquals($data2, $persistence-&gt;retrieve(1));&#x000A;    }</pre>
    <p>We added another test. In this one we persist two different data arrays. We expect to be able to retrieve each of them individually.</p>
    <pre>require_once __DIR__ . '/Persistence.php';&#x000A;    &#x000A;    class InMemoryPersistence implements Persistence {&#x000A;    	private $data = array();&#x000A;    	function persist($data) {&#x000A;    		$this-&gt;data[] = $data;&#x000A;    	}&#x000A;    &#x000A;    	function retrieve($id) {&#x000A;    		return $this-&gt;data[$id];&#x000A;    	}&#x000A;    }</pre>
    <p>The test forced us to slightly alter our code. We now need to add data to our array, not just replace it with the one sent in to <code>persists()</code>. We also need to consider the <code>$id</code> parameter and return the element at that index.</p>
    <p>This is enough for our <code>InMemoryPersistence</code>. If needed, we can modify it later.</p>
    <hr>
    <h2>Our Factory</h2>
    <p>We have a Client (our tests), a persistence with a Gateway, and Comment objects to persists. The next missing thing is our Factory.</p>
    <p>We started our coding with a <code>RepositoryTest</code> file. This test, however, actually created a <code>Comment</code> object. Now we need to create tests to verify if our Factory will be able to create <code>Comment</code> objects. It seems like we had an error in judgment and our test is more likely a test for our upcoming Factory than for our Repository. We can move it into another test file, <code>CommentFactoryTest</code>.</p>
    <pre>require_once '../Comment.php';&#x000A;    &#x000A;    class CommentFactoryTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testACommentsHasAllItsComposingParts() {&#x000A;    		$postId = 1;&#x000A;    		$commentAuthor = "Joe";&#x000A;    		$commentAuthorEmail = "<a href="mailto:joe@gmail.com">joe@gmail.com</a>";&#x000A;    		$commentSubject = "Joe Has an Opinion about the Repository Pattern";&#x000A;    		$commentBody = "I think it is a good idea to use the Repository Pattern to persist and retrieve objects.";&#x000A;    &#x000A;    		$comment = new Comment($postId, $commentAuthor, $commentAuthorEmail, $commentSubject, $commentBody);&#x000A;    &#x000A;    		$this-&gt;assertEquals($postId, $comment-&gt;getPostId());&#x000A;    		$this-&gt;assertEquals($commentAuthor, $comment-&gt;getAuthor());&#x000A;    		$this-&gt;assertEquals($commentAuthorEmail, $comment-&gt;getAuthorEmail());&#x000A;    		$this-&gt;assertEquals($commentSubject, $comment-&gt;getSubject());&#x000A;    		$this-&gt;assertEquals($commentBody, $comment-&gt;getBody());&#x000A;    	}&#x000A;    }</pre>
    <p>Now, this test obviously passes. And while it is a correct test, we should consider modifying it. We want to create a <code>Factory</code> object, pass in an array and ask it to create a <code>Comment</code> for us.</p>
    <pre>require_once '../CommentFactory.php';&#x000A;    &#x000A;    class CommentFactoryTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testACommentsHasAllItsComposingParts() {&#x000A;    		$postId = 1;&#x000A;    		$commentAuthor = "Joe";&#x000A;    		$commentAuthorEmail = "<a href="mailto:joe@gmail.com">joe@gmail.com</a>";&#x000A;    		$commentSubject = "Joe Has an Opinion about the Repository Pattern";&#x000A;    		$commentBody = "I think it is a good idea to use the Repository Pattern to persist and retrieve objects.";&#x000A;    &#x000A;    		$commentData = array($postId, $commentAuthor, $commentAuthorEmail, $commentSubject, $commentBody);&#x000A;    &#x000A;    		$comment = (new CommentFactory())-&gt;make($commentData);&#x000A;    &#x000A;    		$this-&gt;assertEquals($postId, $comment-&gt;getPostId());&#x000A;    		$this-&gt;assertEquals($commentAuthor, $comment-&gt;getAuthor());&#x000A;    		$this-&gt;assertEquals($commentAuthorEmail, $comment-&gt;getAuthorEmail());&#x000A;    		$this-&gt;assertEquals($commentSubject, $comment-&gt;getSubject());&#x000A;    		$this-&gt;assertEquals($commentBody, $comment-&gt;getBody());&#x000A;    	}&#x000A;    }</pre>
    <p>We should never name our classes based on the design pattern they implement, but <code>Factory</code> and <code>Repository</code> represent more than just the design pattern itself. I personally have nothing against including these two words in our class’s names. However I still strongly recommend and respect the concept of not naming our classes after the design patterns we use for the rest of the patterns.</p>
    <p>This test is just slightly different from the previous one, but it fails. It tries to create a <code>CommentFactory</code> object. That class does not exist yet. We also try to call a <code>make()</code> method on it with an array containing all the information of a comment as an array. This method is defined in the <code>Factory</code> interface.</p>
    <pre>interface Factory {&#x000A;    	function make($data);&#x000A;    }</pre>
    <p>This is a very common <code>Factory</code> interface. It defined the only required method for a factory, the method that actually creates the objects we want.</p>
    <pre>require_once __DIR__ . '/Factory.php';&#x000A;    require_once __DIR__ . '/Comment.php';&#x000A;    &#x000A;    class CommentFactory implements Factory {&#x000A;    &#x000A;    	function make($components) {&#x000A;    		return new Comment($components[0], $components[1], $components[2], $components[3], $components[4]);&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>And <code>CommentFactory</code> implements the <code>Factory</code> interface successfully by taking the <code>$components</code> parameter in its <code>make()</code> method, creates and returns a new <code>Comment</code> object with the information from there.</p>
    <p>We will keep our persistence and object creation logic as simple as possible. We can, for this tutorial, safely ignore any error handling, validation and exception throwing. We will stop here with the persistence and object creation implementation.</p>
    <hr>
    <h2>Using a Repository to Persist Comments</h2>
    <p>As we’ve seen above, we can use a Repository in two ways. To retrieve information from persistence and also to persist information on the persistence layer. Using TDD it is, most of the time, easier to start with the saving (persisting) part of the logic and then use that existing implementation to test data retrieval.</p>
    <pre>require_once '../../../vendor/autoload.php';&#x000A;    require_once '../CommentRepository.php';&#x000A;    require_once '../CommentFactory.php';&#x000A;    &#x000A;    class RepositoryTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	protected function tearDown() {&#x000A;    		\Mockery::close();&#x000A;    	}&#x000A;    &#x000A;    	function testItCallsThePersistenceWhenAddingAComment() {&#x000A;    &#x000A;    		$persistanceGateway = \Mockery::mock('Persistence');&#x000A;    		$commentRepository = new CommentRepository($persistanceGateway);&#x000A;    &#x000A;    		$commentData = array(1, 'x', 'x', 'x', 'x');&#x000A;    		$comment = (new CommentFactory())-&gt;make($commentData);&#x000A;    &#x000A;    		$persistanceGateway-&gt;shouldReceive('persist')-&gt;once()-&gt;with($commentData);&#x000A;    &#x000A;    		$commentRepository-&gt;add($comment);&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>We use Mockery to mock our persistence and inject that mocked object to the Repository. Then we call <code>add()</code> on the repository. This method has a parameter of type <code>Comment</code>. We expect the persistence to be called with an array of data similar to <code>$commentData</code>.</p>
    <pre>require_once __DIR__ . '/InMemoryPersistence.php';&#x000A;    &#x000A;    class CommentRepository {&#x000A;    &#x000A;    	private $persistence;&#x000A;    &#x000A;    	function __construct(Persistence $persistence = null) {&#x000A;    		$this-&gt;persistence = $persistence ? : new InMemoryPersistence();&#x000A;    	}&#x000A;    &#x000A;    	function add(Comment $comment) {&#x000A;    		$this-&gt;persistence-&gt;persist(array(&#x000A;    			$comment-&gt;getPostId(),&#x000A;    			$comment-&gt;getAuthor(),&#x000A;    			$comment-&gt;getAuthorEmail(),&#x000A;    			$comment-&gt;getSubject(),&#x000A;    			$comment-&gt;getBody()&#x000A;    		));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>As you can see, the <code>add()</code> method is quite smart. It encapsulates the knowledge about how to transform a PHP object into a plain array usable by the persistence. Remember, our persistence gateway usually is a general object for all of our data. It can and will persist all the data of our application, so sending to it objects would make it do too much: both conversion and effective persistence.</p>
    <p>When you have an <code>InMemoryPersistence</code> class like we do, it is very fast. We can use it as an alternative to mocking the gateway.</p>
    <pre>function testAPersistedCommentCanBeRetrievedFromTheGateway() {&#x000A;    &#x000A;    	$persistanceGateway = new InMemoryPersistence();&#x000A;    	$commentRepository = new CommentRepository($persistanceGateway);&#x000A;    &#x000A;    	$commentData = array(1, 'x', 'x', 'x', 'x');&#x000A;    	$comment = (new CommentFactory())-&gt;make($commentData);&#x000A;    &#x000A;    	$commentRepository-&gt;add($comment);&#x000A;    &#x000A;    	$this-&gt;assertEquals($commentData, $persistanceGateway-&gt;retrieve(0));&#x000A;    }</pre>
    <p>Of course if you do not have an in-memory implementation of your persistence, mocking is the only reasonable way to go. Otherwise your test will be just too slow to be practical.</p>
    <pre>function testItCanAddMultipleCommentsAtOnce() {&#x000A;    &#x000A;    	$persistanceGateway = \Mockery::mock('Persistence');&#x000A;    	$commentRepository = new CommentRepository($persistanceGateway);&#x000A;    &#x000A;    	$commentData1 = array(1, 'x', 'x', 'x', 'x');&#x000A;    	$comment1 = (new CommentFactory())-&gt;make($commentData1);&#x000A;    	$commentData2 = array(2, 'y', 'y', 'y', 'y');&#x000A;    	$comment2 = (new CommentFactory())-&gt;make($commentData2);&#x000A;    &#x000A;    	$persistanceGateway-&gt;shouldReceive('persist')-&gt;once()-&gt;with($commentData1);&#x000A;    	$persistanceGateway-&gt;shouldReceive('persist')-&gt;once()-&gt;with($commentData2);&#x000A;    &#x000A;    	$commentRepository-&gt;add(array($comment1, $comment2));&#x000A;    }</pre>
    <p>Our next logical step is to implement a way to add several comments at once. Your project may not require this functionality and it is not something required by the pattern. In fact, the Repository Pattern only says that it will provide a custom query and persistence language for our business logic. So if our bushiness logic feels the need of adding several comments at once, the Repository is the place where the logic should reside.</p>
    <pre>function add($commentData) {&#x000A;    	if (is_array($commentData))&#x000A;    		foreach ($commentData as $comment)&#x000A;    			$this-&gt;persistence-&gt;persist(array(&#x000A;    				$comment-&gt;getPostId(),&#x000A;    				$comment-&gt;getAuthor(),&#x000A;    				$comment-&gt;getAuthorEmail(),&#x000A;    				$comment-&gt;getSubject(),&#x000A;    				$comment-&gt;getBody()&#x000A;    			));&#x000A;    	else&#x000A;    		$this-&gt;persistence-&gt;persist(array(&#x000A;    			$commentData-&gt;getPostId(),&#x000A;    			$commentData-&gt;getAuthor(),&#x000A;    			$commentData-&gt;getAuthorEmail(),&#x000A;    			$commentData-&gt;getSubject(),&#x000A;    			$commentData-&gt;getBody()&#x000A;    		));&#x000A;    }</pre>
    <p>And the simplest way to make the test pass is to just verify if the parameter we are getting is an array or not. If it is an array, we will cycle through each element and call the persistence with the array we generate from one single <code>Comment</code> object. And while this code is syntactically correct and makes the test pass, it introduces a slight duplication that we can get rid of quite easily.</p>
    <pre>function add($commentData) {&#x000A;    	if (is_array($commentData))&#x000A;    		foreach ($commentData as $comment)&#x000A;    			$this-&gt;addOne($comment);&#x000A;    	else&#x000A;    		$this-&gt;addOne($commentData);&#x000A;    }&#x000A;    &#x000A;    private function addOne(Comment $comment) {&#x000A;    	$this-&gt;persistence-&gt;persist(array(&#x000A;    		$comment-&gt;getPostId(),&#x000A;    		$comment-&gt;getAuthor(),&#x000A;    		$comment-&gt;getAuthorEmail(),&#x000A;    		$comment-&gt;getSubject(),&#x000A;    		$comment-&gt;getBody()&#x000A;    	));&#x000A;    }</pre>
    <p>When all the tests are green, it is alway time for refactoring before we continue with the next failing test. And we did just that with the <code>add()</code> method. We extracted the addition of a single comment into a private method and called it from two different places in our public <code>add()</code> method. This not only reduced duplication but also opened the possibility of making the <code>addOne()</code> method public and letting the business logic decide if it wants to add one or several comments at a time. This would lead to a different implementation of our Repository, with an <code>addOne()</code> and another <code>addMany()</code> methods. It would be a perfectly legitimate implementation of the Repository Pattern.</p>
    <hr>
    <h2>Retrieving Comments With Our Repository</h2>
    <p>A Repository provides a custom query language for the business logic. So the names and functionalities of the query methods of a Repository is hugely up to the requirements of the business logic. You build your repository as you build your business logic, as you need another custom query method. However, there are at least one or two methods that you will find on almost any Repository.</p>
    <pre>function testItCanFindAllComments() {&#x000A;    	$repository = new CommentRepository();&#x000A;    &#x000A;    	$commentData1 = array(1, 'x', 'x', 'x', 'x');&#x000A;    	$comment1 = (new CommentFactory())-&gt;make($commentData1);&#x000A;    	$commentData2 = array(2, 'y', 'y', 'y', 'y');&#x000A;    	$comment2 = (new CommentFactory())-&gt;make($commentData2);&#x000A;    &#x000A;    	$repository-&gt;add($comment1);&#x000A;    	$repository-&gt;add($comment2);&#x000A;    &#x000A;    	$this-&gt;assertEquals(array($comment1, $comment2), $repository-&gt;findAll());&#x000A;    }</pre>
    <p>The first such method is called <code>findAll()</code>. This should return all the objects the repository is responsible for, in our case <code>Comments</code>. The test is simple, we add a comment, then another one, and finally we want to call <code>findAll()</code> and get a list containing both comments. This is however not accomplish-able with our <code>InMemoryPersistence</code> as it is at this point. A small update is required.</p>
    <pre>function retrieveAll() {&#x000A;    	return $this-&gt;data;&#x000A;    }</pre>
    <p>That’s it. We added a <code>retrieveAll()</code> method which just returns the whole <code>$data</code> array from the class. Simple and effective. It’s time to implement <code>findAll()</code> on the <code>CommentRepository</code> now.</p>
    <pre>function findAll() {&#x000A;    	$allCommentsData = $this-&gt;persistence-&gt;retrieveAll();&#x000A;    	$comments = array();&#x000A;    	foreach ($allCommentsData as $commentData)&#x000A;    		$comments[] = $this-&gt;commentFactory-&gt;make($commentData);&#x000A;    	return $comments;&#x000A;    }</pre>
    <p><code>findAll()</code> will call the <code>retrieveAll()</code> method on our persistence. That method provides a raw array of data. <code>findAll()</code> will cycle through each element and use the data as necessary to be passed to the Factory. The factory will provide one <code>Comment</code> a time. An array with these comments will be built and returned at the end of <code>findAll()</code>. Simple and effective.</p>
    <p>Another common method you will find on repositories is to search for a specific object or group of objects based on their characteristic key. For example, all of our comments are connected to a blog post by a <code>$postId</code> internal variable. I can imagine that in our blog’s business logic we would almost always want to find all the comments related to a blog post when that blog post is displayed. So a method called <code>findByPostId($id)</code> sounds reasonable to me.</p>
    <pre>function testItCanFindCommentsByBlogPostId() {&#x000A;    	$repository = new CommentRepository();&#x000A;    &#x000A;    	$commentData1 = array(1, 'x', 'x', 'x', 'x');&#x000A;    	$comment1 = (new CommentFactory())-&gt;make($commentData1);&#x000A;    	$commentData2 = array(1, 'y', 'y', 'y', 'y');&#x000A;    	$comment2 = (new CommentFactory())-&gt;make($commentData2);&#x000A;    	$commentData3 = array(3, 'y', 'y', 'y', 'y');&#x000A;    	$comment3 = (new CommentFactory())-&gt;make($commentData3);&#x000A;    &#x000A;    	$repository-&gt;add(array($comment1, $comment2));&#x000A;    	$repository-&gt;add($comment3);&#x000A;    &#x000A;    	$this-&gt;assertEquals(array($comment1, $comment2), $repository-&gt;findByPostId(1));&#x000A;    }</pre>
    <p>We just create three simple comments. The first two have the same <code>$postId = 1</code>, the third one has <code>$postID = 3</code>. We add all of them to the repository and then we expect an array with the first two ones when we do a <code>findByPostId()</code> for the <code>$postId = 1</code>.</p>
    <pre>function findByPostId($postId) {&#x000A;    	return array_filter($this-&gt;findAll(), function ($comment) use ($postId){&#x000A;    		return $comment-&gt;getPostId() == $postId;&#x000A;    	});&#x000A;    }</pre>
    <p>The implementation couldn’t be simpler. We find all the comments using our already implemented <code>findAll()</code> method and we filter the array. We have no way to ask the persistence to do the filtering for us, so we will do it here. The code will query each <code>Comment</code> object and compare its <code>$postId</code> with the one we sent in as parameter. Great. The test passes. But I feel we missed something.</p>
    <pre>function testItCanFindCommentsByBlogPostId() {&#x000A;    	$repository = new CommentRepository();&#x000A;    &#x000A;    	$commentData1 = array(1, 'x', 'x', 'x', 'x');&#x000A;    	$comment1 = (new CommentFactory())-&gt;make($commentData1);&#x000A;    	$commentData2 = array(1, 'y', 'y', 'y', 'y');&#x000A;    	$comment2 = (new CommentFactory())-&gt;make($commentData2);&#x000A;    	$commentData3 = array(3, 'y', 'y', 'y', 'y');&#x000A;    	$comment3 = (new CommentFactory())-&gt;make($commentData3);&#x000A;    &#x000A;    	$repository-&gt;add(array($comment1, $comment2));&#x000A;    	$repository-&gt;add($comment3);&#x000A;    &#x000A;    	$this-&gt;assertEquals(array($comment1, $comment2), $repository-&gt;findByPostId(1));&#x000A;    	$this-&gt;assertEquals(array($comment3), $repository-&gt;findByPostId(3));&#x000A;    }</pre>
    <p>Adding a second assertion to obtain the third comment with the <code>findByPostID()</code> method reveals our mistake. Whenever you can easily test extra paths or cases, like in our case with a simple extra assertion, you should. These simple extra assertions or test methods can reveal hidden problems. Like in our case, <code>array_filter()</code> does not reindex the resulting array. And while we have an array with the correct elements, the indexes are messed up.</p>
    <pre>1) RepositoryTest::testItCanFindCommentsByBlogPostId&#x000A;    Failed asserting that two arrays are equal.&#x000A;    --- Expected&#x000A;    +++ Actual&#x000A;    @@ @@&#x000A;     Array (&#x000A;    -    0 =&gt; Comment Object (...)&#x000A;    +    2 =&gt; Comment Object (...)&#x000A;     )</pre>
    <p>Now, you may consider this a shortcoming of PHPUnit or a shortcoming of your business logic. I tend to be rigorous with array indexes because I burned my hands with them a few times. So we should consider the error a problem with our logic in the <code>CommentRepository</code>.</p>
    <pre>function findByPostId($postId) {&#x000A;    	return array_values(&#x000A;    		array_filter($this-&gt;findAll(), function ($comment) use ($postId) {&#x000A;    			return $comment-&gt;getPostId() == $postId;&#x000A;    		})&#x000A;    	);&#x000A;    }</pre>
    <p>Yep. That simple. We just run the result through <code>array_values()</code> before returning it. It will nicely reindex our array. Mission accomplished.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <p>And that’s mission accomplished for our Repository also. We have a class usable by any other business logic class which offers an easy way to persist and retrieve objects. It also decouples the business logic from the factories and data persistence gateways. It reduced logic duplication and significantly simplifies the persistence and retrieval operations for our comments.</p>
    <p>Remember, this design pattern can be used for all types of lists and as you start using it, you will see its usefulness. Basically, whenever you have to work with several objects of the same type, you should consider introducing a Repository for them. Repositories are specialized by object type and not general. So for a blog application, you may have distinct repositories for blog posts, for comments, for users, for user configurations, for themes, for designs, for or anything you may have multiple instances of.</p>
    <p>And before concluding this, a Repository may have its own list of objects and it may do a local caching of objects. If an object can not be found in the local list, we retrieve it from the persistence, otherwise we serve it from our list. If used with caching, a Repository can be successfully combined with the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Singleton Design Pattern.</a></p>
    <p>As usual, thank you for your time and I sincerely hope I taught you something new today.</p>
    </div>
]]>
</Body>
<Summary>The Repository Design Pattern, defined by Eric Evens in his Domain Driven Design book, is one of the most useful and most widely applicable design patterns ever invented. Any application has to...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/JlmKe3lcCIg/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38795/guest@my.umbc.edu/b4daa27dd1b3512a8fbc39974ffb20bb/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>repository-design-pattern</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, 25 Nov 2013 09:00:59 -0500</PostedAt>
<EditAt>Mon, 25 Nov 2013 09:00:59 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="122945" important="false" status="posted" url="https://my3.my.umbc.edu/posts/122945">
<Title>UMBC: Into Orbit</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <h2>Into Orbit</h2>
    <h3>A tiny satellite is a big new step in Earth science research at UMBC.</h3>
    <p>It may only be the size of a tall coffee mug, but the launch of Qubscout-S1 on November 21 at 2:10 a.m. represents a big leap forward for UMBC researchers who have long awaited the chance to put a satellite in space.</p>
    <p>Qubscout-1 was propelled into a low Earth orbit from a launch site in Yasny, Russia on a Dnepr LV rocket. The satellite was built as a joint venture between the university and Science and Technology Corporation (STC) � a small high-tech company based in Hampton, VA.  The satellite measures 2 inches x 2 inches by 4 inches � and it is designed to test a micro sun-sensor that can be used to find and point instruments toward the sun.</p>
    <p>UMBC students designed, constructed and tested the sun sensor, while STC built the satellite frame and provided funding for the project. Though the project has been in the works for almost three years, changes in attached payload availability kept the Qubscout-S1 out of orbit until now.</p>
    <p>�STC came to us with a launch opportunity in early September 2010 and asked if it was possible to put together a small satellite mission to test a sun-sensor,� says <strong>J. Vanderlei Martins</strong>, an associate professor of physics who is the principal investigator on the mission. �They needed it in about two months. Our students had already been working on small satellites, so we had the capability and know how. Nonetheless, putting something together this quickly has to be some kind of record.�</p>
    <p>After a few months in orbit, the satellite will unfold into a larger configuration to increase its drag and change its rotation rate. The team that built the Qubscout-S1 was able to make the project cost-effective by involving students in production and by building the satellite with materials already available on the market.</p>
    <p>�We have a very innovative design that uses commercial off-the shelf materials,� observes Martins.</p>
    <p>UMBC students will also stay involved in the project by checking the performance of the sensors installed on the Qubscout-S1, monitoring data transmitted from the satellite to radio receivers at the university.</p>
    <p>The satellite that went into orbit on November 21 also represents the fulfillment of the plan set out by the Joint Center for Earth Systems Technology (JCET), which operates in a cooperative agreement between UMBC and the NASA Goddard Space Flight Center (GSFC) at its founding in 1995.</p>
    <p>�With the launch of the Qubscout satellite, JCET has now achieved all of the original goals defined when JCET was established in 1995,� says <strong>Danita E. Eichenlaub</strong>, the administrative director of JCET. �The center congratulates <strong>Dr. Vanderlei Martins</strong> and his entire team on this accomplishment.�</p>
    <p>Adarsh Deepak, the president of STC, also hailed the launch of the Qubscout-1, observing that �this joint venture sets the stage for more exciting collaborations between STC and UMBC in the future.  It also shows how small companies, working with a university team, can be part of America�s space future.� </p>
    <p>(11/22/2013)</p>
    </div>
]]>
</Body>
<Summary>Into Orbit   A tiny satellite is a big new step in Earth science research at UMBC.   It may only be the size of a tall coffee mug, but the launch of Qubscout-S1 on November 21 at 2:10 a.m....</Summary>
<Website>https://umbc.edu/stories/umbc-into-orbit/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/122945/guest@my.umbc.edu/5167d73d6068db2f2048752902b55bae/api/pixel</TrackingUrl>
<Tag>window-stories</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>Mon, 25 Nov 2013 05:00:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="122944" important="false" status="posted" url="https://my3.my.umbc.edu/posts/122944">
<Title>UMBC: Looking Back On a Phenomenal Year for UMBC Soccer</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <img width="150" height="150" src="https://umbc.edu/wp-content/uploads/2022/02/win_womens_soccer_int1-150x150.jpg" alt="" style="max-width: 100%; height: auto;"><h2>Net Gains </h2>
    <h3>Looking Back On a Phenomenal Year for UMBC Soccer </h3>
    <p>An amazing season for both UMBC soccer squads finally came to a close in below-freezing temperatures at Retriever Soccer Park on November 24, 2013 when the men�s team � ranked at #5 in the nation � played a 2-2 see-saw second-round NCAA tournament game against the University of Connecticut that ended with the Retrievers bowing out of the tournament on penalty kicks. </p>
    <p>Both the men�s and women�s soccer teams had an incredible ride, however �breaking new ground for UMBC�s athletics program while proving that winners on the field can also excel in academics.</p>
    <p>The UMBC men�s squad won their NCAA bid � and the right to host the university�s first-ever home game in the tournament � with resounding 4-0 victory against the University of Hartford at Retriever Soccer Park on November 16, 2013. It was a campaign during which the Retriever men also won the America East regular season championship and compiled a 16-1-3 record overall. </p>
    <p>The Retriever women�s soccer team ended their season with a hard-fought 2-0 loss in the first round of the women�s NCAA to the fourth-ranked team in the nation � Virginia Tech � in Blacksburg, VA on November 15, 2013.</p>
    <p>The UMBC women�s appearance in the NCAA Tournament capped off a reversal of fortune that saw the squad improve from last place to first place in the America East conference, earning a 13-6-2 record, a regular season title and a conference tournament championship along the way.  The women�s team bested Stony Brook University 2-1 in the America East final at Retriever Soccer Park On November 9, 2013 to earn an automatic bid to the NCAA tournament. </p>
    <p>The success of the UMBC soccer program in 2013 has netted players and coaches numerous honors from the America East conference. Men�s head coach <strong>Pete Caringi, Jr.</strong> and his staff were voted by the league�s coaches as the Coaching Staff of the Year. Three of the team�s players also received the league�s highest honors, including senior forward <strong>Pete Caringi, III</strong> (Striker of the Year); senior midfielder <strong>Kadeem Dacres</strong> (Midfielder of the Year) and junior fullback <strong>Oumar Ballo</strong> (Defender of the Year). </p>
    <p>Women�s head coach <strong>Leslie Wray</strong> and her staff received the Coaching Staff of The Year award from the America East conference, while junior midfielder <strong>Jessy Brown</strong> shared Midfielder of the Year honors with Hartford University�s Stephanie Santos. (Brown was also names as the MVP of the America East tournament.)</p>
    <p>UMBC soccer players are not just making their mark on the field of play. Both the men�s and women�s teams at the university have matched their success between the lines with excellence in the classroom. In the last round of College Team Academic Awards given by the National College Coaches Association for the 2011-2012 seasons, UMBC was among only 150 schools where both the men�s and women�s teams received this academic honor for having team cumulative grade point averages at 3.0 or higher. </p>
    <p>And as the America East conference gave out its individual honors for competition, both women�s team standout Jessy Brown (who has a 3.70 GPA in biology) and junior midfielder <strong>Michael DiCesare</strong> (who scored the only goal in the November 6 win that clinched the men�s regular season title for UMBC) were also named to the America East�s All-Academic team. </p>
    <p>�Our campus takes pride in connecting athletics with the life and academic culture of the university,� says Freeman A. Hrabowski, III, president of UMBC. �The achievements of our women�s and men�s soccer teams this season demonstrate that the concept of a scholar-athlete is alive and well at UMBC.�  </p>
    <p>Retriever Fever is also catching on among students, alumni and other local college soccer fans. UMBC ranked 13th in attendance nationally among men�s soccer programs, and those numbers are up from 995 in 2012 to 1,228 per game in the current campaign.</p>
    <p>For more information on UMBC�s soccer program, visit <a href="http://www.umbcretrievers.com" rel="nofollow external" class="bo">www.umbcretrievers.com.</a></p>
    <p>(Updated 11/25/2013)</p>
    </div>
]]>
</Body>
<Summary>Net Gains    Looking Back On a Phenomenal Year for UMBC Soccer    An amazing season for both UMBC soccer squads finally came to a close in below-freezing temperatures at Retriever Soccer Park on...</Summary>
<Website>https://umbc.edu/stories/umbc-looking-back-on-a-phenomenal-year-for-umbc-soccer/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/122944/guest@my.umbc.edu/b7594be5719839cee963b54987e3a09e/api/pixel</TrackingUrl>
<Tag>window-stories</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>Mon, 25 Nov 2013 05:00:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38794" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38794">
<Title>The best free WordPress themes for November 2013</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2013/11/thumbnail28.jpg" width="200" height="160" style="max-width: 100%; height: auto;">WordPress, one of the most popular blogging and website platforms in the world, accounts for thousands of new blogs and websites every day.</p> <p>One of the best ways to get up and running quickly — especially if you don’t have much design or development experience — is to use a theme. And some of the very best themes out there are completely free!</p> <p>Every month we’ll be bringing you our pick of the best free WordPress themes released in the previous month. Here are our favorites for November:</p> <h1>DevDmBootstrap3</h1> <p>Unlike many themes which are designed for beginners, this theme with the funny name was created for developers. <a href="https://github.com/dannymachal/DevDmBootstrap3" rel="nofollow external" class="bo">DevDMBootstrap3</a> is for developers who are already familiar with Twitter Bootstrap and is a mobile-first theme. The sleek interface makes it easy to develop for the web even quicker.</p> <p><a href="https://github.com/dannymachal/DevDmBootstrap3" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/DavDm.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Fresh Lite</h1> <p>What’s nice about <a href="http://wordpress.org/themes/fresh-lite" rel="nofollow external" class="bo">Fresh Lite</a> is that this responsive theme works using drag and drop tools, making it very easy for beginner WordPress users. The simple theme includes a slider, sidebar and touch-friendly buttons as its top features.</p> <p><a href="http://wordpress.org/themes/fresh-lite" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/fresh-lite.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Fruitful</h1> <p><a href="http://themes.fruitfulcode.com/fruitful/" rel="nofollow external" class="bo">Fruitful</a> is a simple, responsive theme that is built with a lot of options for use. It’s easy to use and style, comes with plenty of options for logos, background images, menus, social icons and a slider. Plus this theme is WooCommerce-ready. You can also customize the CSS.</p> <p><a href="http://themes.fruitfulcode.com/fruitful/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/fruitful.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Clean Black</h1> <p>You get exactly what you expect with <a href="http://cwlk.org/clean-black-wordpress-theme/" rel="nofollow external" class="bo">Clean Black</a>, a dark minimalist theme. The simple theme includes search, a favicon option and number paging navigation. Clean Black is fully responsive.</p> <p><a href="http://cwlk.org/clean-black-wordpress-theme/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/clean-black.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Codium Grid</h1> <p><a href="http://codiumgrid.allolesparents.fr/" rel="nofollow external" class="bo">Codium Grid</a> is a fully responsive theme that features a super-clean look and feel. It is designed so that the user only has to think about content in the build process. It is customizable in terms of color, backgrounds and header and is widget-ready. (The Instagram widget is particularly nice.) This theme also has some great built-in search engine optimization tools to make getting online a breeze.</p> <p><a href="http://codiumgrid.allolesparents.fr/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/codium-grid.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Delighted</h1> <p><a href="http://themeshift.com/theme/delighted/" rel="nofollow external" class="bo">Delighted</a> is a highly customizable lightweight theme that’s made just for bloggers. One of the best options is the featured image option, which is available on main and single pages to add an element of sleekness to the overall design. Color and language options are endless with this theme.</p> <p><a href="http://themeshift.com/theme/delighted/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/delighted.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>GreenPage</h1> <p><a href="http://wpmole.com/greenpage" rel="nofollow external" class="bo">GreenPage</a> is a simple blogging theme with a sharp layered look. The theme has plenty of room for featured or thumbnail images, blog posts and sidebar and header navigation.</p> <p><a href="http://wpmole.com/greenpage" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/greenpage.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Aldehyde</h1> <p><a href="http://inkhive.com/product/aldehyde/" rel="nofollow external" class="bo">Aldehyde</a> is a minimally-designed theme with a great above-the-scroll slider to showcase images. The responsive theme also includes bonuses often found only in premium themes such as a parallax header, four different layout options, custom widgets and lots of theme options. Aldehyde also includes powerful social media tools for sharing and links, retina-ready icons and is SEO-ready.</p> <p><a href="http://inkhive.com/product/aldehyde/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/aldehyde.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Shopping</h1> <p>While there are not a large number of free e-commerce themes out there, <a href="http://themehall.com/shopping-ecommerce-wordpress-theme" rel="nofollow external" class="bo">Shopping</a> does offer some basic sales functionality in a free, WooCommerce-based theme. The simple theme includes plenty of room for product images, prices, ratings and sales information.</p> <p><a href="http://themehall.com/shopping-ecommerce-wordpress-theme" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/shopping.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Bearded</h1> <p><a href="http://bonfirelab.com/themes/bearded" rel="nofollow external" class="bo">This theme</a> takes the trendy “Movember” concept to another level, saying, “not just moustache.” The blogging and portfolio theme is designed in a flat style and includes plenty of neat animation tools and customization options. The responsive theme also supports the Custom Content Portfolio plugin.</p> <p><a href="http://bonfirelab.com/themes/bearded" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/bearded.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h2>Neutro</h2> <p><a href="http://seotemplates.net/blog/theme/neutro-wordpress-theme/" rel="nofollow external" class="bo">Neutro</a> is a responsive theme built in the super-trendy <a href="http://www.webdesignerdepot.com/2013/09/the-ultimate-guide-to-flat-design/" rel="nofollow external" class="bo">flat design</a> style. What makes this theme unique is that it includes a touch-ready content slider, which is perfect for mobile and tablet devices. Neutro is designed with photos in mind as well with a nice display space. You can customize the theme’s CSS and a variety of other features as well. </p> <p><a href="http://seotemplates.net/blog/theme/neutro-wordpress-theme/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/neutro.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>OneColumn</h1> <p>Simple and mobile-friendly are the key highlights of <a href="http://www.guidovanderleest.nl/onecolumn" rel="nofollow external" class="bo">OneColumn</a>. The basic theme includes some customization options but nothing fancy. As the name implies, it is designed with a single column for blogging and has room for images, search and recent posts. While this theme might not have enough goodies for more seasoned users, it is perfect for beginners.</p> <p><a href="http://www.guidovanderleest.nl/onecolumn" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/onecolumn.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>WP Jurist</h1> <p>While <a href="http://wpdevshed.com/themes/wp-jurist/" rel="nofollow external" class="bo">WP Jurist</a> is marketed to legal firms, this fully responsive theme could work for a variety of business types. The design is simple and bold. It includes a slider, widgets and a separate blog template with the option to add author bios. Plus, WP Jurist includes a large number of customization options to help make the theme your own.</p> <p><a href="http://wpdevshed.com/themes/wp-jurist/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/wp-jurist.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>ZeeMinty</h1> <p><a href="http://themezee.com/themes/zeeminty/" rel="nofollow external" class="bo">This</a> lightweight business-oriented theme features a large header image to attract users. The card-style theme is responsive and has plenty of room to customize it from color to type to different sidebar options.</p> <p><a href="http://themezee.com/themes/zeeminty/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/zeeMinty.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Hannari</h1> <p><a href="http://www.pwtthemes.com/theme/hannari-free-responsive-wordpress-theme" rel="nofollow external" class="bo">Hannari</a> is a simple business-oriented theme with a simple design and plenty of bonuses for a free theme. The responsive theme includes tools such as a site map, SEO optimization, a contact form and email newsletter integration. Hannari also includes social media widgets and a variety of customization options so that you can use the theme without worrying that your site will look too much like someone else’s.</p> <p><a href="http://www.pwtthemes.com/theme/hannari-free-responsive-wordpress-theme" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/hannari.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Writr</h1> <p>Look like a pro blogger with <a href="http://theme.wordpress.com/themes/writr/" rel="nofollow external" class="bo">Writr</a>, a responsive theme in the flat design style that is simply beautiful. The theme looks great on a variety of devices and has extras that are often only associated with premium themes. Some of the best bonuses are the custom header, background and gravatar options and post format icons. Writr also includes an infinite scroll, multiple column width options and different sidebar options. The theme is social-media ready as well (with another set of nifty icons) and includes six color palette options.</p> <p><a href="http://theme.wordpress.com/themes/writr/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/writr.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Hueman</h1> <p>If a magazine-style theme is your thing, <a href="http://alxmedia.se/themes/hueman/" rel="nofollow external" class="bo">Hueman</a> is a simple theme with a focus on strong visuals. The fully responsive design is modeled in the flat style and is set up for use with high resolution images. This theme makes for a great platform for storytelling or a portfolio.</p> <p><a href="http://alxmedia.se/themes/hueman/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/hueman.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Modern Real Estate</h1> <p><a href="http://slocumstudio.com/wordpress-themes/modern-estate-free/" rel="nofollow external" class="bo">Modern Real Estate</a> targets real-estate professionals with a plugin that allows for the addition of agent profiles, property listings and customer testimonials. The almost-flat responsive theme has a simple look but can be customized in a variety of ways.</p> <p><a href="http://slocumstudio.com/wordpress-themes/modern-estate-free/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/modern-estate.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>White Paper</h1> <p><a href="http://justpx.com/free-white-paper" rel="nofollow external" class="bo">White Paper</a> is a super-light blogging theme. The minimal design is designed to showcase simple text and photo content without a lot of bells and whistles. The theme is responsive and incredibly easy to use, making it a simple choice for first-time bloggers.</p> <p><a href="http://justpx.com/free-white-paper" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/white-paper.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Mountain Creek</h1> <p><a href="http://gorillathemes.com/mountain-creek-free-wordpress-theme/" rel="nofollow external" class="bo">This</a> simple dark theme is designed for showcasing photographs and slideshows. The responsive theme includes a nice sidebar option and plenty of social media icons and tools. The rustic background makes this a perfect fit for sites related to nature or the outdoors. The theme allows for customization as well and includes both Facebook and Twitter integration.</p> <p><a href="http://gorillathemes.com/mountain-creek-free-wordpress-theme/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/mountain-creek.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>ProMax</h1> <p>This responsive magazine-style theme includes a ton of widgets that make it easy to connect to social media. But the biggest bonus that comes with <a href="http://www.wrock.org/promax/" rel="nofollow external" class="bo">ProMax</a> is built-in connectivity to Google AdSense and placements for common advertising sizes. The ad-ready features are easy to use and great for a blogger looking to jump into the world of blog revenue generation. ProMax includes a variety of customization options as well, from color to background and customer header and favicon.</p> <p><a href="http://www.wrock.org/promax/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/promax.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>Time Turner</h1> <p><a href="http://timeturner.tomastoman.cz/" rel="nofollow external" class="bo">Time Turner</a> is designed for designers who still want to work in the skeuomorphic style. The theme features simple textures, shadows and design tricks throughout. The portfolio theme is responsive and offers plenty of great photo and image display spaces. It includes five color options, slider, calendar and search features.</p> <p><a href="http://timeturner.tomastoman.cz/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/time-turner.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>The Newswire</h1> <p>This fully responsive theme is designed for sites that have a focus on news-style content. One of the best features of <a href="http://wpdevshed.com/themes/the-newswire/" rel="nofollow external" class="bo">The Newswire</a> is the large slider. The theme also includes “sticky posts,” multiple navigation options and plenty of color and font customization.</p> <p><a href="http://wpdevshed.com/themes/the-newswire/" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/the-newswire.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <h1>WiziApp</h1> <p>While most of the WordPress themes featured here are for desktop devices or feature responsive templates, <a href="http://wordpress.org/themes/wiziapp-smooth-touch" rel="nofollow external" class="bo">WiziApp</a> is designed just for mobile devices. The theme has showcases an app experience for mobile web users and features touch controls for small screens with iPhone, Android and WP8 compatibility. The vertically-based theme includes space for a header image and single column of posts.</p> <p><a href="http://wordpress.org/themes/wiziapp-smooth-touch" rel="nofollow external" class="bo"><img src="http://netdna.webdesignerdepot.com/uploads/2013/11/wiziapp.jpg" width="650" alt="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"></a></p> <p> </p> <p><em><strong> Have you used any of these themes? Have we missed one of your favorites? 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/webtones.html?ref=inwidget" rel="nofollow external" class="bo"><strong>Webtones: 1,000 Multimedia Sound Effects Library – only $27!</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="The best free WordPress themes for November 2013" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2013/11/the-best-free-wordpress-themes-for-november-2013/" 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%2F2013%2F11%2Fthe-best-free-wordpress-themes-for-november-2013%2F&amp;t=The+best+free+WordPress+themes+for+November+2013" 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%2F2013%2F11%2Fthe-best-free-wordpress-themes-for-november-2013%2F&amp;t=The+best+free+WordPress+themes+for+November+2013" 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%2F2013%2F11%2Fthe-best-free-wordpress-themes-for-november-2013%2F&amp;t=The+best+free+WordPress+themes+for+November+2013" 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%2F2013%2F11%2Fthe-best-free-wordpress-themes-for-november-2013%2F&amp;t=The+best+free+WordPress+themes+for+November+2013" 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%2F2013%2F11%2Fthe-best-free-wordpress-themes-for-november-2013%2F&amp;t=The+best+free+WordPress+themes+for+November+2013" 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/180265033470/u/49/f/661066/c/35285/s/3410b4e7/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180265033470/u/49/f/661066/c/35285/s/3410b4e7/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>WordPress, one of the most popular blogging and website platforms in the world, accounts for thousands of new blogs and websites every day.   One of the best ways to get up and running quickly —...</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/3410b4e7/sc/4/l/0L0Swebdesignerdepot0N0C20A130C110Cthe0Ebest0Efree0Ewordpress0Ethemes0Efor0Enovember0E20A130C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38794/guest@my.umbc.edu/f584f7733ed341b7d6c1843efb67ee24/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>free-blog-templates</Tag>
<Tag>free-blog-themes</Tag>
<Tag>free-wordpress-templates</Tag>
<Tag>free-wordpress-themes</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>wordpress</Tag>
<Tag>wordpress-resources</Tag>
<Tag>wp-themes</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, 25 Nov 2013 03:15:44 -0500</PostedAt>
<EditAt>Mon, 25 Nov 2013 03:15:44 -0500</EditAt>
</NewsItem>

</News>
