<?xml version="1.0"?>
<News hasArchived="true" page="8736" pageCount="10824" pageSize="10" timestamp="Fri, 18 Sep 2026 13:45:34 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=8736&amp;range=2">
<NewsItem contentIssues="true" id="31168" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31168">
<Title>Colour theming with Sass and Compass</Title>
<Body>
<![CDATA[
    <div class="html-content">Ben Frain demonstrates some nifty features of Sass and Compass that make colour manipulation quick and simple<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcolour-theming-sass-and-compass&amp;t=Colour+theming+with+Sass+and+Compass" 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.netmagazine.com%2Ftutorials%2Fcolour-theming-sass-and-compass&amp;t=Colour+theming+with+Sass+and+Compass" 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.netmagazine.com%2Ftutorials%2Fcolour-theming-sass-and-compass&amp;t=Colour+theming+with+Sass+and+Compass" 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.netmagazine.com%2Ftutorials%2Fcolour-theming-sass-and-compass&amp;t=Colour+theming+with+Sass+and+Compass" 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.netmagazine.com%2Ftutorials%2Fcolour-theming-sass-and-compass&amp;t=Colour+theming+with+Sass+and+Compass" 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/165664920016/u/49/f/502346/c/32632/s/2d2ee7b2/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/165664920016/u/49/f/502346/c/32632/s/2d2ee7b2/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Ben Frain demonstrates some nifty features of Sass and Compass that make colour manipulation quick and simple     </Summary>
<Website>http://feedproxy.google.com/~r/net/topstories/~3/RNw7bMn8iUg/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31168/guest@my.umbc.edu/09b1c3a98ce900b1bb3746d3ef3f4c8d/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>net</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 06:02:32 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31165" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31165">
<Title>Are Your Web Graphics Print-Ready?</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="http://sixrevisions.com/graphics-design/print-ready-graphics/" rel="nofollow external" class="bo"><img src="http://cdn.sixrevisions.com/0347-01_printready_thumbnail.jpg" width="550" height="200" alt="Is Your Web Graphics Print-Ready?" style="max-width: 100%; height: auto;"></a></p>
    <p>As a web designer, masters of the digital realm, you might have never faced the situation where your designs are going to be sent to a print shop.</p>
    <p>Or perhaps you’re an Internet business owner in a place right now where you need printed materials for an event (a conference, a meet-up, billboard advertising, and so forth). You might be an online retailer, a SaaS company, a web development agency, etc.</p>
    <p><strong>What happens when you’ve only got web graphics at hand?</strong> Graphics designed to be displayed on electronic devices like computer monitors and smartphones.</p>
    <p></p>
    <p>When prepping graphics that you intend to have printed, there are several vital factors you must consider.</p>
    <p>I’ll discuss the most important factors in this <strong>beginner-level guide to preparing your designs for printing.</strong></p>
    <h3>Color Model: RGB vs. PMS vs. CMYK</h3>
    <p>Web and print don’t reproduce color in the same way. Let’s discuss the differences.</p>
    <h4>RGB Color Model</h4>
    <p>Web graphics operate using the <strong>RGB color model</strong> where each color is created using a combination of red, green and blue pixels.</p>
    <p>The RGB color model is designed specifically for electronic devices such as your computer monitor or your tablet device or your TV.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-05_rgb_color_model.jpg" width="550" height="550" style="max-width: 100%; height: auto;"></p>
    <p>Print, on the other hand, tends to involve either <strong>PMS</strong> or <strong>CMYK (four-color process).</strong></p>
    <h4>PMS (Pantone Color Matching System)</h4>
    <p>PMS (Pantone Color Matching System) uses <strong>pre-mixed inks</strong> with established color values.</p>
    <p>PMS is a proprietary color system by the New-Jersey-based corporation, Pantone Inc.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-06_pms_pantone.jpg" width="550" height="416" style="max-width: 100%; height: auto;"><span>Image source: <a href="http://en.wikipedia.org/wiki/File:PantoneFormulaGuide-solidMatte-2005edition.png" rel="nofollow external" class="bo">Parhamr</a></span></p>
    <p>Using the Pantone system guarantees that you get the exact colors you want because of the standardized inks.</p>
    <h4>CMYK Color Model</h4>
    <p><strong>CMYK</strong> (also known as <em>four-color process)</em> uses a combination of cyan, magenta, yellow and black inks to reproduce different colors.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-07_cmyk_color_model.jpg" width="550" height="550" style="max-width: 100%; height: auto;"><span>Image source: <a href="http://en.wikipedia.org/wiki/File:CMYK_color_swatches.svg" rel="nofollow external" class="bo">Quark67</a></span></p>
    <h4>The Ideal Color Situation to Be In</h4>
    <p>The ideal situation would be that a graphics specialist such as a logo designer has professionally designed your graphics assets.</p>
    <p>Your logo, for instance, should have been provided to you in two different versions: One specifically designed for Web use, and one specifically for print use. Two different logo designs for two distinctly different display environments.</p>
    <p>However if you’re reading this guide, chances are  that you don’t have the files you need.</p>
    <p>So what do you need to do?</p>
    <h4>Convert RGB to CMYK or PMS</h4>
    <p>So what do you do when you only have web graphics for printing?</p>
    <p>Web graphics are saved to the RGB color model and won’t work properly for your printer. What will happen is the colors might not turn out to be accurate when your printer uses the PMS or CMYK to print your web graphics.</p>
    <p>So it’s important to <strong>convert and re-save your graphics </strong>to either the CMYK color model or PMS for printing. This is a simple process most of the time — you just need your graphics software. But the results aren’t guaranteed to be accurate.</p>
    <p>The choice is up to you whether you choose CMYK or PMS, but there’s no print shop that will be able to print files using the RGB color model.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-08_color_conversion_photoshop.jpg" width="534" height="394" style="max-width: 100%; height: auto;"></p>
    <h4>Testing</h4>
    <p>After converting your RGB artwork to a print-ready color system, it’s recommended that you test the output by printing just a small amount of your artwork before going into full production to ensure that the color system conversion was accurate (or accurate enough for your needs).</p>
    <h4>More Reading About Color Conversion</h4>
    <p>Here are some guides and resources that will be helpful in color conversion:</p>
    <h5><a href="http://www.ne14design.co.uk/articles/convert_RGB_to_CMYK.htm" rel="nofollow external" class="bo">How to Convert RGB to CMYK in Photoshop</a></h5>
    <p><a href="http://www.ne14design.co.uk/articles/convert_RGB_to_CMYK.htm" rel="nofollow external" class="bo"><img src="http://cdn.sixrevisions.com/0347-09_convert_rgb.jpg" width="500" height="566" style="max-width: 100%; height: auto;"></a></p>
    <h5><a href="http://graphicfusiondesign.com/blog/design/converting-cmykrgb-pantone-illustrator-pantone-matching-photoshop/" rel="nofollow external" class="bo">Converting CMYK/RGB to Pantone in Illustrator and Photoshop</a></h5>
    <p><a href="http://graphicfusiondesign.com/blog/design/converting-cmykrgb-pantone-illustrator-pantone-matching-photoshop/" rel="nofollow external" class="bo"><img src="http://cdn.sixrevisions.com/0347-10_cmyk_conversion.jpg" width="550" height="291" style="max-width: 100%; height: auto;"></a></p>
    <h5><a href="http://www.lcipaper.com/kb/the-ultimate-color-conversion-chart-pms-cmyk-rgb-hex.html" rel="nofollow external" class="bo">The Ultimate Color Conversion Chart</a></h5>
    <p><a href="http://www.lcipaper.com/kb/the-ultimate-color-conversion-chart-pms-cmyk-rgb-hex.html" rel="nofollow external" class="bo"><img src="http://cdn.sixrevisions.com/0347-11_conversion_chart.jpg" width="550" height="326" style="max-width: 100%; height: auto;"></a></p>
    <h5><a href="http://www.printingforless.com/rgb-cmyk.html" rel="nofollow external" class="bo">Important Information About RGB and CMYK</a></h5>
    <p><a href="http://www.printingforless.com/rgb-cmyk.html" rel="nofollow external" class="bo"><img src="http://cdn.sixrevisions.com/0347-12_important_info_rgb.jpg" width="550" height="250" style="max-width: 100%; height: auto;"></a></p>
    <h3>Image Resolution and Scalability</h3>
    <p>A problem that’s likely to come up when dealing with web graphics is their resolution and ability to be resized without loss of quality. This poses an issue when you want your web graphics to be printed on bigger mediums like billboards or magazine covers.</p>
    <p>Image resolution refers to the amount of details an image has.</p>
    <p>Image resolution for digital images are measured using spatial resolution units, and the poplar unit of measurements are in <strong>pixels per inch (ppi)</strong> or <strong>dots per inch (dpi).</strong></p>
    <p>The more pixels or dots there are in a given square inch, the more detail the image has, i.e., the higher its resolution.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-04_image_resolution.jpg" width="518" height="329" alt="Is Your Web Graphics Print-Ready?" style="max-width: 100%; height: auto;"></p>
    <p>Images on the Web are typically compressed to a lower resolution — typically <strong>72dpi</strong> — so that they download faster and because most screens don’t need/can’t take advantage of a higher resolution.</p>
    <p>Lower-res graphics may look fine on your computer monitor, but that same image will look different when printed.</p>
    <h4>The Problem: Pixelation</h4>
    <p>The biggest issue you might encounter with image resolution is <strong>pixelation.</strong> <a href="http://en.wikipedia.org/wiki/Pixelation" rel="nofollow external" class="bo">Pixelation</a> occurs when you scale an image up and it doesn’t have sufficient enough resolution that it makes the image too blurry.</p>
    <p>Look at the difference between a web-resolution image being scaled up in dimension below.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-02_image_resolution_scale.jpg" width="550" height="342" style="max-width: 100%; height: auto;"></p>
    <p>Notice the pixelation occurring as a result of us trying to enlarge the image when it doesn’t have sufficient enough detail.</p>
    <p>For this reason, it’s vital to <strong>use the highest resolution images possible</strong> — at least <strong>300dpi</strong> — when creating print-ready graphics.</p>
    <p>If you don’t have access to the original file that was used to create your web graphics — which should be in PSD or vector file format (EPS, AI, etc.) — it may be necessary to recreate it.</p>
    <p>With a vector file format, you can scale the design up to whatever size you require without any loss of quality.</p>
    <h3>Monochrome-Friendliness</h3>
    <p>The Web offers very few restrictions when it comes to color representation.</p>
    <p>Print, on the other hand, comes with certain limitations.</p>
    <p>When using PMS printing, each new color means an additional cost, making multicolored web graphics less practical with this method.</p>
    <p>And, although four-color process can be used to reproduce most multicolored web graphics, one- or two-color PMS printing is often a more cost-effective option.</p>
    <p>For this reason (among others), many logo designers will first design a logo using only black and white. If the logo maintains the same visual impact in its simplest, monochromatic form, you’ll have a much easier time when you recreate it using one-color printing.</p>
    <p>While the object below is certainly distinctive when it’s multicolored, it’s not terribly interesting to look at in black and white.</p>
    <p><img src="http://cdn.sixrevisions.com/0347-03_multicolor_vs_blackwhite.jpg" width="500" height="250" style="max-width: 100%; height: auto;"></p>
    <h3>Problematic Colors</h3>
    <p>Just as PMS printing presents certain design limitations, four-color process also comes with complications to consider — specifically, it can be difficult to accurately reproduce some colors (including <strong>orange</strong> and <strong>navy blue</strong>) with the CMYK color model.</p>
    <p>If you intend to print your logo using four-color process and it contains any orange or navy blue elements, you may want to replace them with another color — or, alternatively, have those areas spot printed with the proper PMS colors.</p>
    <p><strong>Check with your printer</strong> if you think your artwork may contain colors that present a problem for CMYK printing.</p>
    <h3>File Format</h3>
    <p>Popular image formats for web use include JPG and PNG — formats designed for computer monitors but don’t always work as well for printing.</p>
    <p>In general, your high-res, print-ready artwork should be in the most "raw" format possible.</p>
    <p>The most common formats for this purpose are:</p>
    <ul>
    <li>PSD (Photoshop)</li>
    <li>AI (Illustrator)</li>
    <li>EPS (a standard vector file)</li>
    <li>PDF (viewable using Acrobat)</li>
    </ul>
    <h3>Fonts</h3>
    <p>Just because your artwork opens fine on your computer doesn’t necessarily mean it will work for a commercial printer.</p>
    <p>When high-quality image files such as PSDs incorporate fonts, you’ll need the proper font files to view them correctly — files that your printer might not have immediate access to, especially if you’re using uncommon fonts.</p>
    <p>Be sure to include any necessary font files when sending your artwork to a printer.</p>
    <p>On a Mac, these files can be found in <em>System/Library/Fonts</em>.</p>
    <p>In Windows, check the <em>Fonts</em> folder inside your main Windows directory.</p>
    <p>Most printers will let you include  font files in a ZIP along with your artwork files.</p>
    <p>Alternatively, you can convert fonts to outlines in <a href="http://help.adobe.com/en_US/illustrator/cs/using/WS714a382cdf7d304e7e07d0100196cbc5f-63d0a.html#WS18156339-458C-45e1-8CD0-DD7931678BBE" rel="nofollow external" class="bo">Illustrator</a> or <a href="http://help.adobe.com/en_US/indesign/cs/using/WSa285fff53dea4f8617383751001ea8cb3f-6befa.html#WSa285fff53dea4f8617383751001ea8cb3f-6be6a" rel="nofollow external" class="bo">InDesign</a> so that you won’t need to include additional files.</p>
    <h3>Conclusion</h3>
    <p>The best way to ensure that your logo looks great in print as well as on the Web is to design it with both mediums in mind from the very beginning. However, if you’re stuck in a bind, there are ways to make the best out of the situation.</p>
    <p>For more information related to ensuring your graphics is suitable for print, be sure to check out this <a href="http://www.companyfolders.com/blog/print-ready-checklist" rel="nofollow external" class="bo">print-ready checklist</a> that I made.</p>
    <h3>Related Content</h3>
    <ul>
    <li><a href="http://sixrevisions.com/graphics-design/5-branding-basics-every-logo-designer-should-know/" rel="nofollow external" class="bo">5 Branding Basics Every Logo Designer Should Know</a></li>
    <li><a href="http://sixrevisions.com/resources/30-excellent-resources-for-graphic-design-freebies/" rel="nofollow external" class="bo">30 Excellent Resources for Graphic Design Freebies</a></li>
    <li><a href="http://sixrevisions.com/design-showcase-inspiration/blue-logo-designs/" rel="nofollow external" class="bo">50 Beautifully Blue Logo Designs</a></li>
    <li>
    <em>Related categories</em>: <a href="http://sixrevisions.com/category/graphics-design/" rel="nofollow external" class="bo">Graphic Design</a> and <a href="http://sixrevisions.com/category/resources/" rel="nofollow external" class="bo">Resources</a>
    </li>
    </ul>
    <h3>About the Author</h3>
    <p><img src="http://cdn.sixrevisions.com/authors/vladimir_gendelman_small.jpg" alt="" width="80" height="80" style="max-width: 100%; height: auto;"><strong>Vladimir Gendelman</strong> is the founder and CEO of <a href="http://www.companyfolders.com/" rel="nofollow external" class="bo">Company Folders, Inc.</a> With years of web and print design experience, he leads a team of talented graphic artists and marketing specialists who help businesses put forth the best image possible. You can follow him on <a href="https://plus.google.com/104441514357046328957" rel="nofollow external" class="bo">Google+</a> and <a href="https://twitter.com/vgendelman" rel="nofollow external" class="bo">Twitter.</a></p>
    <p>The post <a href="http://sixrevisions.com/graphics-design/print-ready-graphics/" rel="nofollow external" class="bo">Are Your Web Graphics Print-Ready?</a> appeared first on <a href="http://sixrevisions.com" rel="nofollow external" class="bo">Six Revisions</a>.</p>
    </div>
]]>
</Body>
<Summary>As a web designer, masters of the digital realm, you might have never faced the situation where your designs are going to be sent to a print shop.   Or perhaps you’re an Internet business owner in...</Summary>
<Website>http://feedproxy.google.com/~r/SixRevisions/~3/i8wqzrHIyV4/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31165/guest@my.umbc.edu/92dd7c86a32588384b4b89d8964a0ab2/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>database</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>graphic-design</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 06:00:31 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 06:00:31 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31164" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31164">
<Title>Using the Foundation framework</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2013/05/thumbnail37.jpg" width="200" height="160" style="max-width: 100%; height: auto;">A couple of weeks ago the famous <a href="http://foundation.zurb.com/" rel="nofollow external" class="bo">Foundation framework</a> released its fourth version. If you have never heard of Foundation we’re going to guide you through using this responsive framework.</p> <p>Since version 3 of Foundation was built from the ground up using SASS — a CSS pre-processor that helps in the writing of more efficient CSS — this new version is also mobile-friendly and provides a lot of features in its grid that you don’t get from other frameworks.</p> <p>Let’s dive into Foundation and see why it’s so popular…</p> <h1>The grid</h1> <p>Foundation uses a 12 column nestable grid that will adapt to any size screen, if you have already used grids this should all be very familiar to you. All the divs in Foundation use box-sizing: border-box so that the borders and padding do not affect the element’s width and height, making the math a little bit easier for us. But the amazing thing about the Foundation grid is that you actually get 2 grids, a big grid for when the screen is bigger than 768px in width and a smaller grid that you can control just as simply. To that end Foundation uses the small-# and large-# classes, like so:</p> <pre>&lt;div class="row"&gt; &lt;div class="small-3 large-4 columns"&gt;Lorem Ipsum&lt;/div&gt; &lt;div class="small-3 large-4 columns"&gt;Lorem Ipsum&lt;/div&gt; &lt;div class="small-6 large-4 columns"&gt;Lorem Ipsum&lt;/div&gt; &lt;/div&gt;</pre> <p>In this code we created a row in which there are 3 divs that are the exact same width when the browser is wider than 768px but when it’s smaller, as you can see by that small class in the divs, the last one will occupy half the screen while the other two will occupy 25% each, this gives you immense control of how our website will look on all screens.</p> <p>Foundation also allows you to offset a column, by which I mean that you can have a row with 2 columns that are only 3 columns wide but you can offset the second one that it floats to the right and to do that we use the large-offset class or the small-offset class:</p> <pre>&lt;div class="row"&gt; &lt;div class="large-3 columns"&gt;&lt;/div&gt; &lt;div class="large-3 large-offset-6 columns"&gt;3, offset 6&lt;/div&gt; &lt;/div&gt; </pre> <p> </p> <h1>Block grid</h1> <p>The block grid is just a nice little extra, it is a way for you to split the content of a list within the grid, it’s useful for when you wish this particular part of your website to stay evenly spaced no matter what the size of the browser. This type of grid uses the small-block-grid and the large-block-grid classes, if you only set the first one the grid will keep the desired spacing no matter what the viewport is but if you only use the large-block-grid class when the viewport reaches the breakpoint of 768px the grid items will stack on top of each other, you can always take more control by using both of these classes, like so:</p> <pre>&lt;ul class="small-block-grid-2 large-block-grid-4"&gt; &lt;li&gt;&lt;img src="image1.png"&gt;&lt;/li&gt; &lt;li&gt;&lt;img src="image2.png"&gt;&lt;/li&gt; &lt;li&gt;&lt;img src="image3.png"&gt;&lt;/li&gt; &lt;li&gt;&lt;img src="image4.png"&gt;&lt;/li&gt; &lt;/ul&gt; </pre> <p>Using this, the images will be evenly spaced no matter the size. When the viewport is bigger than 768px they will only occupy one row, and when it’s smaller than that they will occupy two rows with 2 images each.</p> <p> </p> <h1>The main navigation</h1> <p>Now that we’ve covered the grid in Foundation and how it gives you plenty of control in all environments, we will talk about something we’ll nearly always use on our sites: a top navigation bar. And of course this navigation can also be flexible with little to no work using this framework. To create a simple responsive navigation using Foundation you use:</p> <pre>&lt;nav class="top-bar"&gt; &lt;ul class="title-area"&gt; &lt;li class="name"&gt; &lt;h1&gt;&lt;a href="/"&gt;Website Title&lt;/a&gt;&lt;/h1&gt; &lt;/li&gt; &lt;li class="toggle-topbar menu-icon"&gt;&lt;a href="#"&gt;&lt;span&gt;Menu&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;ul class="right"&gt; &lt;li&gt;&lt;a href="#"&gt;Item 1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Item 2&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Item 3&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Item 4&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/nav&gt; </pre> <p>This bit of HTML creates a simple navigation bar that has the title of the website on the left and then on the right it has four menu items. Also note that when the viewport is smaller than 768px this menu will be replaced by a list icon making this menu responsive. If you want this grid to have its position fixed as you scroll down the page you just need to wrap it in a div with a class of <em>fixed.</em> To add dropdowns to your navigation you just need to add something like this to the place where you want your dropdown:</p> <pre>&lt;li class="has-dropdown"&gt;&lt;a href="#"&gt;Dropdown Level 2c&lt;/a&gt; &lt;ul class="dropdown"&gt; &lt;li&gt;&lt;label&gt;Dropdown Menu&lt;/label&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Sub menu Item 1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Sub menu Item 1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Sub menu Item 3&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; </pre> <p>There is also the ability to add a divider to your list item adding a little grey vertical line, to do that you just need to place a list item with the class of <em>divider</em> between the two list items you wish to divide.</p> <p> </p> <h1>Buttons</h1> <p>No framework would be complete without some predefined buttons and Foundation actually has more than one style of button predefined, it has the default one that uses a blue color and then it adds the success, alert and secondary styles. By adding the class of <em>radius</em> you give this button a little bit of border-radius and by giving it the class of <em>round</em> you make the button almost entirely round. You can also add the class <em>disabled</em> to the button and there are 4 size classes to make the button as big as you need it.</p> <pre>&lt;!-- Size Classes --&gt; &lt;a href="#" class="button"&gt;Default Button&lt;/a&gt; &lt;a href="#" class="tiny button"&gt;Tiny Button&lt;/a&gt; &lt;a href="#" class="small button"&gt;Small Button&lt;/a&gt; &lt;a href="#" class="large button"&gt;Large Button&lt;/a&gt; &lt;!-- Color Classes --&gt; &lt;a href="#" class="button secondary"&gt;Secondary Button&lt;/a&gt; &lt;a href="#" class="button success"&gt;Success Button&lt;/a&gt; &lt;a href="#" class="button alert"&gt;Alert Button&lt;/a&gt; &lt;!-- Radius Classes --&gt; &lt;a href="#" class="button radius"&gt;Radius Button&lt;/a&gt; &lt;a href="#" class="button round"&gt;Round Button&lt;/a&gt; &lt;!-- Disabled Class --&gt; &lt;a href="#" class="button disabled"&gt;Disabled Button&lt;/a&gt; </pre> <p>To create a simple dropdown button you only need to add the dropdown class after the last class, like so:</p> <pre>&lt;a href="#" class="button dropdown"&gt;Dropdown Button&lt;/a&gt; </pre> <p> </p> <h1>Typography</h1> <p>The typography in Foundation uses Helvetica Neue and it also uses em’s instead of pixels to make it easier to adapt your type across all platforms and breakpoints. Using the headers is pretty self explanatory; you just need an h1 and the text you wish inside it, but there are also some other classes that can come in handy when dealing with typography in Foundation.</p> <pre>&lt;!-- subheader --&gt; &lt;h1 class="subheader"&gt;h1.subheader&lt;/h1&gt; &lt;!-- Segment header, the text inside the small tag will act like a sub header --&gt; &lt;h1&gt;h1. &lt;small&gt;Smaller&lt;/small&gt;&lt;/h1&gt; &lt;!-- Use .circle or .square to change the style of the bullets in unordered lists --&gt; &lt;ul class="disc"&gt; &lt;li&gt;List item&lt;/li&gt; &lt;/uL&gt; &lt;ul class="square"&gt; &lt;li&gt;List item&lt;/li&gt; &lt;/uL&gt; &lt;!-- create an inline list--&gt; &lt;ul class="inline-list"&gt; &lt;li&gt;&lt;a href="#"&gt;Link 1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="#"&gt;Link 2&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; </pre> <p>As you can see, when it comes to typography, Foundation provides us with some basic help and then some additional classes to meet all our needs.</p> <p> </p> <h1>Other components</h1> <p>If this demonstration of the Foundation framework has whet your appetite to learn more and start building with Foundation you should really take a look at the documentation because Foundation also offers additional CSS components such as:</p> <ul> <li>Alert Boxes</li> <li>Panels</li> <li>Pricing Tables</li> <li>Progress Bars</li> <li>Tables</li> <li>Thumbnails</li> <li>Flex Video</li> </ul> <p>And also some helper JavaScript such as:</p> <ul> <li>Clearing</li> <li>Dropdown</li> <li>Joyride</li> <li>Magellan</li> <li>Orbit</li> <li>Reveal</li> <li>Section</li> <li>Tooltips</li> </ul> <p>As you can see, there’s a lot of Foundation to explore and I strongly advise you to look at all of its CSS and JavaScript properties.</p> <p> </p> <h1>Conclusion</h1> <p>We covered just enough in this article to see how Foundation can help building faster and more responsive websites, using its grid you get a lot more control over the structure of your website than when using a normal flexible grid and Foundation also gives you plenty of helpers to create your website. I hope this article has given you the push to learn and use Foundation for your next project.</p> <p> </p> <p><em><strong>Have you used Foundation for a project? What features did you find the most useful? Let us know in the comments.</strong></em></p> <p><br><br> </p>
    <table width="100%"> <tbody>
    <tr> <td> <a href="http://www.mightydeals.com/deal/photographypla-overlays-bundle.html?ref=inwidget" rel="nofollow external" class="bo"><strong>250+ Creative Photo Overlays to Enhance Your Images – only $29!</strong></a> </td> <td> <a href="http://www.mightydeals.com/?ref=inwidget" rel="nofollow external" class="bo"><br> <img src="http://mightydeals.com/web/images/widget-logo.png" height="40" width="90" alt="Using the Foundation framework" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2013/06/using-the-foundation-framework/" rel="nofollow external" class="bo">Source</a> <div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F06%2Fusing-the-foundation-framework%2F&amp;t=Using+the+Foundation+framework" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F06%2Fusing-the-foundation-framework%2F&amp;t=Using+the+Foundation+framework" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F06%2Fusing-the-foundation-framework%2F&amp;t=Using+the+Foundation+framework" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F06%2Fusing-the-foundation-framework%2F&amp;t=Using+the+Foundation+framework" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F06%2Fusing-the-foundation-framework%2F&amp;t=Using+the+Foundation+framework" 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/165664997235/u/49/f/661066/c/35285/s/2d2d3eb3/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/165664997235/u/49/f/661066/c/35285/s/2d2d3eb3/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>A couple of weeks ago the famous Foundation framework released its fourth version. If you have never heard of Foundation we’re going to guide you through using this responsive framework.   Since...</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/2d2d3eb3/l/0L0Swebdesignerdepot0N0C20A130C0A60Cusing0Ethe0Efoundation0Eframework0C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31164/guest@my.umbc.edu/8a10389d93c4e4ba59cc2c01d7278b38/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>building-a-responsive-site</Tag>
<Tag>code</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>frameworks</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>introduction-to-foundation</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>quick-responsive-design-solutions</Tag>
<Tag>responsive-frameworks</Tag>
<Tag>responsive-web-design</Tag>
<Tag>sql</Tag>
<Tag>using-foundation</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 05:15:04 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 05:15:04 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31163" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31163">
<Title>30 Days/30 Scholarships: Q&amp;A with Collin Wojciechowski</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="http://umbcgiving.files.wordpress.com/2013/06/wojciechowskicollin.jpg" rel="nofollow external" class="bo"><img alt="Wojciechowski,Collin" src="http://umbcgiving.files.wordpress.com/2013/06/wojciechowskicollin.jpg?w=640" style="max-width: 100%; height: auto;"></a>In his junior year at UMBC, <strong>Collin Wojciechowski ’13</strong>, political science, represented nearly 180,000 students within the University System of Maryland (USM) as their sole student representative on the Board of Regents. Wojciechowski advocated against “doomsday” budget cuts and tuition increases and successfully lobbied to overhaul the USM policy for assessing student fees, making students an active part of the discussion.</p>
    <p>Without the aid of scholarships, he would never have been able to serve his fellow students in this way. We sat down with the newly graduated Sondheim Scholar to talk a little bit about the part scholarships have played in his life.</p>
    <p><a href="https://givecorps.com/en/umbc/projects/463-annual-giving-causes-30-days-30-scholarships" rel="nofollow external" class="bo">Help UMBC students do AMAZING things. Make a gift to the 30 Days/30 Scholarships campaign today!</a></p>
    <p><strong><a href="https://givecorps.com/en/umbc/projects/463-annual-giving-causes-30-days-30-scholarships" rel="nofollow external" class="bo"><img alt="30for30_small" src="http://umbcgiving.files.wordpress.com/2013/06/30for30_small.jpg?w=275&amp;h=275" width="275" height="275" style="max-width: 100%; height: auto;"></a>Q:</strong>  <em>How important was it to your college career to have the support of scholarships?</em></p>
    <p><strong>A: </strong> Being the son of a firemen and a public school teacher and the oldest of three brothers who all aspire to seek higher education, having the support of a scholarship was extremely important to my college career.</p>
    <p><strong>Q:</strong>  <em>Can you tell us a little about what it meant to you to be able to serve as the student regent, and then to continue working with legislators?</em></p>
    <p><strong>A:</strong>  If I did not have a scholarship, I would not have been able to be the USM Student Regent; it’s as simple as that. I only had the time and ability to serve at that post because I did not have to work a side job to pay for college.</p>
    <p>Being the Student Regent was one of the most meaningful experiences of my life. Representing students through such trying times as merger debate and the doomsday budget was the thrill of a lifetime. To then be able to take what I had learned on the Board and use it to represent Dr. Hrabowski in Annapolis was a dream. I have never had more fun then the Session I spent advocating for UMBC before legislators.</p>
    <p><strong>Q:</strong> <em> Has that work given you added insight into education funding, and if so, can you talk a little about the significance of alumni support of education in Maryland?</em></p>
    <p><strong>A:</strong>  Having been a member of the Advancement Committee of the USM Board of Regents, which oversees alumni giving, I feel I have a unique perspective on the significance that alumni support plays in higher education in Maryland. While our state, specifically Governor Martin O’Malley, has done tremendous things for public universities in terms of funding, student support and financial aid always need assistance. As students and their families continue to face economic difficulty it is up to the alumni base to ensure UMBC is a place welcoming to everyone.</p>
    <p><a href="http://www.umbc.edu/classof2013/" rel="nofollow external" class="bo">Read more about Collin and his UMBC experiences on the Class of 2013 site.</a></p>
    <br>   </div>
]]>
</Body>
<Summary>In his junior year at UMBC, Collin Wojciechowski ’13, political science, represented nearly 180,000 students within the University System of Maryland (USM) as their sole student representative on...</Summary>
<Website>http://umbcgiving.wordpress.com/2013/06/12/30-days30-scholarships-qa-with-collin-wojciechowski-13/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31163/guest@my.umbc.edu/95524b60a36e0c0be6e085f4ef81a9a1/api/pixel</TrackingUrl>
<Tag>uncategorized</Tag>
<Group token="retired-548">UMBC Giving</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-548</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/images/avatars/group/11/xsmall.png?1789738931</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/images/avatars/group/11/original.png?1789738931</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/images/avatars/group/11/xxlarge.png?1789738931</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/images/avatars/group/11/xlarge.png?1789738931</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/images/avatars/group/11/large.png?1789738931</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/images/avatars/group/11/medium.png?1789738931</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/images/avatars/group/11/small.png?1789738931</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/images/avatars/group/11/xsmall.png?1789738931</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/images/avatars/group/11/xxsmall.png?1789738931</AvatarUrl>
<Sponsor>UMBC Giving</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 12 Jun 2013 03:40:46 -0400</PostedAt>
<EditAt>Wed, 12 Jun 2013 03:40:46 -0400</EditAt>
</NewsItem>

<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://assets4-my.umbc.edu/images/avatars/group/8/xsmall.png?1789738931</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/images/avatars/group/8/original.png?1789738931</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xxlarge.png?1789738931</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/images/avatars/group/8/xlarge.png?1789738931</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/images/avatars/group/8/large.png?1789738931</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/images/avatars/group/8/medium.png?1789738931</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/images/avatars/group/8/small.png?1789738931</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/images/avatars/group/8/xsmall.png?1789738931</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/images/avatars/group/8/xxsmall.png?1789738931</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>

</News>
