<?xml version="1.0"?>
<News hasArchived="true" page="8627" pageCount="10722" pageSize="10" timestamp="Fri, 10 Jul 2026 21:04:19 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8627">
<NewsItem contentIssues="true" id="31236" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31236">
<Title>Gatekeepers of Cable TV Try to Stop Intel</Title>
<Body>
<![CDATA[
    <div class="html-content">Intel’s plan to create a virtual cable service is running up against a barricade being guarded by cable and satellite distributors.<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F13%2Fbusiness%2Fmedia%2Fgatekeepers-of-cable-tv-try-to-stop-intel.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Gatekeepers+of+Cable+TV+Try+to+Stop+Intel" 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%2F06%2F13%2Fbusiness%2Fmedia%2Fgatekeepers-of-cable-tv-try-to-stop-intel.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Gatekeepers+of+Cable+TV+Try+to+Stop+Intel" 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%2F06%2F13%2Fbusiness%2Fmedia%2Fgatekeepers-of-cable-tv-try-to-stop-intel.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Gatekeepers+of+Cable+TV+Try+to+Stop+Intel" 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%2F06%2F13%2Fbusiness%2Fmedia%2Fgatekeepers-of-cable-tv-try-to-stop-intel.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Gatekeepers+of+Cable+TV+Try+to+Stop+Intel" 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%2F06%2F13%2Fbusiness%2Fmedia%2Fgatekeepers-of-cable-tv-try-to-stop-intel.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Gatekeepers+of+Cable+TV+Try+to+Stop+Intel" 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>Intel’s plan to create a virtual cable service is running up against a barricade being guarded by cable and satellite distributors.     </Summary>
<Website>http://www.nytimes.com/2013/06/13/business/media/gatekeepers-of-cable-tv-try-to-stop-intel.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31236/guest@my.umbc.edu/56ac9f6cec894516cc7c4cb0f5a15a2e/api/pixel</TrackingUrl>
<Tag>antitrust-laws-and-competition-issues</Tag>
<Tag>apple-inc-aapl-nasdaq</Tag>
<Tag>cable-television</Tag>
<Tag>comcast-corporation-cmcsa-nasdaq</Tag>
<Tag>computers-and-the-internet</Tag>
<Tag>intel-corporation-intc-nasdaq</Tag>
<Tag>microsoft-corporation-msft-nasdaq</Tag>
<Tag>netflix-inc-nflx-nasdaq</Tag>
<Tag>new</Tag>
<Tag>sony-corporation-sne-nyse</Tag>
<Tag>technology</Tag>
<Tag>television</Tag>
<Tag>time-warner-cable-inc-twc-nyse</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, 12 Jun 2013 20:48:45 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31237" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31237">
<Title>In Battle Over Malibu Beaches, an App Unlocks Access</Title>
<Body>
<![CDATA[
    <div class="html-content">The app, which has maps that point the way to hidden entry gates, escalates the war between homeowners and a less-privileged public that wants to share the California coastline.<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F13%2Fus%2Fin-battle-over-malibu-beaches-an-app-unlocks-access.html%3Fpartner%3Drss%26emc%3Drss&amp;t=In+Battle+Over+Malibu+Beaches%2C+an+App+Unlocks+Access" 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%2F06%2F13%2Fus%2Fin-battle-over-malibu-beaches-an-app-unlocks-access.html%3Fpartner%3Drss%26emc%3Drss&amp;t=In+Battle+Over+Malibu+Beaches%2C+an+App+Unlocks+Access" 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%2F06%2F13%2Fus%2Fin-battle-over-malibu-beaches-an-app-unlocks-access.html%3Fpartner%3Drss%26emc%3Drss&amp;t=In+Battle+Over+Malibu+Beaches%2C+an+App+Unlocks+Access" 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%2F06%2F13%2Fus%2Fin-battle-over-malibu-beaches-an-app-unlocks-access.html%3Fpartner%3Drss%26emc%3Drss&amp;t=In+Battle+Over+Malibu+Beaches%2C+an+App+Unlocks+Access" 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%2F06%2F13%2Fus%2Fin-battle-over-malibu-beaches-an-app-unlocks-access.html%3Fpartner%3Drss%26emc%3Drss&amp;t=In+Battle+Over+Malibu+Beaches%2C+an+App+Unlocks+Access" 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>The app, which has maps that point the way to hidden entry gates, escalates the war between homeowners and a less-privileged public that wants to share the California coastline.     </Summary>
<Website>http://www.nytimes.com/2013/06/13/us/in-battle-over-malibu-beaches-an-app-unlocks-access.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31237/guest@my.umbc.edu/9041073561d8dd8e3536671dd9408632/api/pixel</TrackingUrl>
<Tag>beaches</Tag>
<Tag>malibu-calif</Tag>
<Tag>mobile-applications</Tag>
<Tag>new</Tag>
<Tag>price-jennifer</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 20:40:34 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31239" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31239">
<Title>Appshark Partners with Cosentry to Develop a More Robust HTML5 Application Tool for Mobile Migration</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Cosentry expands their cloud based offerings to now include application migration services, cloud deployment and HTML5 mobile enablement with the help of their new partnership with AppShark.</p></div>
]]>
</Body>
<Summary>Cosentry expands their cloud based offerings to now include application migration services, cloud deployment and HTML5 mobile enablement with the help of their new partnership with AppShark.</Summary>
<Website>http://www.htmlgoodies.com/daily_news/appshark-partners-with-cosentry-to-develop-a-more-robust-html5-application-tool-for-mobile-migration.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31239/guest@my.umbc.edu/c05d62009eff9152b6667b8525aac7d3/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</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, 12 Jun 2013 20:02:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31231" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31231">
<Title>Intro to Flask: Signing In and Out</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=29982&amp;c=120943108" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=29982&amp;c=120943108" alt="" style="max-width: 100%; height: auto;"></a><p>Many web applications require users to sign in and out in order to perform important tasks (like administration duties). In this article, we’ll create an authentication system for our application.</p>
    <p></p>
    <p>In the <a href="http://net.tutsplus.com/tutorials/python-tutorials/intro-to-flask-adding-a-contact-page/" rel="nofollow external" class="bo">previous article</a>, we built a contact page using the <a href="http://packages.python.org/Flask-WTF/" rel="nofollow external" class="bo">Flask-WTF</a> and <a href="http://packages.python.org/Flask-Mail/" rel="nofollow external" class="bo">Flask-Mail</a> extensions. We’ll use <a href="http://packages.python.org/Flask-WTF/" rel="nofollow external" class="bo">Flask-WTF</a>, once again, this time to validate a user’s username and password. We’ll save these credentials into a database using yet another extension called <a href="http://packages.python.org/Flask-SQLAlchemy/" rel="nofollow external" class="bo">Flask-SQLAlchemy</a>.</p>
    <p>You can find the source code for this tutorial on <a href="https://github.com/NETTUTS/intro-to-flask" rel="nofollow external" class="bo">GitHub</a>. While following along with this tutorial, when you see a caption, such as <code>Checkpoint: 13_packaged_app</code>, it means that you can switch to the GIT branch named “13_packaged_app” and review the code at that point in the article.</p>
    <hr>
    <h2>Growing the Application</h2>
    <p>So far, our <a href="http://flask.pocoo.org/" rel="nofollow external" class="bo">Flask</a> app is a fairly simple application. It consists of mostly static pages; so, we’ve been able to organize it as a Python module. But now, we need to reorganize our application to make it easier to maintain and grow. <a href="http://flask.pocoo.org/docs/patterns/packages/" rel="nofollow external" class="bo">The Flask documentation recommends</a> that we reorganize the app as a Python package, so let’s start there.</p>
    <p>Our app is currently organized like this:</p>
    <pre>flaskapp/&#x000A;    └── app/&#x000A;            ├── static/&#x000A;            ├── templates/&#x000A;            ├── forms.py&#x000A;            ├── routes.py&#x000A;            └── README.md</pre>
    <p>To restructure it as a package, let’s first create a new folder inside <code>app/</code> named <code>intro_to_flask/</code>. Then move <code>static/</code>, <code>templates/</code>, <code>forms.py</code> and <code>routes.py</code> into <code>intro_to_flask/</code>. Also, delete any .pyc files that are hanging around.</p>
    <pre>flaskapp/&#x000A;    └── app/&#x000A;            ├── intro_to_flask/&#x000A;            │      ├── static/&#x000A;            │      ├── templates/&#x000A;            │      ├── forms.py&#x000A;            │      ├── routes.py&#x000A;            └── README.md</pre>
    <p>Next, create a new file named <code>__init__.py</code> and place it inside <code>intro_to_flask/</code>. This file is required to make Python treat the <code>intro_to_flask/</code> folder as a package.</p>
    <pre>flaskapp/&#x000A;    └── app/&#x000A;            ├── intro_to_flask/&#x000A;            │      ├── __init__.py&#x000A;            │      ├── static/&#x000A;            │      ├── templates/&#x000A;            │      ├── forms.py&#x000A;            │      ├── routes.py&#x000A;            └── README.md</pre>
    <p>When our app was a Python module, the application-wide imports and configurations were specified in <code>routes.py</code>. Now that the app is a Python package, we’ll move these settings from <code>routes.py</code> into <code>__init__.py</code>.</p>
    <p><code>app/intro_to_flask/__init__.py</code></p>
    <pre>from flask import Flask&#x000A;    &#x000A;    app = Flask(__name__)&#x000A;    &#x000A;    app.secret_key = 'development key'&#x000A;    &#x000A;    app.config["MAIL_SERVER"] = "smtp.gmail.com"&#x000A;    app.config["MAIL_PORT"] = 465&#x000A;    app.config["MAIL_USE_SSL"] = True&#x000A;    app.config["MAIL_USERNAME"] = '<a href="mailto:contact@example.com">contact@example.com</a>'&#x000A;    app.config["MAIL_PASSWORD"] = 'your-password'&#x000A;    &#x000A;    from routes import mail&#x000A;    mail.init_app(app)&#x000A;    &#x000A;    import intro_to_flask.routes</pre>
    <p>The top of <code>routes.py</code> now looks like this:</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    from flask import render_template, request, flash&#x000A;    from forms import ContactForm&#x000A;    from flask.ext.mail import Message, Mail&#x000A;    &#x000A;    mail = Mail()&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    # @app.route() mappings start here</pre>
    <p>We previously had <code>app.run()</code> inside of <code>routes.py</code>, which allowed us to type <code>$ python routes.py</code> to run the application. Since the app is now organized as a package, we need to employ a different strategy. <a href="http://flask.pocoo.org/docs/patterns/packages/" rel="nofollow external" class="bo">The Flask docs recommend</a> adding a new file named <code>runserver.py</code> and placing it inside <code>app/</code>. Let’s do that now:</p>
    <pre>flaskapp/&#x000A;    └── app/&#x000A;            ├── intro_to_flask/&#x000A;            │      ├── __init__.py&#x000A;            │      ├── static/&#x000A;            │      ├── templates/&#x000A;            │      ├── forms.py&#x000A;            │      ├── routes.py&#x000A;            ├── runserver.py        &#x000A;            └── README.md</pre>
    <p>Now take the <code>app.run()</code> call from <code>routes.py</code> and place it inside of <code>runserver.py</code>.</p>
    <p><code>app/runserver.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    &#x000A;    app.run(debug=True)</pre>
    <p>Now you can type <code>$ python runserver.py</code> and view the app in the browser. From the top, here’s how you’ll enter your development environment and run the app:</p>
    <pre>$ cd flaskapp/&#x000A;    $ . bin/activate&#x000A;    $ cd app/&#x000A;    $ python runserver.py</pre>
    <p>The app is now organized as a package, we’re ready to move on and install a database to manage user credentials.</p>
    <p>— <code>Checkpoint: 13_packaged_app</code> —</p>
    <hr>
    <h2>Flask-SQLAlchemy</h2>
    <p>We’ll use MySQL for our database engine and the <a href="http://packages.python.org/Flask-SQLAlchemy/" rel="nofollow external" class="bo">Flask-SQLAlchemy</a> extension to manage all of the database interaction.</p>
    <p>Flask-SQLAlchemy uses Python objects instead of SQL statements to query the database. For example, instead of writing <code>SELECT * FROM users WHERE firstname = "lalith"</code>, you would write <code>User.query.filter_by(username="lalith").first()</code>.</p>
    <blockquote><p> The moral of this aside is to not completely rely on, or abandon a database abstraction layer like Flask-SQLAlchemy, but to be aware of it, so that you can determine when it’s useful for your needs.</p></blockquote>
    <p>But why can’t we just write raw SQL statements? What’s the point of using this weird syntax? As with most things, using Flask-SQLAlchemy, or any database abstraction layer, depends on your needs and preferences. Using Flask-SQLAlchemy allows you to work with your database by writing Python code instead of SQL. This way you don’t have SQL statements scattered amidst your Python code, and that’s a good thing, from a code quality perspective.</p>
    <p>Also, if implemented correctly, using Flask-SQLAlchemy will help make your application to be database-agnostic. If you start building your app on top of MySQL and then decide to switch to another database engine, you shouldn’t have to rewrite massive chunks of sensitive database code. You could simply switch out Flask-SQLAlchemy with your new database abstraction layer without much of an issue. Being able to easily replace components is called modularity, and it’s a sign of a well designed application.</p>
    <p>On the other hand, it might be more intuitive and readable if you write raw SQL statements instead of learning how to translate it into Flask-SQLAlchemy’s Expression Language. Fortunately, it’s possible to write raw SQL statements in Flask-SQLAlchemy too, if that’s what you need.</p>
    <p>The moral of this aside is to not completely rely on, or abandon a database abstraction layer like Flask-SQLAlchemy, but to be aware of it, so that you can determine when it’s useful for your needs. For the database queries in this article, I’ll show you both the Expression Language version and the equivalent SQL statement.</p>
    <h3>Installing MySQL</h3>
    <p>Check to see if your system already has MySQL by running the following command in your terminal:</p>
    <pre>$ mysql --version</pre>
    <p>If you see a version number, you can skip to the “Creating a Database” section. If the command was not found, you’ll need to install MySQL. With the large variety of different operating systems out there, I’ll defer to Google to provide installation instructions that work for your OS. The installation usually consists of running a command or an executable. For example, the Linux command is:</p>
    <pre>$ sudo apt-get install mysql-server mysql-client</pre>
    <h3>Creating a Database</h3>
    <p>Once MySQL is installed, create a database for your app called ‘<code>development</code>‘. You can do this from a web interface like <a href="http://www.phpmyadmin.net/home_page/index.php" rel="nofollow external" class="bo">phpMyAdmin</a> or from the command line, as shown below:</p>
    <pre>$ mysql -u username -p&#x000A;    Enter password:&#x000A;    &#x000A;    mysql&gt; CREATE DATABASE development;</pre>
    <h3>Installing Flask-SQLAlchemy</h3>
    <p>Inside the isolated development environment, install Flask-SQLAlchemy.</p>
    <pre>$ pip install flask-sqlalchemy</pre>
    <p>When I tried to install Flask-SQLAlchemy, I received an error stating that the installation had failed. I searched the error and found that others had resolved the problem by installing <code>libmysqlclient15-dev</code>, which installs MySQL’s development files. If your Flask-SQLAlchemy installation fails, Google the error for solutions or leave a comment and we’ll try to help you figure it out.</p>
    <h3>Configuring Flask-SQLAlchemy</h3>
    <p>Just as we did with Flask-Mail, we need to configure Flask-SQLAlchemy so that it knows where the <code>development</code> database lives. First, create a new file named <code>models.py</code>, along with adding in the following code</p>
    <p><code>app/intro_to_flask/models.py</code></p>
    <pre>from flask.ext.sqlalchemy import SQLAlchemy&#x000A;    &#x000A;    db = SQLAlchemy()</pre>
    <p>Here we import the <code>SQLAlchemy</code> class from Flask-SQLAlchemy (line one) and create a variable named <code>db</code>, containing a usable instance of the <code>SQLAlchemy</code> class (line three).</p>
    <p>Next, open <code>__init__.py</code> and add the following lines after <code>mail.init_app(app)</code> and before <code>import intro_to_flask.routes</code>.</p>
    <p><code>app/intro_to_flask/__init__.py</code></p>
    <pre>app.config['SQLALCHEMY_DATABASE_URI'] = '<a href="mysql://your-username:your-password@localhost/development">mysql://your-username:your-password@localhost/development</a>'&#x000A;    &#x000A;    from models import db&#x000A;    db.init_app(app)</pre>
    <p>Let’s go over this:</p>
    <ol>
    <li>Line one tells the Flask app to use the ‘<code>development</code>‘ database. We specify this through a data URI which follows the pattern of: <code><a href="mysql://username:password@server/database">mysql://username:password@server/database</a></code>. The server is ‘localhost’ because we’re developing locally. Make sure to fill in your MySQL <code>username</code> and <code>password</code>.</li>
    <li>
    <code>db</code>, the usable instance of the <code>SQLAlchemy</code> class we created in <code>models.py</code>, still doesn’t know what database to use. So we import it from <code>models.py</code> (line three) and bind it to our app (line four), so that it also knows to use the ‘<code>development</code>‘ database. We can now query the ‘<code>development</code>‘ database through our <code>db</code> object.</li>
    </ol>
    <p>Now that our configuration is complete, let’s ensure that everything works. Open <code>routes.py</code> and create a temporary URL mapping so that we can perform a test query.</p>
    <p><code>app/intro-to-flask/routes.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    from flask import Flask, render_template, request, flash, session, redirect, url_for&#x000A;    from forms import ContactForm, SignupForm, SigninForm&#x000A;    from flask.ext.mail import Message, Mail&#x000A;    from models import db&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/testdb')&#x000A;    def testdb():&#x000A;      if db.session.query("1").from_statement("SELECT 1").all():&#x000A;        return 'It works.'&#x000A;      else:&#x000A;        return 'Something is broken.'</pre>
    <p>First we import the database object (<code>db</code>) from <code>models.py</code> (line five). We then create a temporary URL mapping (lines 9-14) wherein we issue a test query to ensure that the Flask app is connected to the ‘<code>development</code>‘ database. Now when we visit the URL <code>/testdb</code>, a test query will be issued (line 11); this is equivalent to the SQL statement <code>SELECT 1;</code>. If all goes well, we’ll see “<strong>It works</strong>” in the browser. Otherwise, we’ll see an error message stating what went wrong.</p>
    <p>I received an error when I visited the <code>/testdb</code> URL: <code>ImportError: No module named MySQLdb</code>. This meant that I didn’t have the mysql-python library installed, so I tried to install it by typing the following:</p>
    <pre>$ pip install mysql-python</pre>
    <p>That installation failed, too. The new error message suggested that I first run <code>easy_install -U distribute</code> and then try the mysql-python installation again. So I did, just like below:</p>
    <pre>$ easy_install -U distribute&#x000A;    $ pip install mysql-python</pre>
    <p>This time the mysql-python installation succeeded, and then I received the “<strong>It works</strong>” success message in the browser. Now the reason I’m recounting the errors I’ve received and what I did to solve them is because installing and connecting to databases can be a tricky process. If you get an error message, please don’t get discouraged. Google the error message or leave a comment, and we’ll figure it out.</p>
    <p>Once the test query works, delete the temporary URL mapping from <code>routes.py</code>. Make sure to retain the “<code>from models import db</code>“” part, because we’ll need it next.</p>
    <p>— <code>Checkpoint: 14_db_config</code> —</p>
    <hr>
    <h2>Create a User Model</h2>
    <blockquote><p>It’s not a good idea to store passwords in plain text, for security reasons.</p></blockquote>
    <p>Inside the ‘<code>development</code>‘ database, we need to create a users table where we can store each user’s information. The information we want to collect and store are the user’s first name, last name, email, and password.</p>
    <p>It’s not a good idea to store passwords in plain text, for security reasons. If an attacker gains access to your database, they would be able to see each user’s login credentials. One way to defend against such an attack is to encrypt passwords with a hash function and a <code>salt</code> (some random data), and store that encrypted value in the database instead of the plain text password. When a user signs in again, we’ll collect the password that was submitted, hash it, and check if it matches the hash in the database. Werkzeug, the utility library on which Flask is built, provides the functions <code>generate_password_hash</code> and <code>check_password_hash</code> for these two tasks, respectively.</p>
    <p>With this in mind, here are the columns we’ll need for the users table:</p>
    <table>
    <thead><tr>
    <td><strong>Column</strong></td>
    <td><strong>Type</strong></td>
    <td><strong>Constraints</strong></td>
    </tr></thead>
    <tbody>
    <tr>
    <td>uid</td>
    <td>int</td>
    <td>Primary Key, Auto Increment</td>
    </tr>
    <tr>
    <td>firstname</td>
    <td>varchar(100)</td>
    </tr>
    <tr>
    <td>lastname</td>
    <td>varchar(100)</td>
    </tr>
    <tr>
    <td>email</td>
    <td>varchar(120)</td>
    <td>Unique</td>
    </tr>
    <tr>
    <td>password</td>
    <td>varchar(54)</td>
    </tr>
    </tbody>
    </table>
    <p>Just like before, you can create this table from a web interface such as phpMyAdmin or from the command line, as shown below:</p>
    <pre>mysql&gt; CREATE TABLE users (&#x000A;    uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT,&#x000A;    firstname VARCHAR(100) NOT NULL,&#x000A;    lastname VARCHAR(100) NOT NULL,&#x000A;    email VARCHAR(120) NOT NULL UNIQUE,&#x000A;    pwdhash VARCHAR(100) NOT NULL&#x000A;    );</pre>
    <p>Next, in <code>models.py</code>, let’s create a class to model a user with attributes for a user’s first name, last name, email, and password.</p>
    <p><code>app/intro_to_flask/models.py</code></p>
    <pre>from flask.ext.sqlalchemy import SQLAlchemy&#x000A;    from werkzeug import generate_password_hash, check_password_hash&#x000A;    &#x000A;    db = SQLAlchemy()&#x000A;    &#x000A;    class User(db.Model):&#x000A;      __tablename__ = 'users'&#x000A;      uid = db.Column(db.Integer, primary_key = True)&#x000A;      firstname = db.Column(db.String(100))&#x000A;      lastname = db.Column(db.String(100))&#x000A;      email = db.Column(db.String(120), unique=True)&#x000A;      pwdhash = db.Column(db.String(54))&#x000A;      &#x000A;      def __init__(self, firstname, lastname, email, password):&#x000A;        self.firstname = firstname.title()&#x000A;        self.lastname = lastname.title()&#x000A;        self.email = email.lower()&#x000A;        self.set_password(password)&#x000A;        &#x000A;      def set_password(self, password):&#x000A;        self.pwdhash = generate_password_hash(password)&#x000A;      &#x000A;      def check_password(self, password):&#x000A;        return check_password_hash(self.pwdhash, password)</pre>
    <blockquote><p>We use the set_password() function to set a salted hash of the password, instead of using the plain text password itself.</p></blockquote>
    <p>Lines one and four already existed in <code>models.py</code>, so we’ll start on line two by importing the <code>generate_password_hash</code> and <code>check_password_hash</code> security functions from Werkzeug. Next, we create a new class named <code>User</code>, inheriting from the database object <code>db</code>‘s <code>Model</code> class (line six.)</p>
    <p>Inside of our <code>User</code> class, we create attributes for the table’s name, primary key, and the user’s first name, last name, email, and password (lines 10-14). We then write a constructor which sets the class attributes (lines 17-20). We save names in title case and email addresses in lowercase to ensure a match regardless of how a user types in his credentials on subsequent sign ins.</p>
    <p>We use the <code>set_password</code> function (lines 22-23) to set a salted hash of the password, instead of using the plain text password itself. Lastly, we have a function named <code>check_password</code> that uses <code>check_password_hash</code>, to check a user’s credentials on any subsequent sign ins (lines 25-26).</p>
    <p>— <code>Checkpoint: 15_user_model</code> —</p>
    <p>Sweet! We’ve created a users table and a user model, thereby laying down the foundation of our authentication system. Now let’s build the first user-facing component of the authentication system: the signup page.</p>
    <hr>
    <h2>Building a Signup Page</h2>
    <h3>Planning</h3>
    <p>Take a look at <code>Fig. 1</code> below, to see how everything will fit together.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/authors/lalith-polepeddi/intro-to-flask-p3-fig1.png" alt="The Sign up process." style="max-width: 100%; height: auto;"><p><code>Fig. 1</code></p> <blockquote><p>Implement SSL site-wide so that passwords and session tokens cannot be intercepted.</p></blockquote>
    <p>Let’s go over the figure from above:</p>
    <ol>
    <li>A user visits the URL <code>/signup</code> to create a new account. The page is retrieved through an HTTP GET request and loads in the browser.</li>
    <li>The user fills in the form fields with his first name, last name, email, and password.</li>
    <li>The user clicks the “Create account” button, and the form submits to the server with an HTTP POST request.</li>
    <li>On the server, a function validates the form data.</li>
    <li>If one or more fields do not pass validation, the signup page reloads with a helpful error message, prompting the the user to try again.</li>
    <li>If all fields are valid, a new <code>User</code> object will be created and saved into the database. The user will then be signed in and redirected to a profile page.</li>
    </ol>
    <p>This sequence of steps should look familiar, as it’s identical to the sequence of steps we took to create a contact form. Here, instead of sending an email at the end, we save a user’s credentials to the database. The <a href="http://net.tutsplus.com/tutorials/python-tutorials/intro-to-flask-adding-a-contact-page/" rel="nofollow external" class="bo">previous article</a> already explained creating a form in detail, I’ll move more quickly in this section so that we can get to the more exciting parts, faster.</p>
    <h3>Creating a Signup Form</h3>
    <p>We installed Flask-WTF in the <a href="http://net.tutsplus.com/tutorials/python-tutorials/intro-to-flask-adding-a-contact-page/" rel="nofollow external" class="bo">previous article</a>, so let’s proceed with creating a new form inside <code>forms.py</code>.</p>
    <p><code>app/intro_to_flask/forms.py</code></p>
    <pre>from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators, ValidationError, PasswordField&#x000A;    from models import db, User&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    class SignupForm(Form):&#x000A;      firstname = TextField("First name",  [validators.Required("Please enter your first name.")])&#x000A;      lastname = TextField("Last name",  [validators.Required("Please enter your last name.")])&#x000A;      email = TextField("Email",  [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])&#x000A;      password = PasswordField('Password', [validators.Required("Please enter a password.")])&#x000A;      submit = SubmitField("Create account")&#x000A;    &#x000A;      def __init__(self, *args, **kwargs):&#x000A;        Form.__init__(self, *args, **kwargs)&#x000A;    &#x000A;      def validate(self):&#x000A;        if not Form.validate(self):&#x000A;          return False&#x000A;        &#x000A;        user = User.query.filter_by(email = self.email.data.lower()).first()&#x000A;        if user:&#x000A;          self.email.errors.append("That email is already taken")&#x000A;          return False&#x000A;        else:&#x000A;          return True</pre>
    <p>We start by importing one more Flask-WTF class named <code>PasswordField</code> (line one), which is like <code>TextField</code> except that it generates a password textbox. We’ll need the <code>db</code> database object and the <code>User</code> model to handle some custom validation logic inside the <code>SignupForm</code> class; so we import them too (line two).</p>
    <p>Then we create a new class named <code>SignupForm</code> containing a field for each piece of user information we wish to collect (lines 7-11). There’s a presence validator on each field to ensure it’s filled in, and a format validator which requires that email addresses match the pattern: <code><a href="mailto:user@example.com">user@example.com</a></code>.</p>
    <p>Next, we write a simple constructor for the class that just calls the base class’ constructor (lines 13-14).</p>
    <p>So we’ve added some presence and format validators to our form fields, but we need an additional validator that ensures an account does not already exist with the user’s email address. To do this we hook into Flask-WTF’s validation process (lines 16-25).</p>
    <p>Now inside of the <code>validate()</code> function, we first ensure the presence and format validators run by calling the base class’ <code>validate()</code> method; if the form is not filled in properly, <code>validate()</code> returns <code>False</code> (lines 16-17).</p>
    <p>Next we define the custom validator. We start by querying the database with the email that the user submitted (line 18). If you remember from our <code>models.py</code> file, the email address is converted to lowercase to ensure a match regardless of how it was typed in. This Flask-SQLAlchemy expression corresponds to the following SQL statement:</p>
    <pre>SELECT * FROM users &#x000A;      WHERE email = self.email.data.lower() &#x000A;      LIMIT 1</pre>
    <p>If a user record already exists with the submitted email, validation fails giving the following error message: “<strong>That email is already taken</strong>” (lines 21-22).</p>
    <h3>Using the Signup Form</h3>
    <p>Let’s now create a new URL mapping and a new web template for the signup form. Open <code>routes.py</code> and import the newly created signup form so that we can use it.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    from flask import render_template, request, flash&#x000A;    from forms import ContactForm, SignupForm</pre>
    <p>Next, create a new URL mapping.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>@app.route('/signup', methods=['GET', 'POST'])&#x000A;    def signup():&#x000A;      form = SignupForm()&#x000A;      &#x000A;      if request.method == 'POST':&#x000A;        if form.validate() == False:&#x000A;          return render_template('signup.html', form=form)&#x000A;        else:   &#x000A;          return "[1] Create a new user [2] sign in the user [3] redirect to the user's profile"&#x000A;      &#x000A;      elif request.method == 'GET':&#x000A;        return render_template('signup.html', form=form)</pre>
    <p>Inside the <code>signup()</code> function, we create a variable named <code>form</code> that contains a usable instance of the <code>SignupForm</code> class. If a GET request has been issued, we’ll return the <code>signup.html</code> web template containing the signup form for the user to fill out.</p>
    <p>Otherwise, we’ll see just a temporary placeholder string. For now, the temp string lists the three actions that should take place when the form has been successfully submitted. We’ll come back and replace this string with real code in “The First Signup” section below.</p>
    <p>Now that we’ve created a URL mapping, the next step is to create the web template <code>signup.html</code> and place it inside the <code>templates/</code> folder.</p>
    <p><code>app/intro_to_flask/templates/signup.html</code></p>
    <pre>{% extends "layout.html" %}&#x000A;    &#x000A;    {% block content %}&#x000A;      &lt;h2&gt;Sign up&lt;/h2&gt;&#x000A;    &#x000A;      {% for message in form.firstname.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      {% for message in form.lastname.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      {% for message in form.email.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      {% for message in form.password.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      &lt;form action="{{ url_for('signup') }}" method=post&gt;&#x000A;        {{ form.hidden_tag() }}&#x000A;        &#x000A;        {{ form.firstname.label }}&#x000A;        {{ form.firstname }}&#x000A;        &#x000A;        {{ form.lastname.label }}&#x000A;        {{ form.lastname }}&#x000A;        &#x000A;        {{ form.email.label }}&#x000A;        {{ form.email }}&#x000A;        &#x000A;        {{ form.password.label }}&#x000A;        {{ form.password }}&#x000A;        &#x000A;        {{ form.submit }}&#x000A;      &lt;/form&gt;&#x000A;        &#x000A;    {% endblock %}</pre>
    <p>This template looks just like <code>contact.html</code>. We first loop through and display any error messages if necessary. We then let Jinja2 generate most of the HTML form for us. Remember how in the <code>Signup</code> form class we appended the error message “<strong>That email is already taken</strong>” to <code>self.email.errors</code>? That’s the same object that Jinja2 loops through in this template.</p>
    <p>The one difference from the <code>contact.html</code> template is the omission of the <code>if...else</code> logic.</p>
    <p>In this template, we want to register and sign in the user on a successful form submission. This takes place on the back-end, so the <code>if...else</code> statement is not needed here.</p>
    <p>Finally, add in these CSS rules to your <code>main.css</code> file so that the signup form looks nice and pretty.</p>
    <p><code>app/intro_to_flask/static/css/main.css</code></p>
    <pre>/* Signup form */&#x000A;    form input#firstname,&#x000A;    form input#lastname,&#x000A;    form input#password {&#x000A;      width: 400px;&#x000A;      background-color: #fafafa;&#x000A;      -webkit-border-radius: 3px;&#x000A;         -moz-border-radius: 3px;&#x000A;              border-radius: 3px;&#x000A;      border: 1px solid #cccccc;&#x000A;      padding: 5px;&#x000A;      font-size: 1.1em;&#x000A;    }&#x000A;    &#x000A;    form input#password {&#x000A;      margin-bottom: 10px;&#x000A;    }</pre>
    <p>Let’s check out the newly created signup page by typing:</p>
    <pre>$ cd app/&#x000A;    $ python runserver.py</pre>
    <p>And browse to <a href="http://localhost:5000/signup" rel="nofollow external" class="bo">http://localhost:5000/signup</a> in your favorite web browser.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/authors/lalith-polepeddi/intro-to-flask-p3-signup.png" alt="The sign up page." style="max-width: 100%; height: auto;"><br> <p>Excellent! We just created a signup form from scratch, handled complex validation, and created a good looking signup page with helpful error messages.</p>
    <p>— <code>Checkpoint: 16_signup_form</code> —</p>
    <p>If any of these steps were unclear, please take a moment to review the <a href="http://net.tutsplus.com/tutorials/python-tutorials/intro-to-flask-adding-a-contact-page/" rel="nofollow external" class="bo">previous article</a>. It covers each step in greater detail, and I followed the same steps from that article, to create this signup form.</p>
    <hr>
    <h2>The First Signup</h2>
    <p>Let’s start by replacing the temporary placeholder string in <code>routes.py</code>‘s <code>signup()</code> function with some real code. Upon a successful form submission, we need to create a new <code>User</code> object, save it to the database, sign the user in, and redirect to the user’s profile page. Let’s take this step by step, starting with creating a new <code>User</code> object and saving it to the database.</p>
    <h3>Saving a New User Object</h3>
    <p>Add in lines five and 17-19 to</p>
    <p><code>routes.py.</code></p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    from flask import render_template, request, flash, session, url_for, redirect&#x000A;    from forms import ContactForm, SignupForm&#x000A;    from flask.ext.mail import Message, Mail&#x000A;    from models import db, User&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/signup', methods=['GET', 'POST'])&#x000A;    def signup():&#x000A;      form = SignupForm()&#x000A;      &#x000A;      if request.method == 'POST':&#x000A;        if form.validate() == False:&#x000A;          return render_template('signup.html', form=form)&#x000A;        else:&#x000A;          newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)&#x000A;          db.session.add(newuser)&#x000A;          db.session.commit()&#x000A;          &#x000A;          return "[1] Create a new user [2] sign in the user [3] redirect to the user's profile"&#x000A;      &#x000A;      elif request.method == 'GET':&#x000A;        return render_template('signup.html', form=form)</pre>
    <p>First, we import the <code>User</code> class from models.py so that we can use it in the <code>signup()</code> function (line five). Then we create a new <code>User</code> object called <code>newuser</code> and populate it with the signup form's field data (line 17).</p>
    <p>Next, we add <code>newuser</code> to the database object's session (line 18), which is Flask-SQLAlchemy's version of a regular database transaction. The <code>add()</code> function generates an <code>INSERT</code> statement using the <code>User</code> object's attributes. The equivalent SQL for this Flask-SQLAlchemy expression is:</p>
    <pre>  INSERT INTO users (firstname, lastname, email, pwdhash)&#x000A;      VALUES (form.firstname.data, form.lastname.data, form.email.data, form.password.data)  </pre>
    <p>Lastly, we update the database with the new user record by committing the transaction (line 19).</p>
    <h3>Signing in the User</h3>
    <p>Next, we need to sign in the user. The Flask app needs to know that subsequent page requests are coming from the browser of the user who has successfully signed up. We can accomplish this by setting a cookie in the user's browser containing some sort of ID and associating that key with the user's credentials in the Flask app.</p>
    <p>This way, the ID in the browser's cookie will be passed to the app on each subsequent page request, and the app will look up the ID to determine whether it maps to valid user credentials.</p>
    <p>If it does, the app allows access to the parts of the website that you need to be signed in for. This combination of having a key stored on the client and a value stored on the server is called a session.</p>
    <p>Flask has a <code>session</code> object that accomplishes this functionality. It stores the session key in a secure cookie on the client and the session value in the app. Let's use it in our <code>signup()</code> function.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>from flask import render_template, request, flash, session&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/signup', methods=['GET', 'POST'])&#x000A;    def signup():&#x000A;      form = SignupForm()&#x000A;      &#x000A;      if request.method == 'POST':&#x000A;        if form.validate() == False:&#x000A;          return render_template('signup.html', form=form)&#x000A;        else:&#x000A;          newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)&#x000A;          db.session.add(newuser)&#x000A;          db.session.commit()&#x000A;          &#x000A;          session['email'] = newuser.email&#x000A;          &#x000A;          return "[1] Create a new user [2] sign in the user [3] redirect to the user's profile"&#x000A;      &#x000A;      elif request.method == 'GET':&#x000A;        return render_template('signup.html', form=form)</pre>
    <p>We start by importing Flask's <code>session</code> object on line one. Next, we associate the key '<code>email</code>' with the value of the newly registered user's email (line 17). The <code>session</code> object will take care of hashing '<code>email</code>' into an excrypted ID and storing it in a cookie on the user's browser. At this point, the user is signed in to our app.</p>
    <h3>Redirecting to a Profile page</h3>
    <p>The last step is to redirect the user to a Profile page after signing in. We'll use the <code>url_for</code> function (which we've seen in <code>layout.html</code> and <code>contact.html</code>) in conjunction with Flask's <code>redirect()</code> function.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>from intro_to_flask import app&#x000A;    from flask import render_template, request, flash, session, url_for, redirect&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/signup', methods=['GET', 'POST'])&#x000A;    def signup():&#x000A;      form = SignupForm()&#x000A;      &#x000A;      if request.method == 'POST':&#x000A;        if form.validate() == False:&#x000A;          return render_template('signup.html', form=form)&#x000A;        else:&#x000A;          newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)&#x000A;          db.session.add(newuser)&#x000A;          db.session.commit()&#x000A;          &#x000A;          session['email'] = newuser.email&#x000A;          return redirect(url_for('profile'))&#x000A;      &#x000A;      elif request.method == 'GET':&#x000A;        return render_template('signup.html', form=form)&#x000A;    </pre>
    <p>on line two, we import Flask's <code>url_for()</code> and <code>redirect()</code> functions. Then on line 19, we replace our temporary placeholder string with a redirect to the URL <code>/profile</code>. We don't have a URL mapping for <code>/profile</code> yet, so let's create that next.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>@app.route('/profile')&#x000A;    def profile():&#x000A;    &#x000A;      if 'email' not in session:&#x000A;        return redirect(url_for('signin'))&#x000A;    &#x000A;      user = User.query.filter_by(email = session['email']).first()&#x000A;    &#x000A;      if user is None:&#x000A;        return redirect(url_for('signin'))&#x000A;      else:&#x000A;        return render_template('profile.html')&#x000A;    </pre>
    <p>Here we can finally see sessions in action. We start on line four by fetching the browser's cookie and checking if it contains a key named '<code>email</code>'. If it doesn't exist, that means the user is not authenticated, so we redirect the user to a signin page (we'll create this in the next section).</p>
    <p>If the '<code>email</code>' key does exist, we look up the server-side user email value associated with the key using <code>session['email']</code>, and then query the database for a registered user with this same email address (line seven). The equivalent SQL for this Flask-SQLAlchemy expression is:</p>
    <pre>SELECT * FROM users WHERE email = session['email'];</pre>
    <p>If no registered user exists, we'll redirect to the signup page. Otherwise, we render the <code>profile.html</code> template. Let's create <code>profile.html</code> now.</p>
    <p><code>app/intro_to_flask/templates/profile.html</code></p>
    <pre>{% extends "layout.html" %}&#x000A;    {% block content %}&#x000A;      &lt;div class="jumbo"&gt;&#x000A;        &lt;h2&gt;Profile&lt;h2&gt;&#x000A;        &lt;h3&gt;This is {{ session['email'] }}'s profile page&lt;h3&gt;&#x000A;      &lt;/div&gt;&#x000A;    {% endblock %}</pre>
    <p>I've kept this profile template simple. If we focus in on line five — you'll see that we can use Flask's <code>session</code> object inside Jinja2 templates. Here, I've used it to create a user-specific string, but you could use this ability to pull other types of user-specific information instead.</p>
    <p>We're finally ready to see the result of all our hard work. Type the following into your terminal:</p>
    <pre>$ python runserver.py</pre>
    <p>Go to <a href="http://localhost:5000/signup" rel="nofollow external" class="bo">http://localhost:5000/</a> in your favorite web browser, and complete the sign up process. You should be greeted with a profile page that looks like the following screenshot:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/authors/lalith-polepeddi/intro-to-flask-p3-profile.png" alt="A successful sign up!" style="max-width: 100%; height: auto;"><br> <p>Signing up users is a huge milestone for our app. We can adapt the code in our <code>/signup()</code> function and round out our authentication system by allowing users to sign in and out of the app.</p>
    <p>— <code>Checkpoint: 17_profile_page</code> —</p>
    <hr>
    <h2>Building a Signin Page</h2>
    <p>Creating a signin page is similar to creating a signup page — we'll need to create a signin form, a URL mapping, and a web template. Let's start by creating the <code>SigninForm</code> class in <code>forms.py</code>.</p>
    <p><code>app/intro_to_flask/forms.py</code></p>
    <pre>class SigninForm(Form):&#x000A;      email = TextField("Email",  [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])&#x000A;      password = PasswordField('Password', [validators.Required("Please enter a password.")])&#x000A;      submit = SubmitField("Sign In")&#x000A;      &#x000A;      def __init__(self, *args, **kwargs):&#x000A;        Form.__init__(self, *args, **kwargs)&#x000A;    &#x000A;      def validate(self):&#x000A;        if not Form.validate(self):&#x000A;          return False&#x000A;        &#x000A;        user = User.query.filter_by(email = self.email.data.lower()).first()&#x000A;        if user and user.check_password(self.password.data):&#x000A;          return True&#x000A;        else:&#x000A;          self.email.errors.append("Invalid e-mail or password")&#x000A;          return False</pre>
    <p>The <code>SigninForm</code> class is similar to the <code>SignupForm</code> class. To sign a user in, we need to capture their email and password, so we create those two fields with presence and format validators (lines 2-3). Then we define our custom validator inside the <code>validate()</code> function (lines 10-15). This time the validator needs to make sure the user exists in the database and has the correct password. If a record does exist with the supplied information, we check to see if the password matches (line 14). If it does, the validation check passes (line 15), otherwise they get an error message.</p>
    <p>Next, let's create a URL mapping in <code>routes.py</code>.</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>...&#x000A;    from forms import ContactForm, SignupForm, SigninForm&#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/signin', methods=['GET', 'POST'])&#x000A;    def signin():&#x000A;      form = SigninForm()&#x000A;      &#x000A;      if request.method == 'POST':&#x000A;        if form.validate() == False:&#x000A;          return render_template('signin.html', form=form)&#x000A;        else:&#x000A;          session['email'] = form.email.data&#x000A;          return redirect(url_for('profile'))&#x000A;                    &#x000A;      elif request.method == 'GET':&#x000A;        return render_template('signin.html', form=form) &#x000A;    </pre>
    <p>Once again, the <code>signin()</code> function is similar to the <code>signup()</code> function. We import <code>SigninForm</code> (line two), so that we can use it in the <code>signin()</code> function. Then in <code>signin()</code>, we return the <code>signin.html</code> template for GET requests (lines 17-18).</p>
    <p>If the form has been POSTed and any validation check fails, the signin form reloads with a helpful error message (lines 11-12). Otherwise, we sign in the user by creating a new session and redirecting to their profile page (lines 14-15).</p>
    <p>Lastly, let's create the web template <code>signin.html</code>.</p>
    <p><code>app/intro_to_flask/templates/signin.html</code></p>
    <pre>{% extends "layout.html" %}&#x000A;    &#x000A;    {% block content %}&#x000A;      &lt;h2&gt;Sign In&lt;/h2&gt;&#x000A;    &#x000A;      {% for message in form.email.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      {% for message in form.password.errors %}&#x000A;        &lt;div class="flash"&gt;{{ message }}&lt;/div&gt;&#x000A;      {% endfor %}&#x000A;      &#x000A;      &lt;form action="{{ url_for('signin') }}" method=post&gt;&#x000A;        {{ form.hidden_tag() }}&#x000A;        &#x000A;        {{ form.email.label }}&#x000A;        {{ form.email }}&#x000A;        &#x000A;        {{ form.password.label }}&#x000A;        {{ form.password }}&#x000A;        &#x000A;        {{ form.submit }}&#x000A;      &lt;/form&gt;&#x000A;        &#x000A;    {% endblock %}</pre>
    <p>Similar to <code>signup.html</code> template, we first loop through and display any error messages, then we let Jinja2 generate the form for us.</p>
    <p>And that does it for the signin page. Visit <a href="http://localhost:5000/signin" rel="nofollow external" class="bo">http://localhost:5000/signin</a> to check it out. Go ahead and sign in, you should get redirected to your profile page.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/authors/lalith-polepeddi/intro-to-flask-p3-signin.png" alt="A successful sign in." style="max-width: 100%; height: auto;"><br> <p>— <code>Checkpoint: 18_signin_form</code> —</p>
    <hr>
    <h2>Signing Out</h2>
    <p>In "The First Signup" section above, we saw that "signing in" meant setting a cookie in the user's browser containing an ID and associating that ID with the user's data in the Flask app. Therefore, "signing out" means clearing the cookie in the browser and dissociating the user data.</p>
    <p>This can be accomplished in one line: <code>session.pop('email', None)</code>.</p>
    <p>We don't need a form or even a web template to sign out. All we need is a URL mapping in <code>routes.py</code>, which terminates the session and redirects to the Home page. The mapping, therefore, is short and sweet:</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>@app.route('/signout')&#x000A;    def signout():&#x000A;    &#x000A;      if 'email' not in session:&#x000A;        return redirect(url_for('signin'))&#x000A;        &#x000A;      session.pop('email', None)&#x000A;      return redirect(url_for('home'))</pre>
    <p>The user is not authenticated if the browser's cookie does not contain a key named '<code>email</code>', in that case, we just redirect to the signin page (lines 4-5). Otherwise, we terminate the session (line seven) and redirect back to the home page (line eight).</p>
    <p>You can test the sign out functionality by visiting <a href="http://localhost:5000/signout" rel="nofollow external" class="bo">http://localhost:5000/signout</a>. If you're signed in, the app will sign you out and redirect to <a href="http://localhost:5000/" rel="nofollow external" class="bo">http://localhost:5000/</a>. Once you've signed out, try visiting the profile page <a href="http://localhost:5000/profile" rel="nofollow external" class="bo">http://localhost:5000/profile</a>. You shouldn't be allowed to see the profile page if you're not signed in, and the app should redirect you back to the Signin page.</p>
    <p>— <code>Checkpoint: 19_signout</code> —</p>
    <hr>
    <h2>Tidying Up</h2>
    <p>Now we need to update the site header with navigation links for "Sign Up", "Sign In", "Profile", and "Sign Out". The links should change based on whether the user is signed in or not. If the user is signed out, links for "Sign Up" and "Sign In" should be visible. When the user is signed in, we want links for "Profile" and "Sign Out" to appear, while hiding the "Sign Up" and "Sign In" links.</p>
    <p>So how can we do this? Think back to the <code>profile.html</code> template where we used Flask's <code>session</code> object. We can use the <code>session</code> object to show navigation links based on the user's authentication status. Let's open <code>layout.html</code> and make the following changes:</p>
    <p><code>app/intro_to_flask/templates/layout.html</code></p>
    <pre>&lt;!DOCTYPE html&gt;&#x000A;    &lt;html&gt;&#x000A;      &lt;head&gt;&#x000A;        &lt;title&gt;Flask App&lt;/title&gt;&#x000A;        &lt;link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"&gt;&#x000A;      &lt;/head&gt;&#x000A;      &lt;body&gt;&#x000A;    &#x000A;      &lt;header&gt;&#x000A;        &lt;div class="container"&gt;&#x000A;          &lt;h1 class="logo"&gt;Flask App&lt;/h1&gt;&#x000A;          &lt;nav&gt;&#x000A;            &lt;ul class="menu"&gt;&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('home') }}"&gt;Home&lt;/a&gt;&lt;/li&gt;&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('about') }}"&gt;About&lt;/a&gt;&lt;/li&gt;&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('contact') }}"&gt;Contact&lt;/a&gt;&lt;/li&gt;&#x000A;              {% if 'email' in session %}&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('profile') }}"&gt;Profile&lt;/a&gt;&lt;/li&gt;&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('signout') }}"&gt;Sign Out&lt;/a&gt;&lt;/li&gt;&#x000A;              {% else %}&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('signup') }}"&gt;Sign Up&lt;/a&gt;&lt;/li&gt;&#x000A;              &lt;li&gt;&lt;a href="{{ url_for('signin') }}"&gt;Sign In&lt;/a&gt;&lt;/li&gt;&#x000A;              {% endif %}&#x000A;            &lt;/ul&gt;&#x000A;          &lt;/nav&gt;&#x000A;        &lt;/div&gt;&#x000A;      &lt;/header&gt;&#x000A;    &#x000A;        &lt;div class="container"&gt;&#x000A;          {% block content %}&#x000A;          {% endblock %}&#x000A;        &lt;/div&gt;&#x000A;    &#x000A;      &lt;/body&gt;&#x000A;    &lt;/html&gt;</pre>
    <p>Starting on line 17, we use Jinja2's <code>if...else</code> syntax and the <code>session()</code> object to check if the browser's cookie contains the '<code>email</code>' key. If it does, then the user is signed in and therefore should see the "Profile" and "Sign Out" navigation links. Otherwise, the user is signed out and should see links to "Sign Up" and "Sign In".</p>
    <p>Now give it a try! Check out how the navigation links appear and disappear by signing in and out of the app.</p>
    <p>The last task remaining is a similar issue: when a user is signed in, we don't want him to be able to visit the signup and signin pages. It makes no sense for a signed in user to authenticate themselves again. If signed in users try to visit these pages, they should instead be redirected to their profile page. Open <code>routes.py</code> and add the following piece of code to the beginning of the <code>signup()</code> and <code>signin()</code> functions:</p>
    <pre>if 'email' in session:&#x000A;      return redirect(url_for('profile'))&#x000A;    </pre>
    <p>Here's what your <code>routes.py</code> file will look like after adding in that snippet of code:</p>
    <p><code>app/intro_to_flask/routes.py</code></p>
    <pre>@app.route('/signup', methods=['GET', 'POST'])&#x000A;    def signup():&#x000A;      form = SignupForm()&#x000A;    &#x000A;      if 'email' in session:&#x000A;        return redirect(url_for('profile')) &#x000A;    .&#x000A;    .&#x000A;    .&#x000A;    @app.route('/signin', methods=['GET', 'POST'])&#x000A;    def signin():&#x000A;      form = SigninForm()&#x000A;    &#x000A;      if 'email' in session:&#x000A;        return redirect(url_for('profile'))  &#x000A;      ...&#x000A;    </pre>
    <p>And with that we're finished! Try visiting the the "signup" or "signin" pages while you are currently signed in, to test it out.</p>
    <p>— <code>Checkpoint: 20_visibility_control</code> —</p>
    <hr>
    <h2>Conclusion</h2>
    <p>We've accomplished a lot in this article. We've taken our Flask app from being a simple Python module and turned it into a well organized application, capable of handling user authentication.</p>
    <p>There are several directions in which you can take this app from here. Here are some ideas:</p>
    <ul>
    <li>Let users sign in with an existing account, such as their Google account, by adding support for OpenID.</li>
    <li>Give users the ability to update their account information, as well as delete their account.</li>
    <li>Let users reset their password if they forget it.</li>
    <li>Implement an authorization system.</li>
    <li>Deploy to a production server. Note that when you deploy this app to production, you will need to implement SSL site-wide so that passwords and session tokens cannot be intercepted. If you deploy to Heroku, you can use their SSL certificate.</li>
    </ul>
    <p>So go forth and continue to <a href="http://flask.pocoo.org/docs/" rel="nofollow external" class="bo">explore Flask</a>, and build your next killer app! Thanks for reading.</p>
    </div>
]]>
</Body>
<Summary>Many web applications require users to sign in and out in order to perform important tasks (like administration duties). In this article, we’ll create an authentication system for our application....</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/E4cf3iGOp7M/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31231/guest@my.umbc.edu/389681dc0188bb2681eee0273ca5dd04/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>flask</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>python</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, 12 Jun 2013 19:53:13 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 19:53:13 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31232" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31232">
<Title>Bits Blog: Today&#8217;s Scuttlebot: Bitcoin Sell-Off and an Apple Star</Title>
<Body>
<![CDATA[
    <div class="html-content">The technology reporters and editors of The New York Times scour the Web for important and peculiar items. Wednesday’s selections look at the impact of government surveillance revelations on digital currency trading and at a software executive’s good reviews at an Apple event.<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F06%2F12%2Ftodays-scuttlebot-bitcoin-sell-off-and-an-apple-star%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Bitcoin+Sell-Off+and+an+Apple+Star" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F06%2F12%2Ftodays-scuttlebot-bitcoin-sell-off-and-an-apple-star%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Bitcoin+Sell-Off+and+an+Apple+Star" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F06%2F12%2Ftodays-scuttlebot-bitcoin-sell-off-and-an-apple-star%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Bitcoin+Sell-Off+and+an+Apple+Star" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F06%2F12%2Ftodays-scuttlebot-bitcoin-sell-off-and-an-apple-star%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Bitcoin+Sell-Off+and+an+Apple+Star" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F06%2F12%2Ftodays-scuttlebot-bitcoin-sell-off-and-an-apple-star%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Bitcoin+Sell-Off+and+an+Apple+Star" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/165665112962/u/0/f/640387/c/34625/s/2d35fe1b/kg/342-363/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/165665112962/u/0/f/640387/c/34625/s/2d35fe1b/kg/342-363/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>The technology reporters and editors of The New York Times scour the Web for important and peculiar items. Wednesday’s selections look at the impact of government surveillance revelations on...</Summary>
<Website>http://bits.blogs.nytimes.com/2013/06/12/todays-scuttlebot-bitcoin-sell-off-and-an-apple-star/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31232/guest@my.umbc.edu/3a8792a45f41dec77db304a7e657d53a/api/pixel</TrackingUrl>
<Tag>new</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 19:52:42 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31229" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31229">
<Title>Automatic Configuration in Xcode 5</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Xcode now offers a seamless way to manage your development assets. With Automatic Configuration in Xcode 5, you can now provision, sign, and enable Apple services such as iCloud and Game Center right inside Xcode. To learn more, see <a href="https://developer.apple.com/technologies/tools/whats-new.html" rel="nofollow external" class="bo">What's New in Xcode</a>.</p>
    <img src="http://devimages.apple.com.edgekey.net/news/images/feed-images/xcode.png" style="max-width: 100%; height: auto;"><br>
    </div>
]]>
</Body>
<Summary>Xcode now offers a seamless way to manage your development assets. With Automatic Configuration in Xcode 5, you can now provision, sign, and enable Apple services such as iCloud and Game Center...</Summary>
<Website>https://developer.apple.com/news/index.php?id=6122013a</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31229/guest@my.umbc.edu/a410c354c929c211df056b73269851ff/api/pixel</TrackingUrl>
<Tag>apple</Tag>
<Tag>developer</Tag>
<Tag>ios</Tag>
<Tag>ipad</Tag>
<Tag>iphone</Tag>
<Tag>ipod</Tag>
<Tag>objective-c</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, 12 Jun 2013 19:50:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="34057" important="false" status="posted" url="https://my3.my.umbc.edu/posts/34057">
<Title>Automatic Configuration in Xcode 5</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Xcode now offers a seamless way to manage your development assets. With Automatic Configuration in Xcode 5, you can now provision, sign, and enable Apple services such as iCloud and Game Center right inside Xcode. To learn more, see <a href="https://developer.apple.com/technologies/tools/whats-new.html" rel="nofollow external" class="bo">What's New in Xcode</a>.</p>
    <img src="http://devimages.apple.com.edgekey.net/news/images/feed-images/xcode.png" style="max-width: 100%; height: auto;"><br>
    </div>
]]>
</Body>
<Summary>Xcode now offers a seamless way to manage your development assets. With Automatic Configuration in Xcode 5, you can now provision, sign, and enable Apple services such as iCloud and Game Center...</Summary>
<Website>http://developer.apple.com/news/index.php?id=6122013a</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/34057/guest@my.umbc.edu/3d4ca58e7a1cad5c7429080515b17f9c/api/pixel</TrackingUrl>
<Tag>apple</Tag>
<Tag>developer</Tag>
<Tag>ios</Tag>
<Tag>ipad</Tag>
<Tag>iphone</Tag>
<Tag>ipod</Tag>
<Tag>objective-c</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, 12 Jun 2013 19:50:00 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 19:50:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="34058" important="false" status="posted" url="https://my3.my.umbc.edu/posts/34058">
<Title>Promote Your Apps with iAd Workbench</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>iAd Workbench is a new, do-it-yourself campaign creation and management tool that makes it easy to promote your iOS apps on the iAd App Network. You can build customized banners in minutes, select your audience and target price, and track the performance of your campaign. <a href="http://advertising.apple.com/tools/iad-workbench/" rel="nofollow external" class="bo">Learn more</a>.</p></div>
]]>
</Body>
<Summary>iAd Workbench is a new, do-it-yourself campaign creation and management tool that makes it easy to promote your iOS apps on the iAd App Network. You can build customized banners in minutes, select...</Summary>
<Website>http://developer.apple.com/news/index.php?id=6122013b</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/34058/guest@my.umbc.edu/e59afbd0ca224a8d2bfefc6744fb6cc6/api/pixel</TrackingUrl>
<Tag>apple</Tag>
<Tag>developer</Tag>
<Tag>ios</Tag>
<Tag>ipad</Tag>
<Tag>iphone</Tag>
<Tag>ipod</Tag>
<Tag>objective-c</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, 12 Jun 2013 19:50:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31233" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31233">
<Title>Sencha Gains Support from SmartBear HTML5 Testing Tool</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>SmartBear Software has announced their latest version of their HTML5 testing tool, TestComplete, no providing support for Sencha Ext JS and more.</p></div>
]]>
</Body>
<Summary>SmartBear Software has announced their latest version of their HTML5 testing tool, TestComplete, no providing support for Sencha Ext JS and more.</Summary>
<Website>http://www.htmlgoodies.com/daily_news/sencha-gains-support-from-smartbear-html5-testing-tool.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31233/guest@my.umbc.edu/a94e05e87fcb317bbe874d1aa267970d/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</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, 12 Jun 2013 19:45:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="123255" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123255">
<Title>At Play &#8211; Summer 2013</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <img width="150" height="150" src="https://umbc.edu/wp-content/uploads/2013/06/atplay_kendo-150x150.jpg" alt="" style="max-width: 100%; height: auto;"><h3>BLADE RUNNERS</h3>
    <p>On a Thursday night at the Retriever Activities Center, amidst a hard-fought pickup game of basketball  and  wrestling practice on large mats, a group clad in loose-fitting, traditional Japanese-style garments clashes with wooden training swords called <em>shinai</em>.</p>
    <p>These warriors are members of the UMBC Kendo Club, students of the samurai tradition of <em>kendo</em>, or “The Way of the Sword.” Over a 90-minute training session, they engage with head-and-body-armored instructors from a group called Baltimore-Annapolis Kendo in controlled exercises and watch demonstrations of the sort of action group members might expect in kendo competitions.</p>
    <p>The club was founded in 2010, when club president and co-founder <strong>Christopher Nam ’13, biology</strong>, transferred to UMBC from Virginia Tech, where he’d taken up kendo as a way of dealing with ADHD. “When I thought about all the clubs UMBC had to offer, I felt that kendo was a better alternative to many,” says Nam, who observes that kendo disciplines not only the body, but also the mind.</p>
    <p>Instructor <strong>Phil Van Den Berghe ’09, computer science</strong>, agrees. “On the surface, it looks like just a lot of fighting and hitting with sticks, but it’s a lot deeper than that,” he says. “The real purpose of kendo isn’t to learn how to fight, but to learn how to be a better person.”</p>
    <p>The club initially held its sessions off campus due to lack of space, but full recognition as a club sport last year has spurred interest and membership. Kendo club vice president <strong>Mirsaid Parmanov ’13, biology </strong>says: “I can definitely see the club being here for a long time.”</p>
    <p><em> – Nathan Glover ’12</em></p>
    <h3>POWER PLAY</h3>
    <p><a href="/wp-content/uploads/2013/06/atplay_chess.jpg" rel="nofollow external" class="bo"><img src="/wp-content/uploads/2013/06/atplay_chess.jpg" alt="Chess team at state house image" width="235" height="176" style="max-width: 100%; height: auto;"></a>UMBC’s chess team is a regular contender at the annual President’s Cup, also known as the “Final Four” of chess. But UMBC’s elite chess players recently sought out a game in a different venue: the state capitol building in Annapolis.</p>
    <p>During this year’s session of the Maryland General Assembly, UMBC’s chess team was formally recognized on the floor of both the state’s Senate and its House of Delegates with a citation from Speaker Pro Tem and UMBC alumna <strong>Adrienne Jones ’76, psychology</strong>.</p>
    <p>Members of the team also stayed to play a series of friendly chess matches with the members of the Maryland General Assembly Chess Challenge, including Senators Jamie Raskin, Bryan Simonaire and Ulysses Currie. (Currie co-sponsored the Senate recognition of the team with Senate President Thomas V. Mike Miller, Jr.)</p>
    <p>“We ended up playing for about two hours games with some of the senators,” said <strong>Sabina Foisor ’12, modern languages and linguistics</strong>, a team member who is currently a graduate student at UMBC.  “We all had a good time and hope to be able to do it again.”</p>
    <p>Collin Wojciechowski ’13, <strong>political science and media &amp; communication studies</strong>, who also serves as UMBC’s government relations assistant, observed that the event was not set up as tournament-style play, but rather a sort of round-robin in which each student played a legislator multiple times.</p>
    <p>“From what I saw,” says Wojciechowski, “a legislator never won a game.”</p>
    <p><em>–  Nicole Ruediger</em></p>
    <h3>WORD POWER</h3>
    <p><a href="/wp-content/uploads/2013/06/atplay_scrabble-9228.jpg" rel="nofollow external" class="bo"><img src="/wp-content/uploads/2013/06/atplay_scrabble-9228.jpg" alt="Scrabble image" width="235" height="353" style="max-width: 100%; height: auto;"></a>For most people, Scrabble is just a word game. For <strong>Linda Oliva</strong>, it’s a ticket to the world.</p>
    <p>Oliva, an assistant professor of secondary education at UMBC, plays in three local clubs, including one on campus, and teaches the game at school Scrabble clubs. She has played on the national competitive circuit for 12 years, attended the national tournament six times and even competed in Italian.</p>
    <p>This summer, in fact, she’s going on a three-week Adriatic cruise, “playing Scrabble when we’re not visiting amazing places.” It’s her fourth Scrabble cruise.</p>
    <p>The game got her started, but fellow players keep her interested. “You play with such diverse people,” she said. She’s met musicians and mathematicians, retired librarians and a man determined to visit every Starbucks. “They’re a colorful group,” she said.</p>
    <p>Dr. Oliva usually travels with her friend, Dave Engelhart, to two tournaments a month.  They’ve taken their boards — hers is custom-made — to tournaments in South America, New Zealand and Southeast Asia.</p>
    <p>“The good thing about scrabble is anybody can play,” she said.</p>
    <p>And, in fact, Oliva is such a believer she has spread the Scrabble obsession to several Baltimore area schools, including Mount Pleasant Christian School, her first club, and Arbutus Middle School, where she has led their club to regional and national tournaments for three years.</p>
    <p>She teaches strategies for winning — rules about words and keeping an eye on those double- and triple-word scores.</p>
    <p>“There’s always the first play. And then there’s the best play,” she said.</p>
    <p>Her students have learned.</p>
    <p>“And then they beat me,” she said.</p>
    <p>“Coaching kids when they make a great move and get all these points, it’s really joyful,” Oliva explains. “They really enjoy playing and learning,”</p>
    <p>Oliva got hooked on the game playing with her family in Silver Spring. They not only played Scrabble, they finished each game by using all the words on the board to tell a story.</p>
    <p>Eventually Oliva discovered study is the key to winning and she started beating her older sister, Debbie, who is now a teacher.</p>
    <p>Important words good players know:</p>
    <ul>
    <li>All the two-letter words. “You shouldn’t even step foot in the club if you don’t know your two letter words,” she warned.</li>
    <li>Unusual words such as “howf.” “They are all good Scrabble words,” she said.</li>
    <li>Seven-letter words. (Remember “retinas.” It’s a high-frequency bingo word.)</li>
    </ul>
    <p>Oliva has a curiosity about words — from their meanings to working out anagrams – to the point where she’s worn out a dictionary. “I love it because I keep learning,” she said.</p>
    <p><em>–  Mary K. Tilghman ’79 </em></p>
    <p><em>UMBC’s Scrabble Club meets Mondays in the Administration Building lobby, 7-11 p.m.</em></p>
    <h3>A SIDELINE VIEW</h3>
    <p><a href="/wp-content/uploads/2013/06/atplay_trophy.jpg" rel="nofollow external" class="bo"><img src="/wp-content/uploads/2013/06/atplay_trophy.jpg" alt="Doc with super bowl trophy" width="235" height="294" style="max-width: 100%; height: auto;"></a>It doesn’t get much better than watching your favorite team win the Super Bowl – especially if you work closely with them and get to be there in person.</p>
    <p><strong>Alan Sokoloff ’82, health science and policy</strong>, headed to New Orleans earlier this year as one of the team chiropractors for the Baltimore Ravens. Sokoloff helps tend to player injuries, but he also assists healthy Ravens in getting their joints functioning as efficiently as possible in order to gain a competitive edge.</p>
    <p>“At the NFL level, that one one-hundredth of a second makes a huge difference between getting tackled and scoring a touchdown,” he says.</p>
    <p>A back injury in college from carrying disc jockey equipment was what first prompted Sokoloff to see a chiropractor. He grew so fascinated by the profession that he ended up studying it.</p>
    <p>After attending chiropractic school in Iowa, Sokoloff returned to Baltimore to open his own practice. He interned with the United States Olympic Training Center, earning a spot on the medical team for the 1998 Goodwill Games and 1999 Pan Am games. Those experiences led him directly to a spot with the Ravens, with whom he has worked for 13 years.</p>
    <p>Sokoloff says that being able to make a difference when it comes to a player’s performance is the real motivation for his football work. “It’s not all glamour,” he says, “but there’s so much satisfaction in knowing you’re one of the thousands of doctors who have actually gotten that far.”</p>
    <p>And it doesn’t hurt, of course, to get to see the Ravens win it all in the Superdome.</p>
    <p>“There’s just something about all that confetti falling,” Sokoloff says.</p>
    <p><em> – Laura Lefavor ’13</em></p>
    </div>
]]>
</Body>
<Summary>BLADE RUNNERS   On a Thursday night at the Retriever Activities Center, amidst a hard-fought pickup game of basketball  and  wrestling practice on large mats, a group clad in loose-fitting,...</Summary>
<Website>https://umbc.edu/stories/at-play-summer-2013/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123255/guest@my.umbc.edu/b782c6a02d7be8e3af8cd1a6ed89e6b2/api/pixel</TrackingUrl>
<Tag>campus-life</Tag>
<Tag>summer-2013</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 19:43:31 -0400</PostedAt>
</NewsItem>

</News>
