<?xml version="1.0"?>
<News hasArchived="true" page="8697" pageCount="10720" pageSize="10" timestamp="Thu, 09 Jul 2026 06:39:58 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8697">
<NewsItem contentIssues="true" id="31843" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31843">
<Title>Congratulations to the Class of 2013!</Title>
<Body>
<![CDATA[
    <div class="html-content">It’s that time of year again…congratulations to the nearly 1,700 undergraduate and graduate students who are officially becoming UMBC alumni this week! A few Commencement-related items for all our newly-minted grads: Visit our New Grads Page to find out all … <a href="https://umbcalumni.wordpress.com/2013/05/22/congratulations-to-the-class-of-2013/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>It’s that time of year again…congratulations to the nearly 1,700 undergraduate and graduate students who are officially becoming UMBC alumni this week! A few Commencement-related items for all our...</Summary>
<Website>https://umbcalumni.wordpress.com/2013/05/22/congratulations-to-the-class-of-2013/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31843/guest@my.umbc.edu/bd6cb472604fdb232e0a8aefe94b3a3d/api/pixel</TrackingUrl>
<Tag>uncategorized</Tag>
<Group token="retired-20">UMBC Alumni</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-20</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/original.png?1280681147</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/large.png?1280681147</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/medium.png?1280681147</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/small.png?1280681147</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxsmall.png?1280681147</AvatarUrl>
<Sponsor>UMBC Alumni</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:59:31 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="106994" important="false" status="posted" url="https://my3.my.umbc.edu/posts/106994">
<Title>Congratulations to the Class of 2013!</Title>
<Body>
<![CDATA[
    <div class="html-content">It’s that time of year again…congratulations to the nearly 1,700 undergraduate and graduate students who are officially becoming UMBC alumni …</div>
]]>
</Body>
<Summary>It’s that time of year again…congratulations to the nearly 1,700 undergraduate and graduate students who are officially becoming UMBC alumni …</Summary>
<Website>https://magazine.umbc.edu/congratulations-to-the-class-of-2013/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/106994/guest@my.umbc.edu/22355bfd859bf3e099581f2deab1f4bd/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Group token="retired-1945">UMBC Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-1945</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1783534816</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/images/avatars/group/8/original.png?1783534816</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xxlarge.png?1783534816</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/images/avatars/group/8/xlarge.png?1783534816</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/images/avatars/group/8/large.png?1783534816</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/images/avatars/group/8/medium.png?1783534816</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/images/avatars/group/8/small.png?1783534816</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1783534816</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/images/avatars/group/8/xxsmall.png?1783534816</AvatarUrl>
<Sponsor>UMBC Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:59:31 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="30184" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30184">
<Title>AmeriCorps VISTA Position Opening!</Title>
<Tagline>GHCC/CEO - Community Robotics Coordinator</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <img style="max-width: 100%; height: auto;"><div><span><br></span></div>
    <div>
    <span>View the official listing here: </span><a href="https://my.americorps.gov/mp/listing/viewListing.do?id=49807" rel="nofollow external" class="bo">https://my.americorps.gov/mp/listing/viewListing.do?id=49807</a>
    </div>
    <div><br></div>
    <div><strong>Applications are due by May 31st! APPLY NOW!</strong></div>
    <div><br></div>
    <div><span>This position is sponsored by Greater Homewood Community Corporation (GHCC) in Baltimore, MD; and the VISTA member will serve with the Center for Educational Outreach (CEO)in Baltimore, MD. GHCC serves as the VISTA Project Sponsor to more than 20 nonprofit, government, and community organizations throughout Baltimore City and Maryland. Established in 1969 to help neighborhoods become safer, better places to live, GHCC's mission is to build and strengthen vibrant urban communities. GHCC will provide support to the Centerand the VISTA member throughout the year, including recruitment, training, professional development opportunities, and resources. The Center for Educational Outreach, a component of Johns Hopkins University’s Whiting School of Engineering, was established to increase the number of youth who pursue Science, Technology, Engineering and Math (STEM) education and careers, particularly women and underrepresented minorities.The goal of this VISTA project is to create a sustainable, replicable model for community-based robotics programs for Baltimore City school children who may not otherwise have the opportunity to engage in STEM enrichment programs.The pilot program will operate from the Barclay Recreational Center, which serves the Barclay Elementary/Middle School and surrounding Harwood neighborhood. Harwood is a predominantly low-income area, and approximately 85% of the students at the Barclay School are eligible for free or reduced meals. The US Department of Commerce reports that over the past 10 years, growth in STEM jobs was three time that of non-STEM jobs and STEM workers are less likely to experience joblessness. In addition, STEM workers earn 26% more than non-STEM workers. After-school STEM programs have been shown to increase STEM skills, interest in STEM careers as well as likelihood of graduation and pursuing STEM careers.</span></div>
    <div><span><br></span></div>
    <div>
    <strong>Member Duties :</strong><span> The Community Robotics Coordinator will develop and pilot a replicable community-based robotics program for Baltimore City school children who may not otherwise have the opportunity to engage in after-school Science, Technology, Engineering and Math (STEM) enrichment programs. The VISTA will: 1. Identify and build relationships with community partners that support the robotics program; 2. Conduct focus groups with community members and partners to develop a shared vision of the robotics program; 3. Implement robotics program and coordinate participation in 3 competitions during the school year plus an end of the year community showcase; 4. Create training manual and “how to” guide for future program directors; 5. Research potential funding streams and secure funding for at least a second year. Note: a valid driver's license is required and a car is highly recommended.</span>
    </div>
    </div>
]]>
</Body>
<Summary>View the official listing here: https://my.americorps.gov/mp/listing/viewListing.do?id=49807     Applications are due by May 31st! APPLY NOW!     This position is sponsored by Greater Homewood...</Summary>
<Website>https://my.americorps.gov/mp/listing/viewListing.do?id=49807</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30184/guest@my.umbc.edu/29a54eec91727e395bd7ad0221c29c73/api/pixel</TrackingUrl>
<Group token="shriver">The Shriver Center</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/shriver</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/xsmall.png?1441293069</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/original.jpg?1441293069</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/xxlarge.png?1441293069</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/xlarge.png?1441293069</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/large.png?1441293069</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/medium.png?1441293069</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/small.png?1441293069</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/xsmall.png?1441293069</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/008/0bfad113286cf6b1bc6dedbdbfc7e5ef/xxsmall.png?1441293069</AvatarUrl>
<Sponsor>Shriver Center:Intern, Co-op, Research &amp; Service-Learning</Sponsor>
<PawCount>3</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:54:24 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30193" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30193">
<Title>Bitcoin Hits the Big Time, to the Regret of Some Early Boosters</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The first major conference for the digital currency suggests it is gaining legitimacy, but in a manner disappointing to some early enthusiasts.</p>
    <p>This past Sunday, Doug Scribner took out five $100 bills and began feeding them into what looked like a small, white ATM in San Jose Conference Center in California. The machine swallowed the bills smartly and credited him with an equivalent value in bitcoins, an intangible, digital currency that is backed by not gold or any government, but by math.</p>
    </div>
]]>
</Body>
<Summary>The first major conference for the digital currency suggests it is gaining legitimacy, but in a manner disappointing to some early enthusiasts.  This past Sunday, Doug Scribner took out five $100...</Summary>
<Website>http://www.technologyreview.com/news/515061/bitcoin-hits-the-big-time-to-the-regret-of-some-early-boosters/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30193/guest@my.umbc.edu/caf64a6ae45390fc2b62b931bef7a165/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:30:26 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30189" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30189">
<Title>Digital Currency Bitcoin&lt;br&gt; Grows Up</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The first major conference for the digital currency suggests it is gaining legitimacy, but in a manner disappointing to some early enthusiasts.</p>
    <p>This past Sunday, Doug Scribner took out five $100 bills and began feeding them into what looked like a small, white ATM in San Jose Conference Center in California. The machine swallowed the bills smartly and credited him with an equivalent value in Bitcoins, an intangible, digital currency that is backed by not gold or any government, but by math.</p>
    </div>
]]>
</Body>
<Summary>The first major conference for the digital currency suggests it is gaining legitimacy, but in a manner disappointing to some early enthusiasts.  This past Sunday, Doug Scribner took out five $100...</Summary>
<Website>http://www.technologyreview.com/news/515061/digital-currency-bitcoin-grows-up/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30189/guest@my.umbc.edu/ad7deec1ba69f67090f7f8adb91de24f/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:30:26 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="29072" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29072">
<Title>Congratulations May 2013 Graduates!</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The CNMS Advising Staff would like to congratulate all of our May 2013 Graduates on their achievements! We wish you all the best in your future endeavors, and hope that you stay in touch with the UMBC community.</p>
    <p>Please be sure to take a few moments to let us know what your plans are by filling out the Career Services Center's <a href="https://www.surveymonkey.com/s/9ZR8VD5" rel="nofollow external" class="bo">Graduating Student Report</a> online. </p>
    <p>Some of you may be uncertain about what you are going to do next, or perhaps have a gap between now and the start of graduate or professional school that you'd like to fill with an experience that will be meaningful for your career. Remember that the Career Services Center provides <a href="http://www.careers.umbc.edu/alumni/index.php" rel="nofollow external" class="bo">continuing services for alumni</a> - many of which remain FREE during the first 3-12 months after you graduate!</p>
    </div>
]]>
</Body>
<Summary>The CNMS Advising Staff would like to congratulate all of our May 2013 Graduates on their achievements! We wish you all the best in your future endeavors, and hope that you stay in touch with the...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29072/guest@my.umbc.edu/e7604aa7b336c3a09640ae7005c49792/api/pixel</TrackingUrl>
<Tag>career-services</Tag>
<Tag>commencement</Tag>
<Group token="cnmsadvising">College of Natural and Mathematical Sciences Advising</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/cnmsadvising</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xsmall.png?1654873031</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/original.png?1654873031</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xxlarge.png?1654873031</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xlarge.png?1654873031</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/large.png?1654873031</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/medium.png?1654873031</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/small.png?1654873031</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xsmall.png?1654873031</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xxsmall.png?1654873031</AvatarUrl>
<Sponsor>College of Natural and Mathematical Sciences Advising</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/xxlarge.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/xlarge.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/large.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/medium.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/small.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/xsmall.jpg?1367868656</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/072/f6ec6017f81a1a735257468f5b31d02d/xxsmall.jpg?1367868656</ThumbnailUrl>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:28:20 -0400</PostedAt>
<EditAt>Wed, 22 May 2013 15:30:11 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="30183" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30183">
<Title>Logic in Media Queries</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Just in case you have brain farts about this constantly like I do.</p>
    <p></p>
    <h3>If</h3>
    <p>That's what media queries are: logical <code>if</code> statements. "If" these things are true about the browser, use the CSS inside.</p>
    <h3>And</h3>
    <p>The keyword <code>and</code>.</p>
    <pre><code>@media (min-width: 600px) and (max-width: 800px) {&#x000A;      html { background: red; }&#x000A;    }</code></pre>
    <h3>Or</h3>
    <p>Comma separate.</p>
    <pre><code>@media (max-width: 600px), (min-width: 800px) {&#x000A;      html { background: red; }&#x000A;    }</code></pre>
    <p>Technically these are treated like to separate media queries, but that is effectively and <code>or</code>.</p>
    <h3>Not</h3>
    <p>Reverse the logic with the keyword <code>not</code>.</p>
    <pre><code>@media not all and (max-width: 600px) {&#x000A;      html { background: red; }&#x000A;    }</code></pre>
    <p>Just doing <code>not (max-width: 600px)</code> doesn't seem to work for me, hence the slightly funky syntax above. Perhaps someone can explain that to me. Note that not only works for the current media query, so if you comma separate, it only affects the media query it is within. Also note that not reverses the logic for the entire media query as a whole, not individual parts of it. not x and y = not (x and y) ≠ (not x) and y</p>
    <h3>Exclusive</h3>
    <p>To ensure that only one media query is in effect at time, make the numbers (or whatever) such that that is possible. It may be easier to mentally manage them this way.</p>
    <pre><code>@media (max-width: 400px) {&#x000A;      html { background: red; }&#x000A;    }&#x000A;    @media (min-width: 401px) and (max-width: 800px) {&#x000A;      html { background: green; }&#x000A;    }&#x000A;    @media (min-width: 801px) {&#x000A;      html { background: blue; }&#x000A;    }</code></pre>
    <p>Logically this is a bit like a <code>switch</code> statement, only without a simple way to do "if none of these match do this" like <code>default</code>.</p>
    <h3>Overriding</h3>
    <p>There is nothing preventing more than one media query from being true at the same time. It may be more efficient to use this in some cases rather than making them all exclusive.</p>
    <pre><code>@media (min-width: 400px) {&#x000A;      html { background: red; }&#x000A;    }&#x000A;    @media (min-width: 600px) {&#x000A;      html { background: green; }&#x000A;    }&#x000A;    @media (min-width: 800px) {&#x000A;      html { background: blue; }&#x000A;    }</code></pre>
    <p>Media queries add no specificity to the selectors they contain, but source order still matters. The above will work because they are ordered correctly. Swap that order and at browser window widths above 800px the background would be red, perhaps unintuitively.</p>
    <h3>Mobile First</h3>
    <p>Your small screen styles are in your regular screen CSS and then as the screen gets larger you override what you need to. So, <code>min-width</code> media queries in general.</p>
    <pre><code>html { background: red; }&#x000A;    &#x000A;    @media (min-width: 600px) {&#x000A;      html { background: green; }&#x000A;    }</code></pre>
    <h3>Desktop First</h3>
    <p>Your large screen styles are in your regular screen CSS and then as the screen gets smaller you override what you need to. So, <code>max-width</code> media queries in general.</p>
    <pre><code>html { background: red; }&#x000A;    &#x000A;    @media (max-width: 600px) {&#x000A;      html { background: green; }&#x000A;    }</code></pre>
    <h3>Gettin Wacky</h3>
    <p>You can be as complex as you want with this.</p>
    <pre><code>@media &#x000A;      only screen and (min-width: 100px),&#x000A;      not all and (min-width: 100px),&#x000A;      not print and (min-height: 100px),&#x000A;      (color),&#x000A;      (min-height: 100px) and (max-height: 1000px),&#x000A;      handheld and (orientation: landscape)&#x000A;    {&#x000A;      html { background: red; }&#x000A;    }</code></pre>
    <p>Note the <code>only</code> keyword was intended to prevent non-media-query supporting browsers to not load the stylesheet or use the styles. Not sure how useful that ever was / still is.</p>
    <hr>
    
    <p><strong>Need a new look for your portfolio? Check out the <a href="http://thethemefoundry.com/wordpress/snap/?utm_campaign=css_tricks_snap" rel="nofollow external" class="bo">Snap WordPress theme</a> from The Theme Foundry. Sass files and Compass config are included!</strong></p>
    
    <hr>
    
    <p><small><a href="http://css-tricks.com/logic-in-media-queries/" rel="nofollow external" class="bo">Logic in Media Queries</a> is a post from <a href="http://css-tricks.com" rel="nofollow external" class="bo">CSS-Tricks</a></small></p>
    </div>
]]>
</Body>
<Summary>Just in case you have brain farts about this constantly like I do.     If   That's what media queries are: logical if statements. "If" these things are true about the browser, use the CSS inside....</Summary>
<Website>http://css-tricks.com/logic-in-media-queries/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30183/guest@my.umbc.edu/f47c999adbdd1bf475714c0cf6206498/api/pixel</TrackingUrl>
<Tag>article</Tag>
<Tag>css</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tricks</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 15:06:15 -0400</PostedAt>
<EditAt>Wed, 22 May 2013 15:06:15 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="30180" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30180">
<Title>Tool Kit: Swindles and Spam, Lurking in Your Search Results</Title>
<Body>
<![CDATA[
    <div class="html-content">A little caution when using a search engine can help you steer clear of fraudulent merchandise and keep out of the clutches of spammers.<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F05%2F23%2Ftechnology%2Fpersonaltech%2Fhow-to-detect-swindles-and-spam-lurking-in-your-search-results.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tool+Kit%3A+Swindles+and+Spam%2C+Lurking+in+Your+Search+Results" 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%2F05%2F23%2Ftechnology%2Fpersonaltech%2Fhow-to-detect-swindles-and-spam-lurking-in-your-search-results.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tool+Kit%3A+Swindles+and+Spam%2C+Lurking+in+Your+Search+Results" 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%2F05%2F23%2Ftechnology%2Fpersonaltech%2Fhow-to-detect-swindles-and-spam-lurking-in-your-search-results.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tool+Kit%3A+Swindles+and+Spam%2C+Lurking+in+Your+Search+Results" 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%2F05%2F23%2Ftechnology%2Fpersonaltech%2Fhow-to-detect-swindles-and-spam-lurking-in-your-search-results.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tool+Kit%3A+Swindles+and+Spam%2C+Lurking+in+Your+Search+Results" 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%2F05%2F23%2Ftechnology%2Fpersonaltech%2Fhow-to-detect-swindles-and-spam-lurking-in-your-search-results.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tool+Kit%3A+Swindles+and+Spam%2C+Lurking+in+Your+Search+Results" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>A little caution when using a search engine can help you steer clear of fraudulent merchandise and keep out of the clutches of spammers.     </Summary>
<Website>http://www.nytimes.com/2013/05/23/technology/personaltech/how-to-detect-swindles-and-spam-lurking-in-your-search-results.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30180/guest@my.umbc.edu/48ad6272f04a730e18b9a485910ee7b0/api/pixel</TrackingUrl>
<Tag>cisco-systems-inc-csco-nasdaq</Tag>
<Tag>computer-security</Tag>
<Tag>computers-and-the-internet</Tag>
<Tag>google-inc-goog-nasdaq</Tag>
<Tag>new</Tag>
<Tag>search-engines</Tag>
<Tag>spam-electronic</Tag>
<Tag>technology</Tag>
<Tag>yahoo-inc-yhoo-nasdaq</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>Wed, 22 May 2013 13:38:14 -0400</PostedAt>
<EditAt>Wed, 22 May 2013 13:38:14 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="110154" important="false" status="posted" url="https://my3.my.umbc.edu/posts/110154">
<Title>Sunil Dasgupta, Political Science, in the Gazette</Title>
<Body>
<![CDATA[
    <div class="html-content">“The lesson we’ve learned over these last 10, 15 years is no matter how good your [crisis management] plan is, it’s always going to fall short,” says Sunil Dasgupta in today’s Gazette. Dasgupta, director of UMBC’s political science program at the Universities at Shady Grove (USG) and non-resident Senior Fellow at the Brookings Institution, is co-teaching a crisis management class at USG. The point of the course, he explains, is not to prepare for specific disasters, but to get students thinking about how to build resilience and make decisions in catastrophic situations that they cannot fully plan for or predict. …</div>
]]>
</Body>
<Summary>“The lesson we’ve learned over these last 10, 15 years is no matter how good your [crisis management] plan is, it’s always going to fall short,” says Sunil Dasgupta in today’s Gazette. Dasgupta,...</Summary>
<Website>https://news.umbc.edu/sunil-dasgupta-political-science-in-the-gazette/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/110154/guest@my.umbc.edu/5eb7ad14ac489573d934d4de356d6a80/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Group token="umbc-news">UMBC News</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/original.png?1632921809</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/large.png?1632921809</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/medium.png?1632921809</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/small.png?1632921809</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxsmall.png?1632921809</AvatarUrl>
<Sponsor>UMBC News</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 13:38:06 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="30187" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30187">
<Title>Laravel 4: A Start at a RESTful API (Updated)</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=29785&amp;c=1535581393" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=29785&amp;c=1535581393" alt="" style="max-width: 100%; height: auto;"></a><p>RESTful API's are hard! There are a lot of aspects to designing and writing a successful one. For instance, some of the topics that you may find yourself handling include authentication, hypermedia/HATEOS, versioning, rate limits, and content negotiation. Rather than tackling all of these concepts, however, let's instead focus on the basics of REST. We'll make some JSON endpoints behind a basic authentication system, and learn a few Laravel 4 tricks in the process.</p>
    <p></p>
    <hr>
    <h2>The App</h2>
    <p>Let's build an API for a simple Read-It-Later app. Users will be able to create, read, update and delete URLs that they wish to read later.<br> Ready to dive in and get started?</p>
    <h3>Install Laravel 4</h3>
    <p>Create a new <a href="http://four.laravel.com/#install-laravel" title="install laravel" rel="nofollow external" class="bo">install of Laravel 4</a>. If you're handy with CLI, try this <a href="http://fideloper.com/laravel-4-uber-quick-start-with-auth-guide?utm_source=nettuts&amp;utm_medium=article&amp;utm_content=api&amp;utm_campaign=guest_author" title="laravel quick start" rel="nofollow external" class="bo">quickstart guide</a>. Otherwise, we have a <a href="http://net.tutsplus.com/tutorials/php/how-to-setup-laravel-4/" title="install laravel video" rel="nofollow external" class="bo">video tutorial here on Nettuts+</a> that covers the process.</p>
    <p>We're going to first create an encryption key for secure password hashing. You can do this easily by running this command from your project root:</p>
    <pre>$ php artisan key:generate&#x000A;    </pre>
    <p>Alternatively, you can simple edit your <code>app/config/app.php</code> encryption key:</p>
    <pre>/*&#x000A;    |--------------------------------------------------------------------------&#x000A;    | Encryption Key&#x000A;    |--------------------------------------------------------------------------&#x000A;    |&#x000A;    | This key is used by the Illuminate encrypter service and should be set&#x000A;    | to a random, long string, otherwise these encrypted values will not&#x000A;    | be safe. Make sure to change it before deploying any application!&#x000A;    |&#x000A;    */&#x000A;    &#x000A;    'key' =&gt; md5('this is one way to get an encryption key set'),&#x000A;    </pre>
    <h3>Database</h3>
    <p>Once you have a working install of Laravel 4, we can get started with the fun. We'll begin by creating the app's database.</p>
    <p>This will only require two database tables:</p>
    <ol>
    <li>
    <strong>Users</strong>, including a username and password</li>
    <li>
    <strong>URLs</strong>, including a url and description</li>
    </ol>
    <p>We'll use Laravel's <a href="http://four.laravel.com/docs/migrations" title="create Laravel migrations" rel="nofollow external" class="bo">migrations</a> to create and populate the database.</p>
    <h3>Configure Your Database</h3>
    <p>Edit <code>app/config/database.php</code> and fill it with your database settings. Note: this means creating a database for this application to use. This article assumes a MySQL database.</p>
    <pre>'connections' =&gt; array(&#x000A;    &#x000A;        'mysql' =&gt; array(&#x000A;            'driver'    =&gt; 'mysql',&#x000A;            'host'      =&gt; 'localhost',&#x000A;            'database'  =&gt; 'read_it_later',&#x000A;            'username'  =&gt; 'your_username',&#x000A;            'password'  =&gt; 'your_password',&#x000A;            'charset'   =&gt; 'utf8',&#x000A;            'collation' =&gt; 'utf8_unicode_ci',&#x000A;            'prefix'    =&gt; '',&#x000A;        ),&#x000A;    ),&#x000A;    </pre>
    <h3>Create Migration Files</h3>
    <pre>$ php artisan migrate:make create_users_table --table=users --create&#x000A;    $ php artisan migrate:make create_urls_table --table=urls --create&#x000A;    </pre>
    <p>These commands set up the basic migration scripts that we'll be using to create the database tables. Our job now is to fill them with the correct table columns.</p>
    <p>Edit <code>app/database/migrations/SOME_DATE_create_users_table.php</code> and add to the <code>up()</code> method:</p>
    <pre>public function up()&#x000A;    {&#x000A;        Schema::create('users', function(Blueprint $table)&#x000A;        {&#x000A;            $table-&gt;increments('id');&#x000A;            $table-&gt;string('username')-&gt;unique();&#x000A;            $table-&gt;string('password');&#x000A;            $table-&gt;timestamps();&#x000A;        });&#x000A;    }&#x000A;    </pre>
    <p>Above, we're setting a username (which should be unique), a password, as well as the timestamps. Save that, and now edit <code>app/database/migrations/SOME_DATE_create_urls_table.php</code>, and add to the <code>up()</code> method:</p>
    <pre>public function up()&#x000A;    {&#x000A;        Schema::create('urls', function(Blueprint $table)&#x000A;        {&#x000A;            $table-&gt;increments('id');&#x000A;            $table-&gt;integer('user_id');&#x000A;            $table-&gt;string('url');&#x000A;            $table-&gt;string('description');&#x000A;            $table-&gt;timestamps();&#x000A;        });&#x000A;    }&#x000A;    </pre>
    <p>The only important note in this snippet is that we're creating a link between the <code>url</code> and <code>users</code> table, via the <code>user_id</code> field.</p>
    <h3>Add Sample Users</h3>
    <p>We can use Laravel's <a href="http://four.laravel.com/docs/migrations#database-seeding" title="laravel seed database" rel="nofollow external" class="bo">seeds</a> to create a few sample users.</p>
    <p>Create a file within the <code>app/database/seeds</code> folder that has the same name as the table that it corresponds to; in our case, <code>UserTableSeeder.php</code>. Add:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    class UserTableSeeder extends Seeder {&#x000A;    &#x000A;        public function run()&#x000A;        {&#x000A;            DB::table('users')-&gt;delete();&#x000A;    &#x000A;            User::create(array(&#x000A;                'username' =&gt; 'firstuser',&#x000A;                'password' =&gt; Hash::make('first_password')&#x000A;            ));&#x000A;    &#x000A;            User::create(array(&#x000A;                'username' =&gt; 'seconduser',&#x000A;                'password' =&gt; Hash::make('second_password')&#x000A;            ));&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>Next, make sure that seeder class gets run when the database is seeded. Edit <code>app/database/seeds/DatabaseSeeder.php</code>:</p>
    <pre>public function run()&#x000A;    {&#x000A;        Eloquent::unguard();&#x000A;    &#x000A;        // Add or Uncomment this line&#x000A;        $this-&gt;call('UserTableSeeder');&#x000A;    }&#x000A;    </pre>
    <h3>Run the Migrations</h3>
    <p>Here’s how to create those two tables, and insert our sample users.</p>
    <pre>// Create the two tables&#x000A;    $ php artisan migrate&#x000A;    &#x000A;    // Create the sample users&#x000A;    $ php artisan db:seed&#x000A;    </pre>
    <hr>
    <h2>Models</h2>
    <p>Laravel 4 continues to use the excellent Eloquent ORM. This will make the process of handling database calls a snap. We'll require one model per table.</p>
    <p>Luckily, Laravel comes with a User model setup, so let's create a model for our urls table.</p>
    <p>Create and edit file <code>app/models/Url.php</code>.</p>
    <pre>&lt;?php&#x000A;    &#x000A;    class Url extends Eloquent {&#x000A;    &#x000A;        protected $table = 'urls';&#x000A;    &#x000A;    }&#x000A;    </pre>
    <hr>
    <h2>Authentication</h2>
    <p>Laravel's <a href="http://four.laravel.com/docs/routing#route-filters" title="laravel filters" rel="nofollow external" class="bo">filters</a> can handle authentication for us. In particular, Laravel now comes with a Basic Authentication filter, which we can use as a quick authentication model to be used with our API requests.</p>
    <p>If you open <code>app/filters.php</code>, you'll see what it looks like:</p>
    <pre>Route::filter('auth.basic', function()&#x000A;    {&#x000A;        return Auth::basic();&#x000A;    });&#x000A;    </pre>
    <p>We just need to make one adjustment. By default, this filter looks for an "email" field to identify the user. Since we're using usernames instead of emails, we just need to adjust that preference. Change the <code>Auth::basic()</code> call by giving it our username field as a parameter:</p>
    <pre>Route::filter('auth.basic', function()&#x000A;    {&#x000A;        return Auth::basic("username");&#x000A;    });&#x000A;    </pre>
    <h3>Routes</h3>
    <p>Let's test this out. Create a route, called <code>testauth</code>, and make sure that our <code>auth.basic</code> filter runs before it.</p>
    <p>Edit <code>app/routes.php</code>:</p>
    <pre>Route::get('/authtest', array('before' =&gt; 'auth.basic', function()&#x000A;    {&#x000A;        return View::make('hello');&#x000A;    }));&#x000A;    </pre>
    <p>We can test this with a curl request. From your terminal, try pointing to your build of Laravel. In mine, it looks like this (Your URL will likely be different!):</p>
    <pre>$ curl -i localhost/l4api/public/index.php/authtest&#x000A;    HTTP/1.1 401 Unauthorized&#x000A;    Date: Tue, 21 May 2013 18:47:59 GMT&#x000A;    WWW-Authenticate: Basic&#x000A;    Vary: Accept-Encoding&#x000A;    Content-Type: text/html; charset=UTF-8&#x000A;    &#x000A;    Invalid credentials&#x000A;    </pre>
    <p>As you can see, an unauthorized request is detected and a "Invalid Credentials" message is returned with a 401 status code. Next, try including basic authentication.</p>
    <pre>$ curl --user firstuser:first_password localhost/l4api/public/index.php/authtest&#x000A;    HTTP/1.1 200 OK&#x000A;    Date: Tue, 21 May 2013 18:50:51 GMT&#x000A;    Vary: Accept-Encoding&#x000A;    Content-Type: text/html; charset=UTF-8&#x000A;    &#x000A;    &lt;h1&gt;Hello World!&lt;/h1&gt;&#x000A;    </pre>
    <p>It worked!</p>
    <p>At this point, the baseline work of our API is done. We have:</p>
    <ul>
    <li>Installed Laravel 4</li>
    <li>Created our database</li>
    <li>Created our models</li>
    <li>Created an authentication model</li>
    </ul>
    <hr>
    <h2>Creating Functional Requests</h2>
    <p>You may be familiar with Laravel's <a href="http://four.laravel.com/docs/controllers#restful-controllers" title="laravel restful controller" rel="nofollow external" class="bo">RESTful controllers</a>. They still exist in Laravel 4; however, we can also use Laravel's <a href="http://four.laravel.com/docs/controllers#resource-controllers" title="laravel resourceful controller" rel="nofollow external" class="bo">Resourceful Controllers</a>, which set up some paradigms that we can use to make a consistent API interface. We'll be using a Resourceful controller.</p>
    <blockquote><p><a href="http://four.laravel.com/docs/controllers#resource-controllers" rel="nofollow external" class="bo">Here's a breakdown</a> of what each method in the resourceful controller will handle. Please note that you can remove the /resource/create and /resource/{id}/edit routes, since we won't be needing to show 'create' or 'edit' forms in an API.</p></blockquote>
    <h3>Create a Resourceful Controller</h3>
    <pre>$ php artisan controller:make UrlController&#x000A;    </pre>
    <p>Next, setup a route to use the controller, and require each route to be authenticated.</p>
    <p>Edit <code>app/routes.php</code> and add:</p>
    <pre>// Route group for API versioning&#x000A;    Route::group(array('prefix' =&gt; 'api/v1', 'before' =&gt; 'auth.basic'), function()&#x000A;    {&#x000A;        Route::resource('url', 'UrlController');&#x000A;    });&#x000A;    </pre>
    <p>A few things are happening there.</p>
    <ol>
    <li>This is going to respond to requests made to <code><a href="http://example.com/api/v1/url">http://example.com/api/v1/url</a></code>.</li>
    <li>This allows us to add extra routes, if we need to expand our API. For instance, if you add a user end-point, such as <code>/api/v1/user</code>.</li>
    <li>There is also a naming mechanism in place for versioning our API. This gives us the opportunity to roll out new API versions without breaking older versions – We can simply create a <strong>v2</strong> route group, and point it to a new controller!</li>
    </ol>
    <p>Note: You may want to consider more advanced API versioning techniques, such as using an <code>Accept</code> header or subdomain which can help you point different API versions separate code bases.</p>
    <h3>Add the Functionality</h3>
    <p>Edit the new <code>app/controllers/UrlController.php</code> file:</p>
    <pre>// Edit this:&#x000A;    public function index()&#x000A;    {&#x000A;        return 'Hello, API';&#x000A;    }&#x000A;    </pre>
    <p>Let’s test it:</p>
    <pre>$ curl -i localhost/l4api/public/index.php/api/v1/url&#x000A;    HTTP/1.1 401 Unauthorized&#x000A;    Date: Tue, 21 May 2013 19:02:59 GMT&#x000A;    WWW-Authenticate: Basic&#x000A;    Vary: Accept-Encoding&#x000A;    Content-Type: text/html; charset=UTF-8&#x000A;    &#x000A;    Invalid credentials.&#x000A;    &#x000A;    $ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url&#x000A;    HTTP/1.1 200 OK&#x000A;    Date: Tue, 21 May 2013 19:04:19 GMT&#x000A;    Vary: Accept-Encoding&#x000A;    Content-Type: text/html; charset=UTF-8&#x000A;    &#x000A;    Hello, API&#x000A;    </pre>
    <p>We now have a resourceful controller with authentication working, and are ready to add functionality.</p>
    <h3>Create a URL</h3>
    <p>Edit <code>app/controllers/UrlController.php</code>:</p>
    <pre>/**&#x000A;     * Store a newly created resource in storage.&#x000A;     *&#x000A;     * @return Response&#x000A;     */&#x000A;    public function store()&#x000A;    {&#x000A;        $url = new Url;&#x000A;        $url-&gt;url = Request::get('url');&#x000A;        $url-&gt;description = Request::get('description');&#x000A;        $url-&gt;user_id = Auth::user()-&gt;id;&#x000A;    &#x000A;        // Validation and Filtering is sorely needed!!&#x000A;        // Seriously, I'm a bad person for leaving that out.&#x000A;    &#x000A;        $url-&gt;save();&#x000A;    &#x000A;        return Response::json(array(&#x000A;            'error' =&gt; false,&#x000A;            'urls' =&gt; $urls-&gt;toArray()),&#x000A;            200&#x000A;        );&#x000A;    }&#x000A;    </pre>
    <p>It's time to test this with another curl request. This one will send a POST request, which will correspond to the <code>store()</code> method created above.</p>
    <pre>$ curl -i --user firstuser:first_password -d 'url=<a href="http://google.com&amp;description=A">http://google.com&amp;description=A</a> Search Engine' localhost/l4api/public/index.php/api/v1/url&#x000A;    HTTP/1.1 201 Created&#x000A;    Date: Tue, 21 May 2013 19:10:52 GMT&#x000A;    Content-Type: application/json&#x000A;    &#x000A;    {"error":false,"message":"URL created"}&#x000A;    </pre>
    <p>Cool! Let's create a few more, for both of our users.</p>
    <pre>$ curl --user firstuser:first_password -d 'url=<a href="http://fideloper.com&amp;description=A">http://fideloper.com&amp;description=A</a> Great Blog' localhost/l4api/public/index.php/api/v1/url&#x000A;    &#x000A;    $ curl --user seconduser:second_password -d 'url=<a href="http://digitalsurgeons.com&amp;description=A">http://digitalsurgeons.com&amp;description=A</a> Marketing Agency' localhost/l4api/public/index.php/api/v1/url&#x000A;    &#x000A;    $ curl --user seconduser:second_password -d 'url=<a href="http://www.poppstrong.com/&amp;description=I">http://www.poppstrong.com/&amp;description=I</a> feel for him' localhost/l4api/public/index.php/api/v1/url&#x000A;    </pre>
    <p>Next, let's create methods for retrieving URLs.</p>
    <pre>/**&#x000A;     * Display a listing of the resource.&#x000A;     *&#x000A;     * @return Response&#x000A;     */&#x000A;    public function index()&#x000A;    {&#x000A;        //Formerly: return 'Hello, API';&#x000A;    &#x000A;        $urls = Url::where('user_id', Auth::user()-&gt;id)-&gt;get();&#x000A;    &#x000A;        return Response::json(array(&#x000A;            'error' =&gt; false,&#x000A;            'urls' =&gt; $urls-&gt;toArray()),&#x000A;            200&#x000A;        );&#x000A;    }&#x000A;    &#x000A;    /**&#x000A;     * Display the specified resource.&#x000A;     *&#x000A;     * @param  int  $id&#x000A;     * @return Response&#x000A;     */&#x000A;    public function show($id)&#x000A;    {&#x000A;        // Make sure current user owns the requested resource&#x000A;        $url = Url::where('user_id', Auth::user()-&gt;id)&#x000A;                -&gt;where('id', $id)&#x000A;                -&gt;take(1)&#x000A;                -&gt;get();&#x000A;    &#x000A;        return Response::json(array(&#x000A;            'error' =&gt; false,&#x000A;            'urls' =&gt; $url-&gt;toArray()),&#x000A;            200&#x000A;        );&#x000A;    }&#x000A;    </pre>
    <p>Let's test them out:</p>
    <pre>$ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url&#x000A;    {&#x000A;        "error": false,&#x000A;        "urls": [&#x000A;           {&#x000A;                "created_at": "2013-02-01 02:39:10",&#x000A;                "description": "A Search Engine",&#x000A;                "id": "2",&#x000A;                "updated_at": "2013-02-01 02:39:10",&#x000A;                "url": "<a href="http://google.com">http://google.com</a>",&#x000A;                "user_id": "1"&#x000A;            },&#x000A;            {&#x000A;                "created_at": "2013-02-01 02:44:34",&#x000A;                "description": "A Great Blog",&#x000A;                "id": "3",&#x000A;                "updated_at": "2013-02-01 02:44:34",&#x000A;                "url": "<a href="http://fideloper.com">http://fideloper.com</a>",&#x000A;                "user_id": "1"&#x000A;            }&#x000A;        ]&#x000A;    }&#x000A;    &#x000A;    $ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url/1&#x000A;    {&#x000A;        "error": false,&#x000A;        "urls": [&#x000A;            {&#x000A;                "created_at": "2013-02-01 02:39:10",&#x000A;                "description": "A Search Engine",&#x000A;                "id": "2",&#x000A;                "updated_at": "2013-02-01 02:39:10",&#x000A;                "url": "<a href="http://google.com">http://google.com</a>",&#x000A;                "user_id": "1"&#x000A;            }&#x000A;        ]&#x000A;    }&#x000A;    </pre>
    <p>Almost done. Let's now allow users to delete a url.</p>
    <pre>/**&#x000A;     * Remove the specified resource from storage.&#x000A;     *&#x000A;     * @param  int  $id&#x000A;     * @return Response&#x000A;     */&#x000A;    public function destroy($id)&#x000A;    {&#x000A;        $url = Url::where('user_id', Auth::user()-&gt;id)-&gt;find($id);&#x000A;    &#x000A;        $url-&gt;delete();&#x000A;    &#x000A;        return Response::json(array(&#x000A;            'error' =&gt; false,&#x000A;            'message' =&gt; 'url deleted'),&#x000A;            200&#x000A;            );&#x000A;    }&#x000A;    </pre>
    <p>Now, we can delete a URL by using a DELETE request:</p>
    <pre>$ curl -i -X DELETE --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url/1&#x000A;    HTTP/1.1 200 OK&#x000A;    Date: Tue, 21 May 2013 19:24:19 GMT&#x000A;    Content-Type: application/json&#x000A;    &#x000A;    {"error":false,"message":"url deleted"}&#x000A;    </pre>
    <p>Lastly, let's allow users to update a url.</p>
    <pre>/**&#x000A;     * Update the specified resource in storage.&#x000A;     *&#x000A;     * @param  int  $id&#x000A;     * @return Response&#x000A;     */&#x000A;    public function update($id)&#x000A;    {&#x000A;        $url = Url::where('user_id', Auth::user()-&gt;id)-&gt;find($id);&#x000A;    &#x000A;        if ( Request::get('url') )&#x000A;        {&#x000A;            $url-&gt;url = Request::get('url');&#x000A;        }&#x000A;    &#x000A;        if ( Request::get('description') )&#x000A;        {&#x000A;            $url-&gt;description = Request::get('description');&#x000A;        }&#x000A;    &#x000A;        $url-&gt;save();&#x000A;    &#x000A;        return Response::json(array(&#x000A;            'error' =&gt; false,&#x000A;            'message' =&gt; 'url updated'),&#x000A;            200&#x000A;        );&#x000A;    }&#x000A;    </pre>
    <p>To test URL updates, run:</p>
    <pre>$ curl -i -X PUT --user seconduser:second_password -d 'url=<a href="http://yahoo.com">http://yahoo.com</a>' localhost/l4api/public/index.php/api/v1/url/4&#x000A;    HTTP/1.1 200 OK&#x000A;    Date: Tue, 21 May 2013 19:34:21 GMT&#x000A;    Content-Type: application/json&#x000A;    &#x000A;    {"error":false,"message":"url updated"}&#x000A;    &#x000A;    // View our changes&#x000A;    $ curl --user seconduser:second_password localhost/l4api/public/index.php/api/v1/url/4&#x000A;    {&#x000A;        "error": false,&#x000A;        "urls": [&#x000A;            {&#x000A;                "created_at": "2013-02-01 02:44:34",&#x000A;                "description": "I feel for him",&#x000A;                "id": "3",&#x000A;                "updated_at": "2013-02-02 18:44:18",&#x000A;                "url": "<a href="http://yahoo.com">http://yahoo.com</a>",&#x000A;                "user_id": "1"&#x000A;            }&#x000A;        ]&#x000A;    }&#x000A;    </pre>
    <hr>
    <h2>And That’s It</h2>
    <p>We now have the beginnings of a fully-functioning API. I hope that you've learned a lot about how to get an API underway with Laravel 4.</p>
    <p>To recap, we achieved the following in this lesson:</p>
    <ol>
    <li>Install Laravel</li>
    <li>Create the database, using migrations and seeding</li>
    <li>Use Eloquent ORM models</li>
    <li>Authenticate with Basic Auth</li>
    <li>Set up Routes, including versioning the API</li>
    <li>Create the API functionality using Resourceful Controllers</li>
    </ol>
    <h3>The Next Steps</h3>
    <p>If you’d like to push your API up a notch, you might consider any of the following as a next step.</p>
    <ol>
    <li>Validation (Hint: Laravel has a <a href="http://four.laravel.com/docs/validation" rel="nofollow external" class="bo">Validation library</a>).</li>
    <li>API-request error handling – It's still possible to receive HTML response on API requests (Hint: <a href="http://fideloper.com/laravel4-error-handling" title="laravel error handling" rel="nofollow external" class="bo">Laravel Error Handling</a>, plus Content Negotiation.)</li>
    <li>Content Negotiation – listening for the Accept header. (Hint: <a href="http://four.laravel.com/docs/requests#request-information" title="Laravel request class" rel="nofollow external" class="bo">Laravel's Request Class</a> will give you the request headers).</li>
    <li>Check out the <a href="http://groups.google.com/group/api-craft/" rel="nofollow external" class="bo">API Craft Google Group</a>
    </li>
    <li>Learn about the <a href="http://fideloper.com/quick-caching-explanation?utm_source=nettuts&amp;utm_medium=article&amp;utm_content=api&amp;utm_campaign=guest_author" title="http cache" rel="nofollow external" class="bo">different types caching</a> and how Validation Caching can improve your API</li>
    <li><a href="leanpub.com/laravel-testing-decoded" rel="nofollow external" class="bo">Unit test your code</a></li>
    <li>Check out <a href="http://apigee.com/about/api-best-practices" rel="nofollow external" class="bo">Apigee's great API resources</a>
    </li>
    </ol>
    </div>
]]>
</Body>
<Summary>RESTful API's are hard! There are a lot of aspects to designing and writing a successful one. For instance, some of the topics that you may find yourself handling include authentication,...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/iseZmkJPwRw/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30187/guest@my.umbc.edu/66758d3fa814da7b65bef50634d05454/api/pixel</TrackingUrl>
<Tag>api</Tag>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>laravel</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>rest</Tag>
<Tag>sql</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 22 May 2013 12:00:07 -0400</PostedAt>
<EditAt>Wed, 22 May 2013 12:00:07 -0400</EditAt>
</NewsItem>

</News>
