<?xml version="1.0"?>
<News hasArchived="true" page="8634" pageCount="10722" pageSize="10" timestamp="Sat, 11 Jul 2026 02:38:02 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8634">
<NewsItem contentIssues="false" id="106983" important="false" status="posted" url="https://my3.my.umbc.edu/posts/106983">
<Title>30 Days/30 Scholarships: Q&amp;A with Collin Wojciechowski</Title>
<Body>
<![CDATA[
    <div class="html-content">In his junior year at UMBC, Collin Wojciechowski ’13, political science, represented nearly 180,000 students within the University System of …</div>
]]>
</Body>
<Summary>In his junior year at UMBC, Collin Wojciechowski ’13, political science, represented nearly 180,000 students within the University System of …</Summary>
<Website>https://magazine.umbc.edu/30-days30-scholarships-qa-with-collin-wojciechowski-13/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/106983/guest@my.umbc.edu/61d6b7d89d9c4761f34dfbeaf5d166b2/api/pixel</TrackingUrl>
<Tag>impact</Tag>
<Group token="retired-1945">UMBC Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-1945</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1783534523</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/images/avatars/group/8/original.png?1783534523</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xxlarge.png?1783534523</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xlarge.png?1783534523</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/images/avatars/group/8/large.png?1783534523</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/images/avatars/group/8/medium.png?1783534523</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/images/avatars/group/8/small.png?1783534523</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1783534523</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/images/avatars/group/8/xxsmall.png?1783534523</AvatarUrl>
<Sponsor>UMBC Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 03:40:46 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31177" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31177">
<Title>13 Retrievers to Play Local Summer Ball in Cal Ripken League</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE � 13 UMBC baseball players will play locally this summer in the Cal Ripken Collegiate Baseball League, with two others playing in Maine and New York.  Four Retrievers will represent the Herndon (Va.) Braves, while three each will ply their trade for the Rockville Express, Silver Spring-Takoma Thunderbolts, and Vienna River Dogs.</div>
]]>
</Body>
<Summary>BALTIMORE � 13 UMBC baseball players will play locally this summer in the Cal Ripken Collegiate Baseball League, with two others playing in Maine and New York.  Four Retrievers will represent the...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8050</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31177/guest@my.umbc.edu/d9b34f18b0701a96232364e1d5cd8c31/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31212" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31212">
<Title>Men's Soccer Announces 2013 Fall Schedule</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE- The defending America East Conference men's soccer champion UMBC Retrievers will play 11 of 18 regular season games on the plush turf of Retriever Soccer Park, as the 2013 fall schedule was announced. In 22 seasons under Caringi, UMBC is 75-19-22 (.743) in 115 games on the Bermuda turf of Retriever Soccer Park.</div>
]]>
</Body>
<Summary>BALTIMORE- The defending America East Conference men's soccer champion UMBC Retrievers will play 11 of 18 regular season games on the plush turf of Retriever Soccer Park, as the 2013 fall schedule...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8051</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31212/guest@my.umbc.edu/8e62e6f4e2e22826469071e1dd192663/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31161" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31161">
<Title>Bitcoin Millionaires Become Investing Angels</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Early investors in Bitcoin got rich. Now they are the cryptocurrency’s most powerful gatekeepers.</p>
    <p>Every time you spend bitcoins to buy a drink at <a href="http://evrnyc.com/" rel="nofollow external" class="bo">Evr</a>, a swanky bar in midtown Manhattan that accepts the digital currency, you make its co-owner, Charlie Shrem, just a little bit richer.</p>
    </div>
]]>
</Body>
<Summary>Early investors in Bitcoin got rich. Now they are the cryptocurrency’s most powerful gatekeepers.  Every time you spend bitcoins to buy a drink at Evr, a swanky bar in midtown Manhattan that...</Summary>
<Website>http://www.technologyreview.com/news/515391/bitcoin-millionaires-become-investing-angels/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31161/guest@my.umbc.edu/e1ab4a0a37a2e6b2b093c4ac000fba83/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 00:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31160" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31160">
<Title>How Technology Is Destroying Jobs</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Automation is reducing the need for people in many jobs. Are we facing a future of stagnant income and worsening inequality?</p>
    <p>Given his calm and reasoned academic demeanor, it is easy to miss just how provocative Erik Brynjolfsson’s contention really is. ­Brynjolfsson, a professor at the MIT Sloan School of Management, and his collaborator and coauthor Andrew McAfee have been arguing for the last year and a half that impressive advances in computer technology—from improved industrial robotics to automated translation services—are largely behind the sluggish employment growth of the last 10 to 15 years. Even more ominous for workers, the MIT academics foresee dismal prospects for many types of jobs as these powerful new technologies are increasingly adopted not only in manufacturing, clerical, and retail work but in professions such as law, financial services, education, and medicine.</p>
    </div>
]]>
</Body>
<Summary>Automation is reducing the need for people in many jobs. Are we facing a future of stagnant income and worsening inequality?  Given his calm and reasoned academic demeanor, it is easy to miss just...</Summary>
<Website>http://www.technologyreview.com/featuredstory/515926/how-technology-is-destroying-jobs/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31160/guest@my.umbc.edu/b4a4338925023d45e743c9e403812ad1/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 00:00:00 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 00:00:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31156" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31156">
<Title>Working With Data in Sails.js</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31525&amp;c=864071245" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31525&amp;c=864071245" alt="" style="max-width: 100%; height: auto;"></a><p><a href="http://sailsjs.org/" rel="nofollow external" class="bo">Sails.js</a> is an up and coming Node.js framework, with a focus on freedom and smart defaults. In this article we’ll take a look at some of the data features Sails provides out-of-the-box, for easily making complex apps.</p>
    <p></p>
    <hr>
    <h2>Why Sails Is Different Than Other Frameworks</h2>
    <p>The reason to choose Sails is best put by the Sails creator, <a href="http://balderdash.co/" title="Mike McNeil" rel="nofollow external" class="bo">Mike McNeil</a>, "Sails was created out of necessity". Many frameworks you see around, are built almost for the academic side of things, these frameworks usually foster best practices, and create a platform for developers to create things faster, or better.</p>
    <p>Sails on the other hand, was created for production, it’s not trying to feed you a new syntax or platform, it’s a solid base, meant for creating 'client-work' with speed. The contrast may be subtle, but there are a few distinct differences.</p>
    <p>To illustrate what I’m referring to, let's take a look at <a href="http://meteor.com" title="Meteor" rel="nofollow external" class="bo">Meteor</a>. Meteor is probably the leading JS platform around today, but it’s a prime example of a framework, for the sake of a framework. Now this is not a bad thing, I am a big supporter of Meteor, what I mean is, they set out to build a framework and they did a good job at it, Mike on the other hand set out to make client-work faster. Sails is just a means to reach an end.</p>
    <p>In Meteor, pretty much everything is abstracted away and you use JavaScript plus the Meteor API to code everything. Whereas Sails is not meant to be a new platform, so nothing is hidden.</p>
    <p>It rests on top of Socket.io and the popular Express framework, and you have access to them in their entirety, natively. Are you beginning to see the difference?</p>
    <p>Furthermore, since Sails is geared for production first, it’s built with multiple options for scaling and security.</p>
    <p>There is alot to talk about, but in this article I would like to focus on how Sails handles data, and how you can leverage some of Sails' more advanced features to perform some really cool actions.</p>
    <hr>
    <h2>Installation</h2>
    <p>Just in case you do not have Sails intalled yet, you can do so via <a href="http://nodejs.org/download/" title="NPM + Node.JS" rel="nofollow external" class="bo">NPM</a> by running:</p>
    <pre>sudo npm install -g sails&#x000A;    </pre>
    <hr>
    <h2>Socket.io &amp; Express</h2>
    <p>Now let's talk a little bit about <a href="http://socket.io/" title="Socket.io" rel="nofollow external" class="bo">Socket.io</a> and <a href="http://expressjs.com/" rel="nofollow external" class="bo">Express</a> before we get into Sails. There’s a good premium series on <a href="https://tutsplus.com/course/building-web-apps-in-node-and-express/" title="Express Series" rel="nofollow external" class="bo">Express</a> by <a href="http://andrewburgess.ca/" title="Andrew Burgess" rel="nofollow external" class="bo">Andrew Burgess</a> if you’re interested, but I'll run through the relevant basics of both of these libraries here:</p>
    <h3>Socket.io</h3>
    <p>Socket.io is a pub/sub library, which is run on both the server and on the client, and it allows them to speak via web sockets.</p>
    <p>A brief example could look something like this:</p>
    <pre>//Code For Server&#x000A;    var io = require("socket.io");&#x000A;    io.sockets.on("connection", function (sock) {&#x000A;        sock.emit("welcomeMessage", { hello: "world" });&#x000A;    }&#x000A;    io.listen(80);&#x000A;    </pre>
    <p>This code starts out by requiring the <code>socket.io</code> library, listening for a connection, and then when another socket connects, it will send it a message, addressed to the <code>welcomeMessage</code> event, and finally passing along some JSON.</p>
    <p>Next, on the client you would write something like:</p>
    <pre>//Code For Client&#x000A;    var sock = io.connect('<a href="http://localhost">http://localhost</a>');&#x000A;    sock.on('welcomeMessage', function (json) {&#x000A;        //Handle Event Received&#x000A;    });&#x000A;    </pre>
    <p>Here we’re connecting to the server and listening for that <code>welcomeMessage</code> event we just created. As you can see it's a fairly simple publish / subscribe server, which is bidirectional (the client could emit messages for the server as well).</p>
    <p>Now let's take a look at Express:</p>
    <h3>Express</h3>
    <p>The simplest form of an Express route could be something like:</p>
    <pre>app.get('/users', function(req, res) {&#x000A;        res.send("Hello from '/users' !");&#x000A;    });&#x000A;    </pre>
    <p>This defines a simple route, so that when a user goes to your site's address and tries to access the <code>/users</code> page, they will be presented with the message <code>"Hello from '/users' !"</code>.</p>
    <p>So Express is a framework for handling HTTP requests and Socket.io is a websocket communications library. What the Sails team have done though, is map all Express routes to Socket.io internally. What this means is, you can call any of the HTTP routes through web sockets.</p>
    <p>Now that’s pretty cool! But, there is still one piece of the puzzle missing and that is the Sails Blueprints.</p>
    <p>Sails allows you to generate models just like in other frameworks, the difference is, Sails can also generate a production ready RESTfull API to go with them. This means if you generate a model named '<code>users</code>' you can immediately run RESTfull queries on the '<code>/users</code>' resource without any coding necessary.</p>
    <p>If you are new to RESTful APIs, it’s just a way of accessing data, to where CRUD operations are mapped to various HTTP methods.</p>
    <p>So a <code>GET</code> request to '<code>/users</code>' will get all of the users, a <code>POST</code> request will create a new user, etc.</p>
    <p>So what does all of this mean?</p>
    <p>It means we have a full RESTfull API, mapped to Socket.io via Sails, without writing a single line of code!</p>
    <p>But why are sockets better at retrieving data then an Ajax request? Well, besides being a leaner protocol, sockets stay open for bidirectional communication, and Sails has taken advantage of this. Not only will Sails pass you the data, but it will automatically subscribe you to updates on that database, and whenever something gets added, removed, or updated, your client will receive a notification via the web socket, letting you know about it.</p>
    <p>This is why Sails is so awesome!</p>
    <hr>
    <h2>Sails + Backbone</h2>
    <p>The next topic I’d like to cover is Backbone integration, because if you aren't using a JavaScript framework, you are doing it wrong.</p>
    <p>With this in mind, Sails and Backbone are the perfect pair. Backbone, like Sails, is extremely unobtrusive, all of its features are available, capable of being overridden, and optional.</p>
    <p>If you have used Backbone before then you may know it connects natively with REST APIs, so out of the box, you can sync the data on the front-end with your Sails application.</p>
    <p>But enough talk for now, let's take a look at all of this in action by creating a basic chat application. To get started, open up a terminal window and type:</p>
    <pre>sails new ChatApp&#x000A;    cd ChatApp&#x000A;    sails generate model users&#x000A;    sails generate model messages&#x000A;    sails generate controller messages&#x000A;    sails generate controller main&#x000A;    </pre>
    <p>This will create a new app and generate some files for us. You can see from above, there are two different resources that you can generate; models and controllers. If you are familiar with the MVC design pattern, then you should know what these are, but in short, models are your data and controllers hold your logic code. So we are going to need two collections, one to hold the users, and one for the messages.</p>
    <p>Next, for the controllers, we need one to handle the page routes, I called it '<code>main</code>', then we have a second controller named '<code>messages</code>'. Now you might wonder why I created a controller with the same name as our <code>messages</code> model? Well, if you remember, I said that Sails can create a REST API for you. What happens is, by creating a blank controller with the same name as a model, Sails will know to fall back and build a REST API for the corresponding resource.</p>
    <p>So, we’ve created a controller for our <code>messages</code> model, but there’s no need to create one for the users model, so I just left it out. And that’s all there is to creating models and controllers.</p>
    <p>Next, let’s setup some routes.</p>
    <h3>Routes</h3>
    <p>Routes are always a safe place to begin, because you usually have a good idea of which pages are going to be made.</p>
    <p>So open up the <code>routes.js</code> file which is in the <code>config</code> folder, it may look a little overwhelming at first, but if you remove all of the comments and add the in the following routes, you will be left with something like this:</p>
    <pre>module.exports.routes = {&#x000A;        '/' : {&#x000A;             controller: 'main',&#x000A;             action: 'index'&#x000A;        },&#x000A;        '/signup' : {&#x000A;             controller: 'main',&#x000A;             action: 'signup'&#x000A;        },&#x000A;        '/login' : {&#x000A;             controller: 'main',&#x000A;             action: 'login'&#x000A;        },&#x000A;        '/chat' : {&#x000A;             controller: 'main',&#x000A;             action: 'chat'&#x000A;        }&#x000A;    };&#x000A;    </pre>
    <p>We have a home page, a chat page, and then two pages for handling both the login and signup pages. I put them all in the same controller, but in Sails, you can create as many controllers as you’d like.</p>
    <h3>Models</h3>
    <p>Next, let's take a look at the generated <code>messages</code> model which can be located at "<code>api &gt; models &gt; Messages.js</code>". We need to add the necessary columns to our model. Now this is not absolutely necessary, but it will create some helper functions for us that we can use:</p>
    <pre>//Messages Model  &#x000A;    module.exports = {&#x000A;        attributes  : {&#x000A;            userId: 'INT',&#x000A;            username: 'STRING',&#x000A;            message: 'STRING'      &#x000A;        }&#x000A;    };&#x000A;    </pre>
    <p>For the <code>messages</code> model, we start with the <code>id</code> of the user that this message belongs to, a <code>username</code> so we won't have to query this separately, and then the actual <code>message</code>.</p>
    <p>Now let's fill in the user's model:</p>
    <pre>//Users Model &#x000A;    module.exports = {&#x000A;        attributes  : {&#x000A;             username: 'STRING',&#x000A;             password: 'STRING'      &#x000A;        }&#x000A;    };&#x000A;    </pre>
    <p>And that’s it, we have just the <code>username</code> and <code>password</code> attributes. The next step is to create our route functions inside of the <code>MainController</code>.</p>
    <h3>Controllers</h3>
    <p>So open up the <code>MainController</code>, which can be found at "<code>api &gt; controllers &gt; MainController.js</code>". Let's begin by creating a function for each of the routes we defined above:</p>
    <pre>var MainController = {&#x000A;        index: function (req, res) {&#x000A;            &#x000A;        },&#x000A;        signup: function (req, res) {&#x000A;            &#x000A;        },&#x000A;        login: function (req, res) {&#x000A;            &#x000A;        },&#x000A;        chat: function (req, res) {&#x000A;            &#x000A;        }&#x000A;    };&#x000A;    module.exports = MainController;   &#x000A;    </pre>
    <p>If you’re familiar with Express, then you’ll be happy to see that these functions are standard Express route functions. They receive two variables, <code>req</code> for the HTTP request and <code>res</code> to create the response.</p>
    <p>Following the MVC pattern, Sails offers a function for rendering views. The home page doesn't need anything special, so let's just render the view.</p>
    <pre>index: function (req, res) {&#x000A;        res.view();&#x000A;    },&#x000A;    </pre>
    <p>Sails leans more toward convention over configuration, so when you call <code>res.view();</code> Sails will look for a view file (with a <code>.ejs</code> extension by default) using the following pattern: '<code>views &gt; controllerName &gt; methodName.ejs</code>'. So for this call, it will search for '<code>views &gt; main &gt; index.ejs</code>'. It's also worth noting, these views only contain the view specific parts of the page. If you take a look at '<code>views &gt; layout.ejs</code>', you will see a call in the middle for <code>&lt;%- body %&gt;</code>, this is where your view file will be inserted. By default it uses this '<code>layout.ejs</code>' file, but you can use other layout files just by passing the layout name into the <code>res.view()</code> function, under the property named 'layout'. For example: '<code>res.view( { layout: "other.ejs" } );</code>'.</p>
    <p>I’m going to use the default layout file with a small adjustment, I’m going to add jQuery, Backbone, and Underscore. So in the '<code>layout.ejs</code>' file right before the closing <code>&lt;/head&gt;</code> tag, add the following lines:</p>
    <pre>&lt;script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"&gt;&lt;/script&gt;&#x000A;    &lt;script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"&gt;&lt;/script&gt;&#x000A;    &lt;script src="//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"&gt;&lt;/script&gt;&#x000A;    </pre>
    <p>With that in place we’re now ready to create the home page.</p>
    <h3>The Home Page</h3>
    <p>Let’s create a new folder inside of the <code>views</code> folder named <code>main</code>, and inside of our new <code>main</code> folder, we’ll create a new file named 'index.ejs'.</p>
    <p>Inside the file let's just create a login and signup form:</p>
    <pre>&lt;h1&gt;Code Chat&lt;/h1&gt;&#x000A;    &lt;div&gt;&#x000A;        &lt;h3&gt;Login&lt;/h3&gt;&#x000A;        &lt;input type="text" id="loginName" placeholder="name" /&gt;&#x000A;        &lt;input type="password" id="loginPassword" placeholder="password" /&gt;&#x000A;        &lt;button id="loginButton"&gt;Login&lt;/button&gt;&#x000A;    &lt;/div&gt;&#x000A;    &lt;div&gt;&#x000A;        &lt;h3&gt;Signup&lt;/h3&gt;&#x000A;        &lt;input type="text" id="signupName" placeholder="name" /&gt;&#x000A;        &lt;input type="password" id="signupPassword" placeholder="password" /&gt;&#x000A;        &lt;input type="password" id="signupConfirmPassword" placeholder="confirm password" /&gt;&#x000A;        &lt;button id="signupButton"&gt;Signup&lt;/button&gt;&#x000A;    &lt;/div&gt;&#x000A;    </pre>
    <p>Pretty simple, just the essentials.</p>
    <h3>The Login and Signup Areas</h3>
    <p>Next we need to add a little JS to get this communicating with the server. Now this won’t be Sails specific, we are just going to send an AJAX request via jQuery to the Sails server.</p>
    <p>This code can either be included on the page itself or loaded in via a separate JS file. For the sake of convenience, I’m just going to put it at the bottom of the same page:</p>
    <pre>&lt;script&gt;&#x000A;        $("#loginButton").click(function(){&#x000A;            var username = $("#loginName").val();&#x000A;            var password = $("#loginPassword").val();&#x000A;            if (username &amp;&amp; password) {&#x000A;                $.post(&#x000A;                    '/login',&#x000A;                    {username: username, password:password},&#x000A;                    function () {&#x000A;                        window.location = "/chat";&#x000A;                    }&#x000A;                ).fail(function(res){&#x000A;                    alert("Error: " + res.getResponseHeader("error"));&#x000A;                });&#x000A;            } else {&#x000A;                alert("A username and password is required");&#x000A;            }&#x000A;        });&#x000A;    &lt;/script&gt;&#x000A;    </pre>
    <p>This is all just standard JS and jQuery, we’re listening for the click event on the login button, making sure the username and password fields are filled in, and posting the data to the '<code>/login</code>' route. If the login is successful, we redirect the user to the chat page, otherwise we will display the error returned by the server.</p>
    <p>Next, let's create the same thing for the signup area:</p>
    <pre>$("#signupButton").click(function(){&#x000A;        var username = $("#signupName").val();&#x000A;        var password = $("#signupPassword").val();&#x000A;        var confirmPassword = $("#signupConfirmPassword").val();&#x000A;        if (username &amp;&amp; password) {&#x000A;            if (password === confirmPassword) {&#x000A;                $.post(&#x000A;                    '/signup',&#x000A;                    {username: username, password:password},&#x000A;                    function () {&#x000A;                        window.location = "/chat";&#x000A;                    }&#x000A;                ).fail(function(res){&#x000A;                    alert("Error: " + res.getResponseHeader("error"));&#x000A;                });&#x000A;            } else {&#x000A;                alert("Passwords don't match");&#x000A;            }   &#x000A;        } else {&#x000A;            alert("A username and password is required");&#x000A;        }&#x000A;    }); &#x000A;    </pre>
    <p>This code is almost identical, so much so, that you can probably just abstract the whole Ajax part out into its own function, but for this tutorial it's fine.</p>
    <p>Now we need to go back to our '<code>MainController</code>' and handle these two routes, but before we do that, I want to install a Node module. We’re going to need to hash the password, as plain text passwords are <em>not</em> a good thing, not even for demonstration! I found a nice module named <a href="https://npmjs.org/package/password-hash" title="Password-Hash NPM Module" rel="nofollow external" class="bo">'password-hash'</a> by <a href="https://twitter.com/bitprobe" title="David Wood" rel="nofollow external" class="bo">David Wood</a> which will work out nicely.</p>
    <p>To install it, just go to the root of your Sails app, from within your terminal and type: <code>npm install password-hash</code>.</p>
    <p>Once that installs, let's open the <code>MainController</code> and implement the two needed routes. Let’s start with <code>signup</code>:</p>
    <pre>signup: function (req, res) {&#x000A;            var username = req.param("username");&#x000A;            var password = req.param("password");&#x000A;            &#x000A;            Users.findByUsername(username).done(function(err, usr){&#x000A;                if (err) {&#x000A;                    res.send(500, { error: "DB Error" });&#x000A;                } else if (usr) {&#x000A;                    res.send(400, {error: "Username already Taken"});&#x000A;                } else {&#x000A;                    var hasher = require("password-hash");&#x000A;                    password = hasher.generate(password);&#x000A;                    &#x000A;                    Users.create({username: username, password: password}).done(function(error, user) {&#x000A;                    if (error) {&#x000A;                        res.send(500, {error: "DB Error"});&#x000A;                    } else {&#x000A;                        req.session.user = user;&#x000A;                        res.send(user);&#x000A;                    }&#x000A;                });&#x000A;            }&#x000A;        });&#x000A;    }&#x000A;    </pre>
    <p>It's a bit verbose, but all we’re doing here is reading the username and password from the POST request and making sure the username is not already taken. You can see I’m also using the password-hasher we just installed, it's super simple to use, just pass the password into the generate method and it will hash it using a random salt.</p>
    <p>It's also worth mentioning, that at every possible location where we may run into an error or issue, we’re sending back an HTTP error code and returning a message via a custom header named '<code>error</code>' which, if you remember, we’re displaying in an alert message on the index page.</p>
    <p>Another noteworthy point, is the fact that we’re using a 'magic' function named '<code>findByUsername</code>', this is made possible because we have a <code>username</code> column inside of our Users model.</p>
    <p>Finally, at the bottom you can see if everything went well, we’re storing the user in a session variable and returning it with a default status code of 200, which will tell jQuery that the AJAX request was successful.</p>
    <p>Next, let's write the login function:</p>
    <pre>login: function (req, res) {&#x000A;        var username = req.param("username");&#x000A;        var password = req.param("password");&#x000A;        &#x000A;        Users.findByUsername(username).done(function(err, usr) {&#x000A;            if (err) {&#x000A;                res.send(500, { error: "DB Error" });&#x000A;            } else {&#x000A;                if (usr) {&#x000A;                    var hasher = require("password-hash");&#x000A;                    if (hasher.verify(password, usr.password)) {&#x000A;                        req.session.user = usr;&#x000A;                        res.send(usr);&#x000A;                    } else {&#x000A;                        res.send(400, { error: "Wrong Password" });&#x000A;                    }&#x000A;                } else {&#x000A;                    res.send(404, { error: "User not Found" });&#x000A;                }&#x000A;            }&#x000A;        });&#x000A;    }&#x000A;    </pre>
    <p>Again, this is very similar to the previous <code>signup</code> function, we’re searching for a user with the same username that was posted from the form and if it finds one, we check if the password matches using the hasher’s <code>verify</code> method. The reason we can't just hash the password again and pass it into the models <code>find</code> function is because the hasher uses a random salt, so if we hashed the password again it would be equal to something else.</p>
    <p>The rest of the code is the same; if everything checks out, we store the user in a session and return it, otherwise we send back an error message.</p>
    <p>The login system is now complete and we’re finally able to move on to building the chat feature.</p>
    <h3>Building the Chat Feature</h3>
    <p>Since we’ll be using Backbone for getting the messages, the actual route function will be very simple. Here’s the complete chat function:</p>
    <pre>chat: function (req, res) {&#x000A;        if (req.session.user) {&#x000A;            res.view({username: req.session.user.username});&#x000A;        } else {&#x000A;            res.redirect('/');&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>We start off by checking if the user is logged in or not, if this checks out, then it will load the view, passing it the username that was in the session, otherwise we just redirect to the home page.</p>
    <p>Now let’s create a new view named '<code>chat.ejs</code>' inside of the <code>main</code> folder. Open it up and let's create a simple form to post new messages and a <code>div</code> container for displaying all of them.</p>
    <pre>&lt;h2&gt;Welcome &lt;%= username %&gt;&lt;/h2&gt;&#x000A;    &lt;div id="newMessageForm"&gt;&#x000A;        &lt;textarea id="message" placeholder="Enter your message here:"&gt;&lt;/textarea&gt;&#x000A;        &lt;button id="postMessageButton"&gt;Add Message&lt;/button&gt;&#x000A;    &lt;/div&gt;&#x000A;    &lt;div id="messagesContainer"&gt;&#x000A;    &lt;/div&gt;&#x000A;    </pre>
    <p>So for this view, we just used some pretty standard HTML. The only thing that may require some explanation is the <code>&lt;%= username %&gt;</code> code, this style of coding is not specific to Sails, it’s actually the syntax for EJS. This syntax is very similar to PHP’s short tags. <code>&lt;%</code> is the equivalent of <code>&lt;?</code> in PHP and <code>&lt;%=</code> is the same as <code>&lt;?=</code>. The first snippet of EJS allows you to integrate standard JS code on the page, whereas the second prints out the code within. Here we’re just printing out the username that we passed in from the controller.</p>
    <p>The rest of our chat feature will be all JavaScript. To get started, let's take a look at how you would write the chat functionality using standard Backbone, and then we’ll see how to take advantage of web sockets.</p>
    <p>At the bottom of the page, add the following JS:</p>
    <pre>&lt;script&gt;&#x000A;        var MessageModel = Backbone.Model.extend({&#x000A;            urlRoot: '/messages',&#x000A;        });&#x000A;    &#x000A;        var MessageCollection = Backbone.Collection.extend({&#x000A;            url: '/messages',&#x000A;            model: MessageModel,&#x000A;        });&#x000A;    &#x000A;        var messages = new MessageCollection();&#x000A;        messages.fetch();&#x000A;    &#x000A;        $("#postMessageButton").click(function(){&#x000A;            var messageText = $("#message").val();&#x000A;            messages.create({message: messageText}, {wait: true});&#x000A;            $("#message").val("");&#x000A;        });&#x000A;    &lt;/script&gt;&#x000A;    </pre>
    <p>Since Sails automatically creates an API that Backbone understands natively, no extra server code has to be written, it doesn’t get much easier than that. This is what I was talking about when I said that Sails was not made to be a 'framework'. It doesn't try to make you use its own syntax, it was made to get things done and as you can see, it delivers.</p>
    <p>To test it out, open up a terminal window and navigate to your Sails app folder, then type '<code>sails lift</code>' to start it up. By default it will launch to <code><a href="http://localhost:1337">http://localhost:1337</a></code>. Now just signup and post a few messages.</p>
    <p>To see your posted messages you can <code>console.log</code> the messages variable, or look at it inside of the browser’s console. Now the next thing we should implement is a view so we can see the posted messages in the browser.</p>
    <pre>_.templateSettings = {&#x000A;        interpolate : /\{\{(.+?)\}\}/g&#x000A;    };&#x000A;    var MessagesView = Backbone.View.extend({&#x000A;        el: '#messagesContainer',&#x000A;        initialize: function () {&#x000A;            this.collection.on('add', this.render, this);&#x000A;            this.render();&#x000A;        },&#x000A;        template: _.template("&lt;div&gt;&lt;p&gt;{{ message }}&lt;/p&gt;&lt;/div&gt;"),&#x000A;            render: function () {&#x000A;                this.$el.html("");&#x000A;                this.collection.each(function(msg){&#x000A;                    this.$el.append(this.template(msg.toJSON()));&#x000A;                }, this)&#x000A;        }&#x000A;    });&#x000A;    &#x000A;    var mView = new MessagesView({collection: messages});&#x000A;    </pre>
    <p>We start off by defining a view, attaching it to the div that we created earlier, then we add an event handler on the collection to re-render the div every time a new model gets added to the collection.</p>
    <p>You can see at the top, I had to change the default Underscore settings from using the EJS syntax inside of the templates, to instead, use Mustache’s syntax. This is because the page is already an EJS document, so it would be processed out on the server and not in Underscore.</p>
    <p><strong>Note</strong>: I didn't come up with the Regex for this, that credit goes to the <a href="http://underscorejs.org/#template" title="Underscore Template Docs" rel="nofollow external" class="bo">Underscore docs</a> itself.</p>
    <p>Lastly, at the bottom you can see we created a new instance of this view, passing it the collection variable.</p>
    <p>If all went well, you should now see your messages in the browser, and it should update whenever you create a new post.</p>
    <hr>
    <h2>Sails Policies</h2>
    <p>Now you may have noticed that we’re not setting the <code>userId</code> or the <code>username</code> when we submit the posts, and this is for security purposes.</p>
    <p>You don't want to put this kind of control on the client side. If all someone has to do is modify a JavaScript variable to control another user’s account, you’ll have a major problem.</p>
    <p>So, how should you handle this? Well, with policies of course.</p>
    <p>Policies are basically middleware, which run before the actual web request, where you can stop, modify, or even redirect the request, as needed.</p>
    <p>For this app, let's create a policy for our messages. Policies are applied to controllers, so they can even be run on normal pages, but for this tutorial let's just stick with one for our <code>messages</code> Model.</p>
    <p>Create a file named 'MessagesPolicy.js' inside the '<code>api &gt; policies</code>' folder, and enter the following:</p>
    <pre>module.exports = function (req, res, next) {&#x000A;        if (req.session.user) {&#x000A;            var action = req.param('action');&#x000A;            if (action == "create") {&#x000A;                req.body.userId = req.session.user.id;&#x000A;                req.body.username = req.session.user.username;&#x000A;            }&#x000A;            next();&#x000A;        } else {&#x000A;            res.send("You Must Be Logged In", 403);&#x000A;        }&#x000A;    };&#x000A;    </pre>
    <p>So, what’s going on here? You can see this function resembles a normal route function, the difference though is the third parameter, which will call the next middleware in the stack. If you’re new to the idea of middleware, you can think of it like a Russian nesting doll. Each layer gets the request, along with the response variables and they can modify them as they see fit. If they pass all of the requirements, the layer can pass it further in, until it reaches the center, which is the route function.</p>
    <p>So here we are, checking if the user is logged in, if the user isn't, we display a 403 error and the request ends here. Otherwise, (i.e. the user is logged in) we call <code>next();</code> to pass it on. In the middle of the above code, is where we inject some post variables. We’re applying this to all calls on the 'messages' controller (basically the API), so we get the action and check if this request is trying to create a new message, in which case we add the post fields for the user's <code>id</code> and <code>username</code>.</p>
    <p>Next, open up the <code>policies.js</code> file which is in the config folder, and add in the policy that we just created. So your file should look like this:</p>
    <pre>module.exports.policies = { &#x000A;        '*': true,&#x000A;        'messages': 'MessagesPolicy'&#x000A;    };&#x000A;    </pre>
    <p>With this put in to place, we’ll need to delete all of the old records, as they do not have these new pieces of information. So, close the Sails server (ctrl-c) and in the same terminal window type: <code>rm -r .tmp</code> to remove the temporary database giving us a clean slate.</p>
    <p>Next, let's add the username to the actual posts, so in the 'chat.ejs' change the template to:</p>
    <pre>template: _.template("&lt;div&gt;&lt;p&gt;&lt;b&gt;{{ username }}: &lt;/b&gt;{{ message }}&lt;/p&gt;&lt;/div&gt;"),&#x000A;    </pre>
    <p>Restart the Sails server (again using <code>sails lift</code>) and signup another new user to test it out. If everything is working correctly, you should be able to add messages and see your name in the post.</p>
    <p>At this point we have a pretty good setup, we fetch the post automatically using Backbone and the API, plus we have some basic security in place. The problem is, it won't update when other people post messages. Now you could solve this by creating a JavaScript interval and poll for updates, but we can do better.</p>
    <h3>Leveraging Websockets</h3>
    <p>I mentioned earlier that Sails leverages websockets’ bidirectional abilities to post updates on the subscribed data. Using these updates, we can listen for new additions to the messages table and update the collection accordingly.</p>
    <p>So in the <code>chat.ejs</code> file, let's create a new kind of collection; a SailsCollection:</p>
    <pre>var SailsCollection = Backbone.Collection.extend({&#x000A;        sailsCollection: "",&#x000A;        socket: null,&#x000A;        sync: function(method, model, options){&#x000A;            var where = {};&#x000A;            if (options.where) {&#x000A;                where = {&#x000A;                    where: options.where&#x000A;                }&#x000A;            }       &#x000A;            if(typeof this.sailsCollection === "string" &amp;&amp; this.sailsCollection !== "") {&#x000A;                this.socket = io.connect();&#x000A;                this.socket.on("connect", _.bind(function(){&#x000A;                    this.socket.request("/" + this.sailsCollection, where, _.bind(function(users){&#x000A;                        this.set(users);&#x000A;                    }, this));&#x000A;        &#x000A;                    this.socket.on("message", _.bind(function(msg){&#x000A;                        var m = msg.uri.split("/").pop();&#x000A;                        if (m === "create") {&#x000A;                            this.add(msg.data);&#x000A;                        } else if (m === "update") {&#x000A;                            this.get(msg.data.id).set(msg.data);&#x000A;                        } else if (m === "destroy") {&#x000A;                            this.remove(this.get(msg.data.id));&#x000A;                        }&#x000A;                    }, this));&#x000A;                }, this));&#x000A;            } else {&#x000A;                console.log("Error: Cannot retrieve models because property 'sailsCollection' not set on the collection");&#x000A;            }&#x000A;        }&#x000A;    });&#x000A;    </pre>
    <p>Now it may be long, but it's actually very simple, let's walk through it. We start off by adding two new properties to the Collection object, one to hold the name of the Sails 'model' and one to hold the web socket. Next, we modify the <code>sync</code> function, if you’re familiar with Backbone, then you’ll know that this is the function which interfaces with the server when you call things such as <code>fetch</code>. Usually, it fires off Ajax requests, but we’re going to customize it for socket communication.</p>
    <p>Now, we’re not using most of the functionality that the <code>sync</code> function offers, mainly because we haven't added the ability for users to update or delete messages, but just to be complete, I will include them within the function definition.</p>
    <p>Let’s take a look at the first part of the <code>sync</code> function:</p>
    <pre>var where = {};&#x000A;    if (options.where) {&#x000A;        where = {&#x000A;            where: options.where&#x000A;        }&#x000A;    }   &#x000A;    </pre>
    <p>This code first checks if any '<code>where</code>' clauses were sent through, this would let you do things like: <code>messages.fetch({ where : { id: 4 } });</code> to only fetch rows where the id equals four.</p>
    <p>After that, we then have some code that makes sure the '<code>sailsCollection</code>' property has been set, otherwise we log an error message. Afterwards, we create a new socket and connect to the server, listening for the connection with the <code>on('connect')</code> event.</p>
    <p>Once connected, we request the index of the '<code>sailsCollection</code>' specified to pull in the current list of models. When it receives the data, we use the collection's <code>set</code> function to initially set the models.</p>
    <p>Alright, now so far, we have the equivalent of the standard <code>fetch</code> command. The next block of code is where the push notifications happen:</p>
    <pre>this.socket.on("message", _.bind(function(msg){&#x000A;        var m = msg.uri.split("/").pop();&#x000A;        if (m === "create") {&#x000A;            this.add(msg.data);&#x000A;        } else if (m === "update") {&#x000A;            this.get(msg.data.id).set(msg.data);&#x000A;        } else if (m === "destroy") {&#x000A;            this.remove(this.get(msg.data.id));&#x000A;        }&#x000A;    }, this));&#x000A;    </pre>
    <p>Now the action that’s being performed (whether we’re creating, updating, or destroying a message) can be found inside of the actual <code>msg</code>, which is then inside of the <code>uri</code>. To get the action, we split the URI on forward slashes ('/') and grab just the last segment using the <code>pop</code> function. We then try to match it up with the three possible actions of <code>create</code>, <code>update</code>, or <code>destroy</code>.</p>
    <p>The rest is standard Backbone, we either add, edit, or remove the specified model. With our new class almost complete, all that’s left to do is change the current <code>MessageCollection</code>. Instead of extending the Backbone collection, it needs to extend our new collection, like so:</p>
    <pre>var MessageCollection = SailsCollection.extend({&#x000A;        sailsCollection: 'messages',&#x000A;        model: MessageModel&#x000A;    });&#x000A;    </pre>
    <p>In addition to extending our new collection, we’ll make another change so that instead of setting the URL property, we now set the sailsCollection property. And that's all there is to it. Open up the application into two different browsers (e.g. Chrome and Safari) and signup two separate users. You should see that posted messages from either of the browsers get immediately shown on the other, no polling, no trouble.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/05/Sails_Chat.png" alt="Chat Screenshot" style="max-width: 100%; height: auto;"><hr>
    <h2>Conclusion</h2>
    <p>Sails is a breath of fresh air, within a clutter of frameworks. It checks its ego at the door, and does what it can to help the developer instead of the brand. I have been chatting with the Sails devs and I can tell you that there’s even more awesomeness in the works, and it will be interesting to see where this framework goes.</p>
    <p>So in conclusion, you’ve learned how to setup, use, and secure your data from within Sails, as well as how to interface it with the popular Backbone library.</p>
    <p>Like always, if you have any comments, feel free to leave them below, or join us on the Nettuts+ IRC channel ("#nettuts" on freenode). Thank you for reading.</p>
    </div>
]]>
</Body>
<Summary>Sails.js is an up and coming Node.js framework, with a focus on freedom and smart defaults. In this article we’ll take a look at some of the data features Sails provides out-of-the-box, for easily...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/usUcBrdA3Cs/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31156/guest@my.umbc.edu/a4614422590de72167b2b52091eccd58/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>javascript-and-ajax</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sails-js-data</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 11 Jun 2013 21:49:56 -0400</PostedAt>
<EditAt>Tue, 11 Jun 2013 21:49:56 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="123260" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123260">
<Title>New Grants from the Hrabowski Fund for Innovation</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><strong>FROM:</strong> Freeman Hrabowski, President, and Philip Rous, Provost<br>
    <strong>TO:</strong> The UMBC Community<br>
    <strong>RE:</strong> New Grants from the Hrabowski Fund for Innovation</p>
    <p>We are delighted to announce the second set of projects to receive grants from the <a href="http://alumni.umbc.edu/innovationfund" rel="nofollow external" class="bo">Hrabowski Fund for Innovation</a>. These projects build on the strong commitment of our faculty to continually reimagine our students’ learning experiences.</p>
    <p>The selection committee received a number of outstanding applications. The grant recipients were chosen by a committee comprised of faculty from each college, teaching award winners, and representatives from the Provost’s Office, Graduate School, and Office of Undergraduate Education. In selecting projects to fund, the committee sought initiatives that would address multiple courses or disciplines, respond broadly to student needs, affect student success or retention, and be sustainable.</p>
    <p><strong>Implementation and research grants</strong></p>
    <ul>
    <li>
    <em>Modeling as a Pedagogical Tool for the Life Sciences Curriculum</em>– Led by Mauricio Bustos, associate professor of biological sciences, the team will use computer simulations of lab experiments to allow students in the biological sciences to focus on critical biology concepts rather than rote lab procedures. By removing the beakers, pipettes, and other distractions of the lab, the team hopes to enhance student focus on experiment design, observation, and interpretation.</li>
    <li>
    <em>Enhancing Hands-On Problem-Solving across the Chemical Engineering Curriculum</em> – A team led by Joshua Enszer, lecturer in chemical and biochemical engineering, will create a series of hands-on activities to connect a five-semester sequence of required courses in chemical engineering. The goal of the project is to show students how these separate courses are related, and enable them to see how the concepts they are learning in the classroom relate to the laboratory.</li>
    </ul>
    <p><strong>Seed grants</strong></p>
    <ul>
    <li>
    <em>Metacognitive Activity Promotions (MAPs) in Chemical Engineering Thinking</em> – A team led by Mariajose Castellanos, assistant professor of chemical and biochemical engineering, will use sociological principles to examine the effect of written reflection exercises on students’ understanding of their chemical engineering coursework.</li>
    </ul>
    <p>These projects join our first round of grant recipients in building on our strong history of finding novel approaches to teaching and scholarship. Established with major grants from the Carnegie Corporation of New York and the Heinz Awards, the Innovation Fund has also benefited from substantial support from alumni and friends, the local community and businesses, and state and national leaders. This support is a testament to the work we’ve already done and a vote of confidence for the national model we’re continuing to build.</p>
    <p>The competition for the next round of Innovation Fund grants will be announced later this summer with a due date in fall. We want to thank everyone who has submitted a proposal, and encourage those whose proposals could not be funded in this round to apply again.</p>
    <p>We are truly inspired by the creative ideas we hear each day and are delighted to be able to support more of them through this fund.</p>
    </div>
]]>
</Body>
<Summary>FROM: Freeman Hrabowski, President, and Philip Rous, Provost  TO: The UMBC Community  RE: New Grants from the Hrabowski Fund for Innovation   We are delighted to announce the second set of...</Summary>
<Website>https://umbc.edu/stories/new-grants-from-the-hrabowski-fund-for-innovation/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123260/guest@my.umbc.edu/0ffbe22f58193299e74e415253359aaf/api/pixel</TrackingUrl>
<Tag>impact</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Tue, 11 Jun 2013 20:55:42 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31157" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31157">
<Title>Using Web Workers to improve performance of image manipulation</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>In this article we will talk about picture manipulation. Not the Direct2D method  as we had previously discussed, but the pure JavaScript way.</p></div>
]]>
</Body>
<Summary>In this article we will talk about picture manipulation. Not the Direct2D method  as we had previously discussed, but the pure JavaScript way.</Summary>
<Website>http://www.htmlgoodies.com/HTML5/client/using-web-workers-to-improve-performance-of-image-manipulation.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31157/guest@my.umbc.edu/f1c7b188f3dbe859c40ac0a5b83050a8/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>Tue, 11 Jun 2013 20:13:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31154" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31154">
<Title>Blackboard Help</Title>
<Body>
<![CDATA[
    <div class="html-content"><div>    <p>
            Page
                <strong>added</strong> by
                        <a href="https://wiki.umbc.edu/display/~anna" rel="nofollow external" class="bo">Anna Sniadach</a>
                </p>
            <div>
            <div><div>
    <div><div>
    <div><table><tbody><tr><td>
    <strong>Recommended Articles</strong><br><ul>
    <li>
    <strong>Faculty</strong><ul>
    <li><a href="http://my.umbc.edu/go/blackboardrequest" rel="nofollow external" class="bo">Request a New Blackboard Course Shell</a></li>
    <li><a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=1867862" rel="nofollow external" class="bo">Make Shell Available</a></li>
    <li>
    <a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=22708244" rel="nofollow external" class="bo">Export Old Course</a> | <a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=22708253" rel="nofollow external" class="bo">Import Into New Course</a>
    </li>
    <li><a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=22708259" rel="nofollow external" class="bo">Enable Discussion Board "Subscription" by Email </a></li>
    <li>
    <a href="http://library.blackboard.com/ref/ab5e0a54-5095-456f-8738-3df64311417a/index.htm" rel="nofollow external" class="bo">Bb's Instructor Manual</a> (in every course under "Help")</li>
    </ul>
    </li>
    <li>
    <strong>Students</strong><ul>
    <li><a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=5244774" rel="nofollow external" class="bo">Upload a Paper in Blackboard</a></li>
    <li><a href="http://my.umbc.edu/apps/bb/activity" rel="nofollow external" class="bo">Check my Blackboard Activity</a></li>
    <li><a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=17171412" rel="nofollow external" class="bo">Remove an Old Course from my List</a></li>
    <li>
    <img src="https://wiki.umbc.edu/s/en_GB/3396/9edc97f62fedb1d22a8ce3c36f168cc178fbcdea.32/_/images/icons/emoticons/information.png" alt="(info)" style="max-width: 100%; height: auto;"> <a href="https://wiki.umbc.edu/x/RgdQ" rel="nofollow external" class="bo">Browser Compatibility with UMBC Blackboard</a>
    </li>
    </ul>
    </li>
    </ul>
    </td></tr></tbody></table></div>
    <h4>Search Articles</h4>
        
        
    
    
    
        <span>Searching Find Help (FAQs)</span>
    
    
        
                    <div></div>
            <div>
                
            </div>
            <div>
                 
            </div>
    
            
        
            
            
            
        
    
        <div>
            
        </div>
    
    <h4>Browse All Articles</h4>
    <p></p>
    <div>
    
            
                    <div>
                <span>Collapse all</span>
                <div>
                    <a href="#" rel="nofollow external" class="bo">Expand all</a>  
                    <a href="#" rel="nofollow external" class="bo">Collapse all</a>
                </div>
            </div>
        
        <ul>
            
        </ul>
    
        
            
            
            
    
            
            
    
            
            
            
    
            
            
            
            
    
                    
                                
                        
        
    </div>
    
    <p> </p>
    </div></div>
    <div><div>
    <h4>Popular Bb Articles: Faculty</h4>
    <p><span></span></p>
    <ol>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=22708259" rel="nofollow external" class="bo">How do I enable Blackboard discussion board subscription by email?</a>
                        
                                    (367)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=36766018" rel="nofollow external" class="bo">I do not see the Return Receipt option when sending email inside my Blackboard course.</a>
                        
                                    (111)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=1867862" rel="nofollow external" class="bo">How do I make a course available or unavailable to students in Blackboard?</a>
                        
                                    (69)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=2851116" rel="nofollow external" class="bo">Why can't I see my Blackboard course?</a>
                        
                                    (39)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=22708244" rel="nofollow external" class="bo">How do I export or archive my old Blackboard course?</a>
                        
                                    (37)
                                </li>
                        </ol>
        <h4>Popular Bb Articles: Student</h4>
    <ol>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=5245059" rel="nofollow external" class="bo">When I check my grades, there is a green exclamation point or a red question mark instead of a score. What does this mean?</a>
                        
                                    (53)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=17171412" rel="nofollow external" class="bo">How do I remove an old Blackboard course from my list?</a>
                        
                                    (45)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=2851116" rel="nofollow external" class="bo">Why can't I see my Blackboard course?</a>
                        
                                    (39)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=25657356" rel="nofollow external" class="bo">How do I enroll myself in the UMBC placement test in Blackboard?</a>
                        
                                    (34)
                                </li>
                            <li>
                    
                                                        <a href="/pages/viewpage.action?pageId=5244742" rel="nofollow external" class="bo">What browser works best with UMBC's Blackboard system?</a>
                        
                                    (34)
                                </li>
                        </ol>
        <h4>Things to Know about UMBC's Blackboard </h4>
    <ol>
    <li><span>Courses and enrollments into Blackboard are fully automated through the registration process. Each semester, official courses and enrollments are populated from the registration process and updates to those courses and enrollments are performed every couple of hours. <strong>You do not need to request a course</strong> in Blackboard for your courses if you are the official instructor listed on the schedule of classes</span></li>
    <li><span><span>By default, courses that have been generated each semester are labeled "unavailable" meaning <strong>students cannot access them</strong>. It's up to the instructor as to when they would like their <a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=1867862" rel="nofollow external" class="bo">course to be made "available"</a> to the enrolled students</span></span></li>
    <li>
    <span><strong>File Names are important</strong>. Faculty and students uploading documents in the Blackboard system should take care when naming the files.<br></span>File names should not contain any spaces or special characters (e.g., ! @ # $ % ^ &amp; * ( ) &gt; &lt;). Spaces and special characters can be misinterpreted by the system. To indicate a space in a file name the underscore key ( _ ) can be used (e.g., file_name.doc). <strong>This also applies to naming columns in the Grade Center</strong>. Use the underscore symbol ( _ <em>) and a period (.) as separators</em>
    </li>
    </ol>
    <div><div>
    <h4>Don't See What You're Looking For?</h4>
    <p><a href="https://rt.umbc.edu/SelfService/Create.html?Queue=24" rel="nofollow external" class="bo"><img src="https://wiki.umbc.edu/download/attachments/29853066/RequestHelpicon.png?version=1&amp;modificationDate=1335472984000&amp;api=v2" style="max-width: 100%; height: auto;"></a></p>
    <p><span><strong>Help us improve</strong>: </span><a href="https://docs.google.com/a/umbc.edu/spreadsheet/viewform?hl=en_US&amp;formkey=dEpyOEZxa29QY05BaVpBVzZSYmRMM0E6MA#gid=0" rel="nofollow external" class="bo">Suggest an article</a><span> or </span><a href="https://wiki.umbc.edu/pages/viewpage.action?pageId=30542501" rel="nofollow external" class="bo">Add a Comment</a><span> on any page.</span></p>
    </div></div>
    </div></div>
    </div></div>
        </div>
            <div>
           <a href="https://wiki.umbc.edu/display/faq/Blackboard+Help" rel="nofollow external" class="bo">View Online</a>
                      </div>
    </div></div>
]]>
</Body>
<Summary>Page             added by                     Anna Sniadach                                      Recommended Articles   Faculty  Request a New Blackboard Course Shell  Make Shell Available  Export...</Summary>
<Website>https://wiki.umbc.edu/display/faq/Blackboard+Help</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31154/guest@my.umbc.edu/f7b5766a9cc15bac92ee2b690fad1949/api/pixel</TrackingUrl>
<Tag>blackboard</Tag>
<Tag>faq</Tag>
<Group token="retired-428">UMBC FAQ</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-428</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/images/avatars/group/1/xsmall.png?1783534523</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/images/avatars/group/1/original.png?1783534523</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/images/avatars/group/1/xxlarge.png?1783534523</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/images/avatars/group/1/xlarge.png?1783534523</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/images/avatars/group/1/large.png?1783534523</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/images/avatars/group/1/medium.png?1783534523</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/images/avatars/group/1/small.png?1783534523</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/images/avatars/group/1/xsmall.png?1783534523</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/images/avatars/group/1/xxsmall.png?1783534523</AvatarUrl>
<Sponsor>UMBC FAQ</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Tue, 11 Jun 2013 18:59:42 -0400</PostedAt>
<EditAt>Tue, 11 Jun 2013 18:59:42 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31151" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31151">
<Title>Bits Blog: Today&#8217;s Scuttlebot: Web Page No. 1 and Amazon in China</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. For Tuesday, selections include trying to crack a forgotten password guarding a historic Web page and Amazon trying to sell e-books in a land where most people don’t buy them.<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%2F11%2Ftodays-scuttlebot-web-page-no-1-and-amazon-in-china%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Web+Page+No.+1+and+Amazon+in+China" 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%2F11%2Ftodays-scuttlebot-web-page-no-1-and-amazon-in-china%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Web+Page+No.+1+and+Amazon+in+China" 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%2F11%2Ftodays-scuttlebot-web-page-no-1-and-amazon-in-china%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Web+Page+No.+1+and+Amazon+in+China" 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%2F11%2Ftodays-scuttlebot-web-page-no-1-and-amazon-in-china%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Web+Page+No.+1+and+Amazon+in+China" 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%2F11%2Ftodays-scuttlebot-web-page-no-1-and-amazon-in-china%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+Today%E2%80%99s+Scuttlebot%3A+Web+Page+No.+1+and+Amazon+in+China" 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 technology reporters and editors of The New York Times scour the Web for important and peculiar items. For Tuesday, selections include trying to crack a forgotten password guarding a historic...</Summary>
<Website>http://bits.blogs.nytimes.com/2013/06/11/todays-scuttlebot-web-page-no-1-and-amazon-in-china/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31151/guest@my.umbc.edu/2a1547a543d272d37b020d14e7d6fe4f/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>Tue, 11 Jun 2013 17:28:47 -0400</PostedAt>
</NewsItem>

</News>
