<?xml version="1.0"?>
<News hasArchived="true" page="8951" pageCount="10800" pageSize="10" timestamp="Wed, 09 Sep 2026 11:37:34 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=recent&amp;page=8951">
<NewsItem contentIssues="false" id="27464" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27464">
<Title>IEEE Student Branch Executive Board Elections 4/19</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="ieee" height="249" src="http://www.csee.umbc.edu/wp-content/uploads/2013/04/ieee.png" width="700" style="max-width: 100%; height: auto;"></p>
    <p>The elections for both the IEEE Undergraduate Student Branch and IEEE Graduate Student Branch Executive Boards have been scheduled for Friday, April 19th, 4.00pm to 5.00pm, room TBA. This is our regular meeting time. Below you will find more information on the election process, including the procedure to run for an Officer position.</p>
    <p>IEEE Undergraduate Student Branch Officer positions include the following.</p>
    <ul>
    <li>Chair: Will be responsible for leading the IEEE Undergraduate Student Branch overall. S/he will also be responsible for representing the IEEE USB in General Body meetings and Executive Board meetings, and delegating responsibilities for various task. Events and activities must be approved by the Chair before sent to committees and funds must be approved before being forwarded to the Treasurer.</li>
    <li>Vice-Chair: Will be responsible for assisting the Chair in leading the IEEE USB and helping to run the branch smoothly. If the Chair is not present, the VP will take upon her/his responsibilities.</li>
    <li>Secretary: Will be responsible for taking minutes at meetings, keeping track of undergraduate student attendance and reporting the activities to the branch. S/he will be the point person for external relationships.</li>
    <li>Treasurer: Will manage the accounts and funds for the IEEE USB. S/he’ll be responsible for attending the SGA treasurer training session, and working with the Executive Board to generate a budget plan.</li>
    <li>Member At Large: Will support the other executive board members by facilitating their responsibilities as well as managing member recruitment/retention, managing fundraising activities in cooperation with the Treasurer and developing and managing projects.</li>
    </ul>
    <p>IEEE Graduate Student Branch Officer positions include the following.</p>
    <ul>
    <li>Chair: Will be responsible for leading the IEEE Graduate Student Branch overall. S/he will also be responsible for representing the GSO in the GSA Senate meetings and external events. Funds must be approved by the Chair before being forwarded to the Treasurer.</li>
    <li>Vice-Chair: Will be responsible for assisting the Chair in leading the IEEE GSB and helping her/him to run the branch smoothly.</li>
    <li>General Secretary: Will be responsible for reporting the activities to the IEEE SB GSA. S/he will be the point person for external relationships.</li>
    <li>Treasurer: Will manage the accounts and funds for the IEEE GSB. S/he’ll be responsible for the annual budget report along with the payments.</li>
    </ul>
    <p>To run for one of the above positions you must be a grad/undergrad student in good academic status, be subscribed to our mailing list, and send me (Sorry, you need javascript to view this email address. ) a small description (no more than 100 words) about you and why should other members vote for you, no later than next Thursday, April 11th, by 12.00pm (noon). You can only run for one position.</p>
    <p>These descriptions will be compiled and sent out to the entire mailing list no later than the following Friday, April 12th. Each candidate will be given two minutes during that Friday's meeting to make a brief speech.</p>
    <p>The election process will be supervised by our advisor, Dr. Choa.</p>
    <p>IMPORTANT</p>
    <ul>
    <li>if you win, you MUST be an official IEEE member or become one within a week after the election date.</li>
    <li>to vote, you must present your UMBC ID and the email that you used to subscribe to our mailing list.</li>
    </ul>
    <p>Please come and vote on the 19th to ensure that your voice is heard, and consider running for one of the positions. If you have any concerns or questions about the election process, please let Jorge Teixeira (Sorry, you need javascript to view this email address. ) know ASAP.</p>
    <p>On behalf of the UMBC IEEE GSB and UMBC IEEE USB Executive Boards,</p>
    <p>UMBC IEEE Student Branch, Chair<br>
    	Jorge Teixeira</p>
    </div>
]]>
</Body>
<Summary>The elections for both the IEEE Undergraduate Student Branch and IEEE Graduate Student Branch Executive Boards have been scheduled for Friday, April 19th, 4.00pm to 5.00pm, room TBA. This is our...</Summary>
<Website>http://www.csee.umbc.edu/2013/04/ieee-student-branch-executive-board-elections/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27464/guest@my.umbc.edu/ee460be4c33f4e88542d9c4ff8fb0042/api/pixel</TrackingUrl>
<Tag>computer-engineering</Tag>
<Tag>electrical-engineering</Tag>
<Tag>graduate</Tag>
<Tag>ieee</Tag>
<Tag>news</Tag>
<Tag>students</Tag>
<Tag>undergraduate</Tag>
<Group token="csee">Computer Science and Electrical Engineering</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/csee</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xsmall.png?1314043393</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/original.png?1314043393</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xxlarge.png?1314043393</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xlarge.png?1314043393</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/large.png?1314043393</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/medium.png?1314043393</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/small.png?1314043393</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xsmall.png?1314043393</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xxsmall.png?1314043393</AvatarUrl>
<Sponsor>Computer Science and Electrical Engineering</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 09 Apr 2013 20:49:43 -0400</PostedAt>
<EditAt>Tue, 09 Apr 2013 20:49:43 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="123374" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123374">
<Title>George La Noue, Public Policy/Political Science, in the Washington Times</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="/wp-content/uploads/2013/01/george-lanoue.jpg" rel="nofollow external" class="bo"><img alt="George LaNoue" src="/wp-content/uploads/2013/01/george-lanoue.jpg" width="189" height="126" style="max-width: 100%; height: auto;"></a>A new <a href="http://www.washingtontimes.com/news/2013/apr/9/causing-discrimination-rather-than-ending-it/?page=all#pagebreak" rel="nofollow external" class="bo"><em>Washington Times</em> </a>commentary critiquing government contracting programs for minority- and women-owned firms references testimony by UMBC professor <a href="http://www.umbc.edu/posi/glanoue.php" rel="nofollow external" class="bo">George La Noue </a>on why federal contacting preferences should be reexamined. La Noue is an expert on education policy, constitutional law and policy, and public procurement policy, and is a frequent witness in Congressional testimony.</p>
    </div>
]]>
</Body>
<Summary>A new Washington Times commentary critiquing government contracting programs for minority- and women-owned firms references testimony by UMBC professor George La Noue on why federal contacting...</Summary>
<Website>https://umbc.edu/stories/george-la-noue-public-policypolitical-science-in-the-washington-times/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123374/guest@my.umbc.edu/d44bef89e846ba1bbd1ecfd5f6f17f67/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Tag>publicpolicy</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>Tue, 09 Apr 2013 20:44:02 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123375" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123375">
<Title>Nicole Else-Quest, Psychology, in the Huffington Post</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="http://www.huffingtonpost.com/nicole-elsequest" rel="nofollow external" class="bo">Nicole Else-Quest</a>, assistant professor of psychology, is the author of an April 9 post in the “Huffington Post” blog entitled “<a href="http://www.huffingtonpost.com/nicole-elsequest/women-stem-education_b_3045387.html?utm_hp_ref=science" rel="nofollow external" class="bo">Contextualizing the Conversation on Women and STEM</a>.”</p>
    <p>Else-Quest is the lead author of a recent study that found that female students perform as well as males in STEM classrooms, but report less confidence about their abilities.  It also found that Asian American students outperform other ethnic groups.</p>
    <p>In her piece for the Huffington Post, she argued that “the national conversation about women and STEM cannot progress until it considers gender within the context of other social identity variables, such as ethnicity, class, and immigration.”</p>
    <p>“We don’t think of ourselves as only having gender or only having race. We think of ourselves as multifaceted and complex individuals – because we are multifaceted and complex individuals,” she writes.</p>
    </div>
]]>
</Body>
<Summary>Nicole Else-Quest, assistant professor of psychology, is the author of an April 9 post in the “Huffington Post” blog entitled “Contextualizing the Conversation on Women and STEM.”   Else-Quest is...</Summary>
<Website>https://umbc.edu/stories/nicole-else-quest-psychology-in-the-huffington-post/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123375/guest@my.umbc.edu/6025d6d15feebf2f914ea57b08add6d8/api/pixel</TrackingUrl>
<Tag>policy-and-society</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>Tue, 09 Apr 2013 20:26:21 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="123376" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123376">
<Title>Career Q&amp;A: Teacher &amp; Poet Jackie Regales &#8217;00, AmSt</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <img width="148" height="150" src="https://umbc.edu/wp-content/uploads/2013/04/jackie-regales_hed-148x150.jpg" alt="" style="max-width: 100%; height: auto;"><p><em><a href="/wp-content/uploads/2013/04/jackie-regales_hed.jpg" rel="nofollow external" class="bo"><img alt="jackie-regales_hed" src="/wp-content/uploads/2013/04/jackie-regales_hed.jpg" width="148" height="187" style="max-width: 100%; height: auto;"></a>Every so often, we’ll chat with an alum about what they do and how they got there. Today, in honor of National Poetry Month, we’re talking with English teacher and poet <strong>Jackie (Vreatt) Regales ’00</strong>, American studies, who spends much of the day sharing her love of the written word with the next generation…</em></p>
    <p><strong>Name:</strong> <em>Jackie (Vreatt) Regales ’00</em>, American studies<br>
    <strong>Job:</strong> English teacher at Roland Park Country School<br>
    <strong>Website:</strong> <a href="jackieregales.com" rel="nofollow external" class="bo">A Patchwork Life</a>: Writing, Teaching, and Piecing it all Together</p>
    <p><strong>Q:</strong>  <em>Tell us a little about why you decided to get into education.</em></p>
    <p><strong>A:</strong>  My mother taught high school for 38 years (I even had her for AP U.S. History!), and I always said I wouldn’t go into teaching because I saw how hard she worked, and how difficult her job really was. But then as a senior [at UMBC], I had the chance to be a teaching assistant for <strong>Dr. Pat McDermott</strong>, who is now a Vice Provost, but was then in the American Studies department. I led a few discussions and activities in her class that semester, and it was such an amazing experience that I knew I had to follow this path further. I went to graduate school on a teaching assistantship, and knew for certain that teaching was the right career for me.</p>
    <p><strong>Q: </strong> <em>What do you love most about teaching? What do you find most challenging?</em></p>
    <p><strong>A:</strong>  The best moments in my job are when I get to see students fall in love with a book, a book that either changes how they see the world or makes them feel less alone in the world, books like <em>The Great Gatsby</em> or <em>The Catcher in the Rye</em>, both of which I disliked when I first read them, but now adore after getting to teach them. I also feel so fulfilled when a student who previously didn’t like reading or felt like a terrible writer makes leaps and bounds of progress and feels so much more skilled and confident at the end of the year.</p>
    <p>What do I find challenging about teaching? Personally, I find that teaching is the kind of job that can suck up every possible minute you let it; there’s always grading to do, or lessons that could be better, new books to consider or research that promises to finally help kids understand grammar better. I know we get the summers off, which I definitely value, but most teachers I know are working way more than forty hours a week during the school year, and many spend summer hours trying to develop themselves more as professionals.</p>
    <p>Another challenge is how invested we come to feel in the lives of our students and families, and how vulnerable that makes us. Every teacher has a story about the kid they couldn’t reach or save, the family that broke apart in violent ways and the girl or boy caught in the middle, the realization that we can’t make a kid hear something they aren’t ready to understand yet about themselves. High school kids can really break your heart, and each year, we open ourselves up to a new wave of them!</p>
    <p><strong>Q: </strong> <em>You’ve even come back to teach at UMBC, right? What did you teach, and how did it feel to be teaching at your alma mater?</em></p>
    <p><strong>A:</strong>  I did! After I earned my master’s degree, I was doing some adjunct teaching when <strong>Jason Loviglio</strong> offered me a few classes in the newly developing <a href="http://mcs.umbc.edu/" rel="nofollow external" class="bo">Media and Communication Studies</a> program. I taught a 300-level elective on “Facebook Culture,” as well as a 300-level course for students in the major, and assisted <strong>Donald Snyder</strong> with the capstone research seminar. This was a wonderful opportunity for me, and certainly the best adjunct experience I ever had! As far as teaching at my alma mater, I loved it; intellectually, it was exciting to have the freedom to develop these courses, and Jason and Donald were welcoming and supportive mentor figures. I definitely put some pressure on myself to succeed so that Jason’s faith in me would be rewarded, because he was an influential professor for me as a student as well.</p>
    <p><strong>Q: </strong> <em>You’re also a poet. How do you keep yourself going, creatively, and how do you instill the love of poetry in your students?</em></p>
    <p><strong>A: </strong> One of my assets as a writer has been surrounding myself with encouraging resources. My husband has always my biggest fan, and I’m also lucky to have<strong> Seth Sawyers ’99</strong>, history, a writer friend in my life I can ask for feedback; we actually met when we were both tutors at the Writing Center at UMBC. As far as keeping going creatively, the wisest decision I made was to let go of any pretenses about what I needed in order to write: a room of my own, uninterrupted spans of time, the structure of a formal writing program, unlimited childcare, a personal chef or housekeeper, etc. I would still love to have some or all of those things at some point in my life, but what I realized is that I don’t need them—what I need is to write, to make some space in my life whenever possible to get the words down onto the page. Writing is part of how I process the world, and is integrally part of how I approach my life. Therefore, postponing writing until I had more time, money, peace, whatever was never really an option, so I learned how to weave it through my life as best I could.</p>
    <p>One of my favorite ways to help my students love poetry is to encourage them to simply stay open to it; so many students (and adults!) see poetry as this mysterious and indecipherable code that makes them feel stupid or ignorant. During National Poetry Month, I give my students extra credit for public poetry projects on campus; they choose poems, I approve them, and then they do something public to introduce that poem to our community. This year I’ve got students eager to read poems with first-graders, make bulletin board displays of Russian poetry and decorate our campus bathrooms with Maya Angelou’s “Phenomenal Woman” to help encourage self-esteem in their classmates. Explicating poetry is a valuable skill, but I also want to surprise students into finding something valuable and beautiful in poetry without necessarily understanding anaphora or trochaic tetrameter.</p>
    <p><strong>Q:</strong>  <em>Tell us about some of your writing projects!</em></p>
    <p><strong>A:</strong>  Right now, I’m part of an exciting project involving found poetry, which is basically the literary equivalent of a collage, taking words and phrases from existing texts and using them to form and inspire new pieces of writing. I’m one of 85 participating poets in the <a href="http://www.pulitzerremix.com/titles/elbow-room/april-9-why-i-like-country-music/" rel="nofollow external" class="bo">Pulitzer Remix project</a>, sponsored by The Found Poetry Review. Each poet was assigned a book that has won the Pulitzer Prize for literature, and each day during National Poetry Month, we are writing/posting poems we created from the text of our prize winner. By the end of the project, we will have created over 2500 found poems! I have participated in poetry month challenges for the past few years, writing a new poem each day in April based on various prompts, but this has been a big leap of faith for me, and it’s been invigorating and inspiring to challenge myself in this way.</p>
    <p><strong>Q:</strong> <em>In honor of National Poetry Month, what poet/poem would you like to share with your UMBC alumni friends, and why?</em></p>
    <p><strong>A: </strong> One of my favorite poets is Pablo Neruda; his work is clear, simple, powerful and beautiful, rich with metaphors and similes, with such range and passion that it’s difficult to resist. He was a deeply political poet in many ways, and wrote movingly about the landscape of his native Chile, but it’s his love poetry that really makes me swoon. Try “I can write the saddest verses,” “I like it when you’re quiet,” or my absolute favorite, “I don’t love you as if you were a rose” and see if you don’t get a little smitten with Neruda too.</p>
    </div>
]]>
</Body>
<Summary>Every so often, we’ll chat with an alum about what they do and how they got there. Today, in honor of National Poetry Month, we’re talking with English teacher and poet Jackie (Vreatt) Regales...</Summary>
<Website>https://umbc.edu/stories/career-qa-teacher-poet-jackie-regales-00-amst/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123376/guest@my.umbc.edu/7eac443f02a7e7b7239e4ec72a5789a1/api/pixel</TrackingUrl>
<Tag>alumni</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>Tue, 09 Apr 2013 18:16:58 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27463" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27463">
<Title>Aspect-Oriented Programming in PHP with Go!</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31046&amp;c=896243875" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31046&amp;c=896243875" alt="" style="max-width: 100%; height: auto;"></a><p>The concept of Aspect-Oriented Programming (AOP) is fairly new to PHP. There’s currently no official AOP support in PHP, but there are some extensions and libraries which implement this feature. In this lesson, we’ll use the <a href="https://github.com/lisachenko/go-aop-php" rel="nofollow external" class="bo">Go! PHP library</a> to learn AOP in PHP, and review when it can be helpful.</p>
    <p></p>
    <hr>
    <h2>A Brief History of AOP</h2>
    <blockquote><p>Aspect-Oriented programming is like a new gadget for geeks.</p></blockquote>
    <p>The term Aspect-Oriented Programming took shape in the mid-1990s, inside a small group at Xerox Palo Alto Research Center (PARC). AOP was considered controversial in its early days — as is the case with any new and interesting technology — mostly due to its lack of clear definition. The group made the conscious decision to release it in a half-baked form, in order to let the larger community provide feedback. At the heart of the problem was the “Separation of Concerns” concept. AOP was one possible solution to separate concerns.</p>
    <p>AOP matured in the late 1990s, when Xerox released AspectJ, and IBM followed suit with their Hyper/J in 2001. Today, AOP is a well-established technology that has been adopted by most common programming languages.</p>
    <hr>
    <h2>The Basic Vocabulary</h2>
    <p>At the heart of AOP is the aspect, but before we can define “aspect,” we must discuss two other terms: <strong>point-cut</strong> and <strong>advise</strong>.  A point-cut represents a moment in our source code, specifying the right moment to run our code. The code that executes at a point-cut is called, advise, and the combination of one or more point-cuts and advises is the <strong>aspect</strong>.</p>
    <p>Typically, each class has one core behavior or concern, but in many situations, a class may exhibit secondary behavior. For example, a class may need to call a logger or notify an observer. Because these functionalities are secondary, their behavior is mostly the same for all the classes that exhibit them. This scenario is called a <strong>cross-concern</strong>; these can be avoided by using AOP.</p>
    <hr>
    <h2>The Various AOP Tools for PHP</h2>
    <p>Chris Peters <a href="http://net.tutsplus.com/tutorials/php/aspect-oriented-programming-in-php/" rel="nofollow external" class="bo">already discussed the Flow</a> framework for AOP in PHP. Another AOP implementation can be found in the <a href="http://rad-dev.org/lithium" rel="nofollow external" class="bo">Lithium</a> framework.</p>
    <p>Another framework took a different approach, and created a complete PHP extension in C/C++, performing its magic on the same level as the PHP interpreter. It is called the <a href="https://github.com/AOP-PHP/AOP" rel="nofollow external" class="bo">AOP PHP Extension</a>, and I may discuss it in a future article.</p>
    <p>But as I noted earlier, for this tutorial, we’ll review the <a href="https://github.com/lisachenko/go-aop-php" rel="nofollow external" class="bo">Go! AOP-PHP</a> library.</p>
    <hr>
    <h2>Installing and Preparing Go!</h2>
    <p>The Go! library is not an extension; it’s completely written in PHP for PHP 5.4 and higher. Being just a plain PHP library allows for easy deployment, even in restrictive, shared-hosting environments that do not allow you to compile and install your own PHP extensions.</p>
    <h3>Install Go! with Composer</h3>
    <p><a href="http://net.tutsplus.com/tutorials/php/easy-package-management-with-composer/" rel="nofollow external" class="bo">Composer</a> is the preferred method for installing PHP packages. If you do not have access to Composer, you can always download it from the <a href="https://github.com/lisachenko/go-aop-php" rel="nofollow external" class="bo">Go! GitHub repository</a>.</p>
    <p>First, add the following lines to your <code>composer.json</code> file.</p>
    <pre>{&#x000A;        "require": {&#x000A;            "lisachenko/go-aop-php": "*"&#x000A;        }&#x000A;    }</pre>
    <p>Next, use Composer to install <code>go-aop-php</code>. Run the following command from a terminal:</p>
    <pre>$ cd /your/project/folder&#x000A;    $ php composer.phar update lisachenko/go-aop-php</pre>
    <p>Composer will install the required packages and dependencies in just a few seconds. If successful, you should see something similar to the following output:</p>
    <pre>Loading composer repositories with package information&#x000A;    Updating dependencies&#x000A;      - Installing doctrine/common (2.3.0)&#x000A;        Downloading: 100%&#x000A;    &#x000A;      - Installing andrewsville/php-token-reflection (1.3.1)&#x000A;        Downloading: 100%&#x000A;    &#x000A;      - Installing lisachenko/go-aop-php (0.1.1)&#x000A;        Downloading: 100%&#x000A;    &#x000A;    Writing lock file&#x000A;    Generating autoload files</pre>
    <p>After the installation has completed, you will find a directory, called <code>vendor</code>, in your <code>source</code> folder. The Go! library and its dependencies are installed there.</p>
    <pre>$ ls -l ./vendor&#x000A;    total 20&#x000A;    drwxr-xr-x 3 csaba csaba 4096 Feb  2 12:16 andrewsville&#x000A;    -rw-r--r-- 1 csaba csaba  182 Feb  2 12:18 autoload.php&#x000A;    drwxr-xr-x 2 csaba csaba 4096 Feb  2 12:16 composer&#x000A;    drwxr-xr-x 3 csaba csaba 4096 Feb  2 12:16 doctrine&#x000A;    drwxr-xr-x 3 csaba csaba 4096 Feb  2 12:16 lisachenko&#x000A;    &#x000A;    $ ls -l ./vendor/lisachenko/&#x000A;    total 4&#x000A;    drwxr-xr-x 5 csaba csaba 4096 Feb  2 12:16 go-aop-php&#x000A;    </pre>
    <h3>Integrate Go! Into Our Project</h3>
    <p>We need to create a call that sits between the routing/entry point of our application. The autoloader then automatically includes the class. Go! refers to this as an <strong>Aspect Kernel</strong>.</p>
    <pre>use Go\Core\AspectKernel;&#x000A;    use Go\Core\AspectContainer;&#x000A;    &#x000A;    class ApplicationAspectKernel extends AspectKernel {&#x000A;    &#x000A;    	protected function configureAop(AspectContainer $container) {&#x000A;    &#x000A;    	}&#x000A;    &#x000A;    	protected function getApplicationLoaderPath() {&#x000A;    &#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <blockquote><p>Today, AOP is a well-established technology that has been adopted by most common programming languages.</p></blockquote>
    <p>For this example, I’ve created a directory, called <code>Application</code>, and added a new class file, <code>ApplicationAspectKernel.php</code> within it.</p>
    <p>Our aspect kernel extends Go!’s abstract <code>AspectKernel</code> class, which provides the basic functionality that the aspect kernel requires to do its job. There are two methods we must implement: <code>configureAop()</code>, which registers our future aspects, and <code>getApplicationLoaderPath()</code>, which provides a string representing the full path to the application’s autoloader.</p>
    <p>For now, simply create an empty <code>autoload.php</code> file in your <code>Application</code> directory, and change the <code>getApplicationLoaderPath()</code> method, accordingly.</p>
    <pre>// [...]&#x000A;    class ApplicationAspectKernel extends AspectKernel {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	protected function getApplicationLoaderPath() {&#x000A;    		return __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Don’t worry about <code>autoload.php</code> just yet; we’ll fill in the missing pieces shortly.</p>
    <p>When I first installed Go! and reached this point of my process, I felt the need to run some code. So let’s begin building a small application!</p>
    <hr>
    <h2>Creating A Simple Logger</h2>
    <p>Our aspect will be a simple logger, but we first need some code to watch before we start with the main portion of our application.</p>
    <h3>Create A Minimal Application</h3>
    <p>Our small application will be an electronic broker, capable of buying and selling shares.</p>
    <pre>class Broker {&#x000A;    &#x000A;    	private $name;&#x000A;    	private $id;&#x000A;    &#x000A;    	function __construct($name, $id) {&#x000A;    		$this-&gt;name = $name;&#x000A;    		$this-&gt;id = $id;&#x000A;    	}&#x000A;    &#x000A;    	function buy($symbol, $volume, $price) {&#x000A;    		return $volume * $price;&#x000A;    	}&#x000A;    &#x000A;    	function sell($symbol, $volume, $price) {&#x000A;    		return $volume * $price;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>This code is quite simple. The <code>Broker</code> class has two private fields that store the broker’s name and ID.</p>
    <p>This class also offers two methods, <code>buy()</code> and <code>sell()</code> for buying and selling shares, respectively. Each of these methods accepts three arguments: the share’s symbol, the number of shares, and the price per share. The <code>sell()</code> method sells the shares and then calculates the total money received. Conversely, the <code>buy()</code> method buys the shares and calculates the total money spent.</p>
    <h3>Exercise Our Broker</h3>
    <p>We can easily exercise our <code>Broker</code> by writing a PHPUnit test. Create a directory, called <code>Test</code> inside the <code>Application</code> directory, and, within it, add a new file, <code>BrokerTest.php</code>. Append the following code to that file:</p>
    <pre>require_once '../Broker.php';&#x000A;    &#x000A;    class BrokerTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testBrokerCanBuyShares() {&#x000A;    		$broker = new Broker('John', '1');&#x000A;    		$this-&gt;assertEquals(500, $broker-&gt;buy('GOOGL', 100, 5));&#x000A;    	}&#x000A;    &#x000A;    	function testBrokerCanSellShares() {&#x000A;    		$broker = new Broker('John', '1');&#x000A;    		$this-&gt;assertEquals(500, $broker-&gt;sell('YAHOO', 50, 10));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>This test simply checks the return values of the broker’s methods. We can run this test and see that our code is at least syntactically correct.</p>
    <h3>Add an Auto Loader</h3>
    <p>Let’s create an autoloader that physically loads the classes that our application needs. This will be a simple loader, based on the <a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md" rel="nofollow external" class="bo">PSR-0 autoloader</a>.</p>
    <pre>ini_set('display_errors', true);&#x000A;    &#x000A;    spl_autoload_register(function($originalClassName) {&#x000A;        $className = ltrim($originalClassName, '\\');&#x000A;        $fileName  = '';&#x000A;        $namespace = '';&#x000A;        if ($lastNsPos = strripos($className, '\\')) {&#x000A;            $namespace = substr($className, 0, $lastNsPos);&#x000A;            $className = substr($className, $lastNsPos + 1);&#x000A;            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;&#x000A;        }&#x000A;        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';&#x000A;    &#x000A;        $resolvedFileName = stream_resolve_include_path($fileName);&#x000A;        if ($resolvedFileName) {&#x000A;            require_once $resolvedFileName;&#x000A;        }&#x000A;        return (bool) $resolvedFileName;&#x000A;    });</pre>
    <p>That’s all we need for the <code>autoload.php</code> file. Now, change <code>BrokerTest.php</code> to require the autoloader instead of <code>Broker.php</code> class.</p>
    <pre>require_once '../autoload.php';&#x000A;    &#x000A;    class BrokerTest extends PHPUnit_Framework_TestCase {&#x000A;    	// [...]&#x000A;    }</pre>
    <p>Running <code>BrokerTest</code> proves that the code still works.</p>
    <h3>Connecting to Application Aspect Kernel</h3>
    <p>Our final step is to configure Go!. We need to connect all the components so that they work in harmony. First, create a file, called <code>AspectKernelLoader.php</code>, and add the following code:</p>
    <pre>include __DIR__ . '/../vendor/lisachenko/go-aop-php/src/Go/Core/AspectKernel.php';&#x000A;    include 'ApplicationAspectKernel.php';&#x000A;    &#x000A;    ApplicationAspectKernel::getInstance()-&gt;init(array(&#x000A;        'autoload' =&gt; array(&#x000A;            'Go'               =&gt; realpath(__DIR__ . '/../vendor/lisachenko/go-aop-php/src/'),&#x000A;            'TokenReflection'  =&gt; realpath(__DIR__ . '/../vendor/andrewsville/php-token-reflection/'),&#x000A;            'Doctrine\\Common' =&gt; realpath(__DIR__ . '/../vendor/doctrine/common/lib/')&#x000A;        ),&#x000A;        'appDir' =&gt; __DIR__ . '/../Application',&#x000A;        'cacheDir' =&gt; null,&#x000A;        'includePaths' =&gt; array(),&#x000A;        'debug' =&gt; true&#x000A;    ));</pre>
    <blockquote><p>We need to connect all the components so that they work in harmony.</p></blockquote>
    <p>This file sits between the front controller and the autoloader. It uses the AOP infrastructure to initialize and call the <code>autoload.php</code> when needed.</p>
    <p>In the first line, we explicitly include <code>AspectKernel.php</code> and <code>ApplicationAspectKernel.php</code>. These files must be explicitly included, because, remember, we have no autoloader at this point.</p>
    <p>In the following code segment, we call the <code>init()</code> method on the <code>ApplicationAspectKernel</code> object and pass it an array of options:</p>
    <ul>
    <li>
    <strong><code>autoload</code></strong> defines the paths to initialize for the AOP library. Adjust the paths according to your directory structure.</li>
    <li>
    <strong><code>appDir</code></strong> refers to the application’s directory.</li>
    <li>
    <strong><code>cacheDir</code></strong> specifies a <code>cache</code> directory (we’ll ignore this for this tutorial).</li>
    <li>
    <strong><code>includePaths</code></strong> represents a filter for the aspects. We want all the specified directories to be watched, so leave this array empty to watch everything.</li>
    <li>
    <strong><code>debug</code></strong> provides extra debugging information, which is useful for development, but you should set it to <code>false</code> for deployed applications.</li>
    </ul>
    <p>To finalize the connection between the different pieces, find all references to <code>autoload.php</code> in your project and replace them with <code>AspectKernelLoader.php</code>. In our simple example, only the test file requires modification:</p>
    <pre>require_once '../AspectKernelLoader.php';&#x000A;    &#x000A;    class BrokerTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    // [...]&#x000A;    &#x000A;    }</pre>
    <p>For bigger projects, you may find that it’s useful to use <code>bootstrap.php</code> for PHPUnit; the <code>require_once()</code> for <code>autoload.php</code> or our <code>AspectKernelLoader.php</code> should be included there.</p>
    <h3>Log the Broker’s Methods</h3>
    <p>Create a file, called <code>BrokerAspect.php</code>, and add the following code:</p>
    <pre>use Go\Aop\Aspect;&#x000A;    use Go\Aop\Intercept\FieldAccess;&#x000A;    use Go\Aop\Intercept\MethodInvocation;&#x000A;    use Go\Lang\Annotation\After;&#x000A;    use Go\Lang\Annotation\Before;&#x000A;    use Go\Lang\Annotation\Around;&#x000A;    use Go\Lang\Annotation\Pointcut;&#x000A;    use Go\Lang\Annotation\DeclareParents;&#x000A;    &#x000A;    class BrokerAspect implements Aspect {&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @Before("execution(public Broker-&gt;*(*))") // This is our PointCut&#x000A;    	 */&#x000A;    	public function beforeMethodExecution(MethodInvocation $invocation) {&#x000A;    		echo "Entering method " . $invocation-&gt;getMethod()-&gt;getName() . "()\n";&#x000A;    	}&#x000A;    }</pre>
    <p>We begin by specifying several <code>use</code> statements for the AOP infrastructure. Then, we create our aspect class, called <code>BrokerAspect</code>, which must implement <code>Aspect</code>. Next, we specify the matching logic for our aspect:</p>
    <pre>* @Before("execution(public Broker-&gt;*(*))")</pre>
    <ul>
    <li>
    <code>@Before</code> specifies when to apply the advice. Possibilities are <code>@Before</code>, <code>@After</code>, <code>@Around</code> and <code>@AfterThrowing</code>.</li>
    <li>
    <code>"execution(public Broker-&gt;*(*))"</code> specifies the matching rule as the execution of any public method on a class, called <code>Broker</code>, with any number of parameters. The syntax is: <code>[operation - execution/access]([method/attribute type - public/protected] [class]-&gt;[method/attribute]([params])</code>
    </li>
    </ul>
    <p>Please note that the matching mechanism is admittedly somewhat awkward. You can use only one ‘<code>*</code>‘ (star) in each part of the rule. For example, <code>public Broker-&gt;</code> matches a class, called <code>Broker</code>. <code>public Bro*-&gt;</code> matches any class starting with <code>Bro</code>, and <code>public *ker-&gt;</code> matches any class ending with <code>ker</code>.</p>
    <blockquote><p><code>public *rok*-&gt;</code> will not match anything; you may not use more than one star for the same match.</p></blockquote>
    <p>The method following the matcher will be called when the event occurs. In our case, the method executes before each call on one of <code>Broker</code>‘s public methods. A parameter, called <code>$invocation</code> (of type <code>MethodInvocation</code>), is automatically passed to our method. This object provides different ways of obtaining information about the called method. In this first example, we use it to obtain the method’s name and print it.</p>
    <h3>Registering The Aspect</h3>
    <p>Merely defining an aspect is not enough; we need to register it into the AOP infrastructure. Otherwise, it will not be applied. Edit <code>ApplicationAspectKernel.php</code> and call <code>registerAspect()</code> on the container in the <code>configureAop()</code> method:</p>
    <pre>use Go\Core\AspectKernel;&#x000A;    use Go\Core\AspectContainer;&#x000A;    &#x000A;    class ApplicationAspectKernel extends AspectKernel&#x000A;    {&#x000A;    &#x000A;        protected function getApplicationLoaderPath()&#x000A;        {&#x000A;            return __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';&#x000A;        }&#x000A;    &#x000A;        protected function configureAop(AspectContainer $container)&#x000A;        {&#x000A;            $container-&gt;registerAspect(new BrokerAspect());&#x000A;        }&#x000A;    }</pre>
    <p>Run the tests and check the output. You should see something similar to the following:</p>
    <pre>PHPUnit 3.6.11 by Sebastian Bergmann.&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    Entering method buy()&#x000A;    .Entering method __construct()&#x000A;    Entering method sell()&#x000A;    Time: 0 seconds, Memory: 5.50Mb&#x000A;    &#x000A;    OK (2 tests, 2 assertions)</pre>
    <p>So we’ve managed to run code whenever something happens on the broker.</p>
    <h3>Finding Parameters and Matching <code>@After</code>
    </h3>
    <p>Let’s add another method to the <code>BrokerAspect</code>.</p>
    <pre>// [...]&#x000A;    class BrokerAspect implements Aspect {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @After("execution(public Broker-&gt;*(*))")&#x000A;    	 */&#x000A;    	public function afterMethodExecution(MethodInvocation $invocation) {&#x000A;    		echo "Finished executing method " . $invocation-&gt;getMethod()-&gt;getName() . "()\n";&#x000A;    		echo "with parameters: " . implode(', ', $invocation-&gt;getArguments()) . ".\n\n";&#x000A;    	}&#x000A;    }</pre>
    <p>This method runs after a public method executes (note the <code>@After</code> matcher). We then add another line to output the parameters used to call the method. The output of our test now is:</p>
    <pre>PHPUnit 3.6.11 by Sebastian Bergmann.&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    Finished executing method __construct()&#x000A;    with parameters: John, 1.&#x000A;    &#x000A;    Entering method buy()&#x000A;    Finished executing method buy()&#x000A;    with parameters: GOOGL, 100, 5.&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    Finished executing method __construct()&#x000A;    with parameters: John, 1.&#x000A;    &#x000A;    Entering method sell()&#x000A;    Finished executing method sell()&#x000A;    with parameters: YAHOO, 50, 10.&#x000A;    &#x000A;    Time: 0 seconds, Memory: 5.50Mb&#x000A;    &#x000A;    OK (2 tests, 2 assertions)</pre>
    <h3>Getting Return Values and Manipulating Execution</h3>
    <p>So far, we’ve learned how to run extra code before and after a method executes. While this is nice, it’s not overly useful if we can’t see what the methods return. Let’s add another method to the aspect and modify the existing code:</p>
    <pre> //[...]&#x000A;    class BrokerAspect implements Aspect {&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @Before("execution(public Broker-&gt;*(*))")&#x000A;    	 */&#x000A;    	public function beforeMethodExecution(MethodInvocation $invocation) {&#x000A;    		echo "Entering method " . $invocation-&gt;getMethod()-&gt;getName() . "()\n";&#x000A;    		echo "with parameters: " . implode(', ', $invocation-&gt;getArguments()) . ".\n";&#x000A;    	}&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @After("execution(public Broker-&gt;*(*))")&#x000A;    	 */&#x000A;    	public function afterMethodExecution(MethodInvocation $invocation) {&#x000A;    		echo "Finished executing method " . $invocation-&gt;getMethod()-&gt;getName() . "()\n\n";&#x000A;    	}&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @Around("execution(public Broker-&gt;*(*))")&#x000A;    	 */&#x000A;    	public function aroundMethodExecution(MethodInvocation $invocation) {&#x000A;    		$returned = $invocation-&gt;proceed();&#x000A;    		echo "method returned: " . $returned . "\n";&#x000A;    &#x000A;    		return $returned;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <blockquote><p>Merely defining an aspect is not enough; we need to register it into the AOP infrastructure.</p></blockquote>
    <p>This new code moves the parameter information to the <code>@Before</code> method. We also add another method with the special <code>@Around</code> matcher. This is neat, because the original matched method call is wrapped inside the <code>aroundMethodExecution()</code> function, effectively supressing the original invocation. Inside the advise, we need to call <code>$invocation-&gt;proceed()</code>, in order to execute the original call. If you don’t do this, the original call will not occur.</p>
    <p>This wrapping also allows us to manipulate the returned value. What we return in our advise is what returns in the original call. In our case, we didn’t change anything, and your output should look like this:</p>
    <pre>PHPUnit 3.6.11 by Sebastian Bergmann.&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    with parameters: John, 1.&#x000A;    method returned:&#x000A;    Finished executing method __construct()&#x000A;    &#x000A;    Entering method buy()&#x000A;    with parameters: GOOGL, 100, 5.&#x000A;    method returned: 500&#x000A;    Finished executing method buy()&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    with parameters: John, 1.&#x000A;    method returned:&#x000A;    Finished executing method __construct()&#x000A;    &#x000A;    Entering method sell()&#x000A;    with parameters: YAHOO, 50, 10.&#x000A;    method returned: 500&#x000A;    Finished executing method sell()&#x000A;    &#x000A;    Time: 0 seconds, Memory: 5.75Mb&#x000A;    &#x000A;    OK (2 tests, 2 assertions)</pre>
    <p>Let’s play a little and offer a discount for a specific broker. Return to the test class, and write the following test:</p>
    <pre>require_once '../AspectKernelLoader.php';&#x000A;    &#x000A;    class BrokerTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	function testBrokerWithId2WillHaveADiscountOnBuyingShares() {&#x000A;    		$broker = new Broker('Finch', '2');&#x000A;    		$this-&gt;assertEquals(80, $broker-&gt;buy('MS', 10, 10));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>This will fail with:</p>
    <pre>Time: 0 seconds, Memory: 6.00Mb&#x000A;    &#x000A;    There was 1 failure:&#x000A;    &#x000A;    1) BrokerTest::testBrokerWithId2WillHaveADiscountOnBuyingShares&#x000A;    Failed asserting that 100 matches expected 80.&#x000A;    &#x000A;    /home/csaba/Personal/Programming/NetTuts/Aspect Oriented Programming in PHP/Source/Application/Test/BrokerTest.php:19&#x000A;    /usr/bin/phpunit:46&#x000A;    &#x000A;    FAILURES!&#x000A;    Tests: 3, Assertions: 3, Failures: 1.</pre>
    <p>Next, we need to modify the broker to provide its ID. Just implement a <code>getId()</code> method, as demonstrated below:</p>
    <pre>class Broker {&#x000A;    &#x000A;    	private $name;&#x000A;    	private $id;&#x000A;    &#x000A;    	function __construct($name, $id) {&#x000A;    		$this-&gt;name = $name;&#x000A;    		$this-&gt;id = $id;&#x000A;    	}&#x000A;    &#x000A;    	function getId() {&#x000A;    		return $this-&gt;id;&#x000A;    	}&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    }</pre>
    <p>Now, modify the aspect to adjust the buying price for a broker with an ID of <code>2</code>.</p>
    <pre> // [...]&#x000A;    class BrokerAspect implements Aspect {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @Around("execution(public Broker-&gt;buy(*))")&#x000A;    	 */&#x000A;    	public function aroundMethodExecution(MethodInvocation $invocation) {&#x000A;    		$returned = $invocation-&gt;proceed();&#x000A;    		$broker = $invocation-&gt;getThis();&#x000A;    &#x000A;    		if ($broker-&gt;getId() == 2) return $returned * 0.80;&#x000A;    		return $returned;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Instead of adding a new method, just modify the <code>aroundMethodExecution()</code> function. It now only matches methods, called ‘<code>buy</code>‘, and triggers <code>$invocation-&gt;getThis()</code>. This effectively returns the original <code>Broker</code> object so that we may execute its code. And so we did! We ask the broker for its ID, and offer a discount if the ID is equal to <code>2</code>. The test now passes.</p>
    <pre>PHPUnit 3.6.11 by Sebastian Bergmann.&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    with parameters: John, 1.&#x000A;    Finished executing method __construct()&#x000A;    &#x000A;    Entering method buy()&#x000A;    with parameters: GOOGL, 100, 5.&#x000A;    Entering method getId()&#x000A;    with parameters: .&#x000A;    Finished executing method getId()&#x000A;    &#x000A;    Finished executing method buy()&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    with parameters: John, 1.&#x000A;    Finished executing method __construct()&#x000A;    &#x000A;    Entering method sell()&#x000A;    with parameters: YAHOO, 50, 10.&#x000A;    Finished executing method sell()&#x000A;    &#x000A;    .Entering method __construct()&#x000A;    with parameters: Finch, 2.&#x000A;    Finished executing method __construct()&#x000A;    &#x000A;    Entering method buy()&#x000A;    with parameters: MS, 10, 10.&#x000A;    Entering method getId()&#x000A;    with parameters: .&#x000A;    Finished executing method getId()&#x000A;    &#x000A;    Finished executing method buy()&#x000A;    &#x000A;    Time: 0 seconds, Memory: 5.75Mb&#x000A;    &#x000A;    OK (3 tests, 3 assertions)</pre>
    <h3>Matching Exceptions</h3>
    <p>We can now execute extra code when a method is entered, after it executes and around it. But what if a method throws an exception?</p>
    <p>Add a test method to buy a large number of shares:</p>
    <pre>function testBuyTooMuch() {&#x000A;    	$broker = new Broker('Finch', '2');&#x000A;    	$broker-&gt;buy('MS', 10000, 8);&#x000A;    }</pre>
    <p>Now, create an exception class. We need this because the built-in <code>Exception</code> class cannot be caught by Go! AOP or PHPUnit.</p>
    <pre>class SpentTooMuchException extends Exception {&#x000A;    &#x000A;    	public function __construct($message) {&#x000A;    		parent::__construct($message);&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Modify the broker to throw an exception for a large value:</p>
    <pre>class Broker {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	function buy($symbol, $volume, $price) {&#x000A;    		$value = $volume * $price;&#x000A;    		if ($value &gt; 1000)&#x000A;    			throw new SpentTooMuchException(sprintf('You are not allowed to spend that much (%s)', $value));&#x000A;    		return $value;&#x000A;    	}&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    }</pre>
    <p>Run the tests and ensure that they fail:</p>
    <pre>Time: 0 seconds, Memory: 6.00Mb&#x000A;    &#x000A;    There was 1 error:&#x000A;    &#x000A;    1) BrokerTest::testBuyTooMuch&#x000A;    Exception: You are not allowed to spend that much (80000)&#x000A;    &#x000A;    /home/csaba/Personal/Programming/NetTuts/Aspect Oriented Programming in PHP/Source/Application/Broker.php:20&#x000A;    // [...]&#x000A;    /home/csaba/Personal/Programming/NetTuts/Aspect Oriented Programming in PHP/Source/Application/Broker.php:47&#x000A;    /home/csaba/Personal/Programming/NetTuts/Aspect Oriented Programming in PHP/Source/Application/Test/BrokerTest.php:24&#x000A;    /usr/bin/phpunit:46&#x000A;    &#x000A;    FAILURES!&#x000A;    Tests: 4, Assertions: 3, Errors: 1.</pre>
    <p>Now, expect the exception (in the test) and make sure they pass:</p>
    <pre>class BrokerTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	/**&#x000A;         * @expectedException SpentTooMuchException&#x000A;         */&#x000A;    	function testBuyTooMuch() {&#x000A;    		$broker = new Broker('Finch', '2');&#x000A;    		$broker-&gt;buy('MS', 10000, 8);&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Create a new method in our aspect to match <code>@AfterThrowing</code>, and don’t forget to specify <code>Use Go\Lang\Annotation\AfterThrowing;</code></p>
    <pre> // [...]&#x000A;    Use Go\Lang\Annotation\AfterThrowing;&#x000A;    &#x000A;    class BrokerAspect implements Aspect {&#x000A;    &#x000A;    	// [...]&#x000A;    &#x000A;    	/**&#x000A;    	 * @param MethodInvocation $invocation Invocation&#x000A;    	 * @AfterThrowing("execution(public Broker-&gt;buy(*))")&#x000A;    	 */&#x000A;    	public function afterExceptionMethodExecution(MethodInvocation $invocation) {&#x000A;    		echo 'An exception has happened';&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>The <code>@AfterThrowing</code> matcher suppresses the thrown exception and allows you to take your own action. In our code, we simply echo a message, but you may do whatever your application requires.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <blockquote><p>This is why I urge you to use aspects with care.</p></blockquote>
    <p>Aspect oriented programming is like a new gadget for geeks; you can immediately see its great potential. Aspects allows us to introduce extra code in different parts of our system without modifying the original code. This can prove to be immensely helpful, when you need to implement modules that pollute your methods and classes with tightly coupled references and method calls.</p>
    <p>This flexibility, however, comes with a price: obscurity. There is no way to tell if an aspect watches a method just by looking at the method or its class. For example, there is no indication in our <code>Broker</code> class that anything happens when its methods execute. This is why I urge you to use aspects with care.</p>
    <p>Our use of the aspect to offer a discount for a specific broker is an example of misuse. Refrain from doing that in a real project. A broker discount is related to brokers; so, keep that logic in the <code>Broker</code> class. Aspects should only perform tasks that do not directly relate to the object’s primary behavior.</p>
    <p>Have fun with this!</p>
    </div>
]]>
</Body>
<Summary>The concept of Aspect-Oriented Programming (AOP) is fairly new to PHP. There’s currently no official AOP support in PHP, but there are some extensions and libraries which implement this feature....</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/EOjDvmSKqog/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27463/guest@my.umbc.edu/874e014c937000dd3f9b027cee468d9e/api/pixel</TrackingUrl>
<Tag>aop</Tag>
<Tag>aspect-oriented-programming</Tag>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>go</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</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>Tue, 09 Apr 2013 18:16:30 -0400</PostedAt>
<EditAt>Tue, 09 Apr 2013 18:16:30 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="27461" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27461">
<Title>Simple Strategies for Last-Minute Tax Filers</Title>
<Body>
<![CDATA[
    <div class="html-content">You have less than one week left to get your taxes done, but that doesn't mean you have to scramble. Here are some simple strategies to make the process go smoothly.</div>
]]>
</Body>
<Summary>You have less than one week left to get your taxes done, but that doesn't mean you have to scramble. Here are some simple strategies to make the process go smoothly.</Summary>
<Website>http://feedproxy.google.com/~r/YoungentrepreneurcomBlog/~3/UijnQ-xbiWM/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27461/guest@my.umbc.edu/f44438c8038d30b6bb4f75ae2e3367da/api/pixel</TrackingUrl>
<Tag>business-management</Tag>
<Tag>irs</Tag>
<Tag>money-management</Tag>
<Tag>overcoming-obstacles</Tag>
<Tag>startup-finance</Tag>
<Tag>stress-management</Tag>
<Tag>taxes</Tag>
<Tag>uncategorized</Tag>
<Group token="entrepreneurship">Alex. Brown Center for Entrepreneurship</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/entrepreneurship</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/original.jpg?1771000363</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/large.png?1771000363</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/medium.png?1771000363</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/small.png?1771000363</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxsmall.png?1771000363</AvatarUrl>
<Sponsor>The Alex. Brown Center for Entrepreneurship</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 09 Apr 2013 17:00:55 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30067" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30067">
<Title>One App&#8217;s iOS Debacle Shows Dangers of Betting It All on Apple</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>A popular app gets yanked from Apple’s App Store, illustrating the danger of betting it all on one mobile OS.</p>
    <p><a href="http://www.appgratis.com" rel="nofollow external" class="bo">AppGratis,</a> an iOS app that offers users a free app each day that they’d normally have to pay for, is having a rough week. On Friday, Apple removed AppGratis from its app store, saying it ran afoul of two store guidlines: one banning apps that promote other apps, and another banning use of push notifications to send ads or direct marketing.</p>
    </div>
]]>
</Body>
<Summary>A popular app gets yanked from Apple’s App Store, illustrating the danger of betting it all on one mobile OS.  AppGratis, an iOS app that offers users a free app each day that they’d normally have...</Summary>
<Website>http://www.technologyreview.com/view/513501/one-apps-ios-debacle-shows-dangers-of-betting-it-all-on-apple/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30067/guest@my.umbc.edu/6c6e76a0c8064632ec399d18012a79a8/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>Tue, 09 Apr 2013 16:56:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="110211" important="false" status="posted" url="https://my3.my.umbc.edu/posts/110211">
<Title>George La Noue, Public Policy/Political Science, in the Washington Times</Title>
<Body>
<![CDATA[
    <div class="html-content">A new Washington Times commentary critiquing government contracting programs for minority- and women-owned firms references testimony by UMBC professor George La Noue on why federal contacting preferences should be reexamined. La Noue is an expert on education policy, constitutional law and policy, and public procurement policy, and is a frequent witness in Congressional testimony.</div>
]]>
</Body>
<Summary>A new Washington Times commentary critiquing government contracting programs for minority- and women-owned firms references testimony by UMBC professor George La Noue on why federal contacting...</Summary>
<Website>https://news.umbc.edu/george-la-noue-public-policypolitical-science-in-the-washington-times/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/110211/guest@my.umbc.edu/93cba873ef951fbaeb2e9eb7e99aeae3/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Tag>publicpolicy</Tag>
<Group token="umbc-news">UMBC News</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/original.png?1632921809</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/large.png?1632921809</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/medium.png?1632921809</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/small.png?1632921809</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxsmall.png?1632921809</AvatarUrl>
<Sponsor>UMBC News</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Tue, 09 Apr 2013 16:44:02 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27456" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27456">
<Title>Dr. Adelman Contributes to Antenna</Title>
<Body>
<![CDATA[
    <div class="html-content">Check out Dr. Adelman's recent contribution to Antenna, a "collectively authored media and cultural studies blog 
    committed to timely yet careful analysis of texts, news, and events from
     across the popular culture spectrum."</div>
]]>
</Body>
<Summary>Check out Dr. Adelman's recent contribution to Antenna, a "collectively authored media and cultural studies blog  committed to timely yet careful analysis of texts, news, and events from  across...</Summary>
<Website>http://blog.commarts.wisc.edu/2013/02/21/half-the-battle-envisioning-citizenship-in-whole-again/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27456/guest@my.umbc.edu/50ce76900eb61edf6c45b2aa1bd9b8a3/api/pixel</TrackingUrl>
<Group token="mcs">Media &amp;amp; Communication Studies</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/mcs</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xsmall.png?1639004057</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/original.png?1639004057</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xxlarge.png?1639004057</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xlarge.png?1639004057</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/large.png?1639004057</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/medium.png?1639004057</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/small.png?1639004057</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xsmall.png?1639004057</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xxsmall.png?1639004057</AvatarUrl>
<Sponsor>Media &amp; Communication Studies</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/xxlarge.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/xlarge.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/large.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/medium.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/small.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/xsmall.jpg?1365539912</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/027/456/98af8de5c746356a4b872fa0857e540c/xxsmall.jpg?1365539912</ThumbnailUrl>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 09 Apr 2013 16:41:50 -0400</PostedAt>
<EditAt>Tue, 09 Apr 2013 16:42:11 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="27455" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27455">
<Title>How did your NCAA Men's Basketball March Madness bracket turn out?</Title>
<Body>
<![CDATA[
    <div class="html-content">How did your <a href="/profile.php?id=176134773759" title="To tag someone, type @ and then the friend's name" rel="nofollow external" class="bo">NCAA Men's Basketball March Madness</a> bracket turn out?<br><br><a href="http://www.facebook.com/l.php?u=http%3A%2F%2Finstagram.com%2Fp%2FX4xAIOKtF9%2F&amp;h=cAQEcWbkj&amp;s=1" title="" rel="nofollow external" class="bo"><img src="https://fbexternal-a.akamaihd.net/safe_image.php?d=AQBRIXIaN11hAw5u&amp;w=154&amp;h=154&amp;url=http%3A%2F%2Fdistilleryimage1.ak.instagram.com%2Fd4241ef8a11f11e28abf22000a1f9bf5_7.jpg" alt="" style="max-width: 100%; height: auto;"></a><br><a href="http://www.facebook.com/l.php?u=http%3A%2F%2Finstagram.com%2Fp%2FX4xAIOKtF9%2F&amp;h=8AQEbR06G&amp;s=1" rel="nofollow external" class="bo">http://instagram.com/p/X4xAIOKtF9/</a><br>instagram.com<br>realevanponter's photo on Instagram</div>
]]>
</Body>
<Summary>How did your NCAA Men's Basketball March Madness bracket turn out?   http://instagram.com/p/X4xAIOKtF9/ instagram.com realevanponter's photo on Instagram</Summary>
<Website>http://www.facebook.com/umbctraining/posts/104322449766257</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27455/guest@my.umbc.edu/bd367d82e6b49a4179039b01848c7306/api/pixel</TrackingUrl>
<Tag>ccna</Tag>
<Tag>ceh</Tag>
<Tag>centers</Tag>
<Tag>cisco</Tag>
<Tag>cyber</Tag>
<Tag>cybersecurity</Tag>
<Tag>information</Tag>
<Tag>it</Tag>
<Tag>leadership</Tag>
<Tag>management</Tag>
<Tag>microsoft</Tag>
<Tag>project</Tag>
<Tag>security</Tag>
<Tag>technology</Tag>
<Tag>training</Tag>
<Tag>umbc</Tag>
<Group token="retired-575">UMBC Training Centers</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-575</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/original.jpg?1361981335</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/large.png?1361981335</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/medium.png?1361981335</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/small.png?1361981335</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxsmall.png?1361981335</AvatarUrl>
<Sponsor>UMBC Training Centers</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 09 Apr 2013 16:28:57 -0400</PostedAt>
<EditAt>Tue, 09 Apr 2013 16:28:57 -0400</EditAt>
</NewsItem>

</News>
