<?xml version="1.0"?>
<News hasArchived="true" page="8865" pageCount="10744" pageSize="10" timestamp="Fri, 07 Aug 2026 15:43:20 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=recent&amp;page=8865">
<NewsItem contentIssues="false" id="27907" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27907">
<Title>Men's Lacrosse Heads to Albany to Battle Tenth-Ranked Great Danes on Friday Evening</Title>
<Body>
<![CDATA[
    <div class="html-content">The UMBC men's lacrosse team faces its fourth ranked team of the 2013 season when the Retrievers (5-6, 2-1 America East) meet the 10th-ranked Albany Great Danes (9-3, 3-0) at John Fallon Field in Albany, N.Y. on Friday, April 19. The opening face-off is set for 7:00 p.m. and the contest will be broadcast on Q1370 (<a href="http://www.q1370.com">www.q1370.com</a>) with Steve Levy on the call and televised live by Time Warner Cable in the Capital Region.</div>
]]>
</Body>
<Summary>The UMBC men's lacrosse team faces its fourth ranked team of the 2013 season when the Retrievers (5-6, 2-1 America East) meet the 10th-ranked Albany Great Danes (9-3, 3-0) at John Fallon Field in...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=7911</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27907/guest@my.umbc.edu/e245f39a9532a964d6195a4600a3657f/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>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 18 Apr 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27940" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27940">
<Title>Track and Field Travels Across Town for Morgan State Legacy Meet Starting on Friday</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE � With just two weeks left before the America East Championships in Vestal, N.Y., the UMBC track and field teams travel across town for the two-day Morgan State Legacy Meet at Hughes Stadium.  The meet is set to begin on Friday with the decathlon and men's javelin kicking-off at 12:00 p.m.  Saturday will start at 9:30 a.m. with the decathlon once again starting things off.</div>
]]>
</Body>
<Summary>BALTIMORE � With just two weeks left before the America East Championships in Vestal, N.Y., the UMBC track and field teams travel across town for the two-day Morgan State Legacy Meet at Hughes...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=7912</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27940/guest@my.umbc.edu/6beedbdcaff0d75b40347b055eaddca6/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>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 18 Apr 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27941" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27941">
<Title>Track and Field Travels Across Town for Morgan State Legacy Meet Starting on Friday</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE � With just two weeks left before the America East Championships in Vestal, N.Y., the UMBC track and field teams travel across town for the two-day Morgan State Legacy Meet at Hughes Stadium.  The meet is set to begin on Friday with the decathlon and men's javelin kicking-off at 12:00 p.m.  Saturday will start at 9:30 a.m. with the decathlon once again starting things off.</div>
]]>
</Body>
<Summary>BALTIMORE � With just two weeks left before the America East Championships in Vestal, N.Y., the UMBC track and field teams travel across town for the two-day Morgan State Legacy Meet at Hughes...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=7913</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27941/guest@my.umbc.edu/1ae2218f7e5122fd6863bafed62def7b/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>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 18 Apr 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30058" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30058">
<Title>Intel&#8217;s Dubious Plan to Take Over TV</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Slumping PC sales and a changing server market are maiming Intel. But its plan to sell services for the home’s biggest screen is a long shot.</p>
    <p>When Intel lifted the veil from its stealthy media division in February, many outsiders scratched their heads. Why was the chip manufacturer, which has tried and failed to sell consumer products before, trying to launch a TV service, one of the trickiest consumer markets of all?</p>
    </div>
]]>
</Body>
<Summary>Slumping PC sales and a changing server market are maiming Intel. But its plan to sell services for the home’s biggest screen is a long shot.  When Intel lifted the veil from its stealthy media...</Summary>
<Website>http://www.technologyreview.com/news/513601/intels-dubious-plan-to-take-over-tv/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30058/guest@my.umbc.edu/0132cf7d8e6766e70f74eea37dd31a36/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>Thu, 18 Apr 2013 00:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27881" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27881">
<Title>Typemock Launches Community for Developers in Early Stages of Unit Testing Adoption</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>With over 50,000 Typemock users worldwide, we have seen time and again cases where developers - who believe in the benefits of Unit testing – drop it after facing opposition from management, harsh deadlines or other early challenges. Typemock wants to help developers overcome the early obstacles they face.</p></div>
]]>
</Body>
<Summary>With over 50,000 Typemock users worldwide, we have seen time and again cases where developers - who believe in the benefits of Unit testing – drop it after facing opposition from management, harsh...</Summary>
<Website>http://www.htmlgoodies.com/daily_news/developer-unit-testing-horror-stories.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27881/guest@my.umbc.edu/c0c7deff3f204c56b3b92042257525c7/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 17 Apr 2013 20:27:00 -0400</PostedAt>
<EditAt>Wed, 17 Apr 2013 20:27:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="27880" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27880">
<Title>Getting Into Ember.js: Part 3</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31394&amp;c=945854465" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31394&amp;c=945854465" alt="" style="max-width: 100%; height: auto;"></a><p>I hope that you’re <a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js-part-2/" rel="nofollow external" class="bo">starting to see</a> that Ember.js is a powerful, yet opinionated, framework. We’ve only scratched its surface; there’s more to learn before we can build something truly useful! We’ll continue using the <a href="https://github.com/NETTUTS/Ember-Starting-Kit" rel="nofollow external" class="bo">Ember Starter Kit</a>. In this portion of the series, we’ll review accessing and managing data within Ember.</p>
    <p></p>
    <hr>
    <h2>Playing with Data</h2>
    <p>In <a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js-part-2/" rel="nofollow external" class="bo">the last article</a>, we worked with a static set of color names that were defined within a controller:</p>
    <pre>App.IndexRoute = Ember.Route.extend({&#x000A;     setupController: function(controller) {&#x000A;       controller.set('content', ['red', 'yellow', 'blue']);&#x000A;     }&#x000A;    });</pre>
    <p>This allowed the controller to expose the data to the <em>index</em> template. That’s cute for a demo, but in real life, our data source will not be a hard-coded array.</p>
    <p>This is where <em>models</em> comes in. <em>Models</em> are object representations of the data your application uses. It could be a simple array or data dynamically retrieved from a RESTful JSON API. The data itself is accessed by referencing the model’s attributes. So, if we look at a result like this:</p>
    <pre>{&#x000A;       "login": "rey",&#x000A;       "id": 1,&#x000A;       "age": 45,&#x000A;       "gender": "male"&#x000A;    }</pre>
    <p>The attributes exposed in the model are:</p>
    <ul>
    <li>login</li>
    <li>id</li>
    <li>age</li>
    <li>gender</li>
    </ul>
    <blockquote><p>Data itself is accessed by referencing the model’s attributes.</p></blockquote>
    <p>As you see from the code above, you could define a static store, but you’ll use <a href="http://emberjs.com/guides/object-model/classes-and-instances/" rel="nofollow external" class="bo">Ember.Object</a> for defining your models most of the time. By subclassing <code>Ember.Object</code>, you’ll be able to return data (e.g.: via an Ajax call) and define your model. While you can explicitly set data within a controller, it’s always recommended that you create a model in order to adhere to separation of concerns and code organization best practices.</p>
    <p>Alternatively, you could use a sister framework called <a href="https://github.com/emberjs/data" rel="nofollow external" class="bo">Ember Data</a>. It is an ORM-like API and persistence store, but I need to stress that it is in a state of flux as of this writing. It has a lot of potential, but using <code>Ember.Object</code> is much safer at this time. Robin Ward, co-founder of <a href="http://www.discourse.org/" rel="nofollow external" class="bo">Discourse</a>, wrote <a href="http://eviltrout.com/2013/03/23/ember-without-data.html" rel="nofollow external" class="bo">a great blog post</a> on using Ember without Ember Data. It outlines their process, which I’ll break down for you.</p>
    <hr>
    <h2>Defining your Models</h2>
    <p>In the following example, I’m going to use the <a href="http://api.ihackernews.com/" rel="nofollow external" class="bo">unofficial Hacker News API</a> to pull JSON-based data from the news resource. This data will be stored in my model and later used by a controller to fill a template. If we look at the data returned from the API, we can understand the properties we’ll be working with:</p>
    <pre>{&#x000A;      "nextId": null,&#x000A;      "items": [{&#x000A;              "title": "Docker, the Linux container runtime: now open-source",&#x000A;              "url": "<a href="http://docker.io">http://docker.io</a>",&#x000A;              "id": 5445387,&#x000A;              "commentCount": 39,&#x000A;              "points": 146,&#x000A;              "postedAgo": "2 hours ago",&#x000A;              "postedBy": "shykes"&#x000A;          }, {&#x000A;              "title": "What\u0027s Actually Wrong with Yahoo\u0027s Purchase of Summly",&#x000A;              "url": "<a href="http://hackingdistributed.com/2013/03/26/summly/">http://hackingdistributed.com/2013/03/26/summly/</a>",&#x000A;              "id": 5445159,&#x000A;              "commentCount": 99,&#x000A;              "points": 133,&#x000A;              "postedAgo": "2 hours ago",&#x000A;              "postedBy": "hoonose"&#x000A;          },&#x000A;      ],&#x000A;      "version": "1.0",&#x000A;      "cachedOnUTC": "\/Date(1364333188244)\/"&#x000A;    }</pre>
    <p>I want to work with the <code>items</code> property, which contains all of the headlines and story information. If you’ve worked with SQL databases, think of each element of <code>items</code> as a record and the property names (i.e.: <code>title</code>, <code>url</code>, <code>id</code>, etc.) as field names. It’s important to grok the layout because these property names will be used as the attributes of our model object—which is a perfect segue into creating the model.</p>
    <blockquote><p><code>Ember.Object</code> is the main base class for all Ember objects, and we’ll subclass it to create our model using its <code>extend()</code> method.</p></blockquote>
    <p>To do this, we’ll add the following code to <em>js/app.js</em> immediately after the code that defines <code>App.IndexRoute</code>:</p>
    <pre>App.Item = Ember.Object.extend();</pre>
    <p><code>App.Item</code> serves as the model class for the Hacker News data, but it has no methods to retrieve or manipulate that data. So, we’ll need to define those:</p>
    <pre>App.Item.reopenClass({&#x000A;      all: function() {&#x000A;          return $.getJSON("<a href="http://api.ihackernews.com/page?format=jsonp&amp;callback=?%22).then(function(response)">http://api.ihackernews.com/page?format=jsonp&amp;callback=?").then(function(response)</a> {&#x000A;            var items = [];&#x000A;    &#x000A;            response.items.forEach( function (item) {&#x000A;              items.push( App.Item.create(item) );&#x000A;            });&#x000A;    &#x000A;    	      return items;&#x000A;          });&#x000A;      }&#x000A;    });</pre>
    <p>Let’s break down this code. First, we use Ember’s <code>reopenClass()</code> method to add our new methods to the <code>App.Item</code> class, and you pass it an object that contains our desired methods. For this example, we only need one method called <code>all()</code>: it returns all of the headlines from the Hacker News frontpage. Because jQuery is part of the deal with Ember, we have its simple Ajax API at our disposal. The API uses JSONP to return JSON data; so, I can just use <code>$.getJSON()</code> to make the request to:</p>
    <pre>$.getJSON("<a href="http://api.ihackernews.com/page?format=jsonp&amp;callback">http://api.ihackernews.com/page?format=jsonp&amp;callback</a>=?")</pre>
    <p>The “callback=?” tells jQuery that this is a JSONP request, and the data (once it’s retrieved) is passed to an anonymous callback handler defined using jQuery’s promises functionality:</p>
    <pre>.then(function(response) {...});</pre>
    <blockquote><p>I can easily pump in my JSON data into an Ember object.</p></blockquote>
    <p>The <code>response</code> parameter contains the JSON data, allowing you to loop over the records and update the local <code>items</code> array with instances of <code>App.Item</code>. Lastly, we return the newly populated array when <code>all()</code> executes. That’s a lot of words, so let me summarize:</p>
    <ul>
    <li>Create your new model class by subclassing <code>Ember.Object</code> using <code>extend()</code>.</li>
    <li>Add your model methods using <code>reopenClass()</code>.</li>
    <li>Make an Ajax call to retrieve your data.</li>
    <li>Loop over your data, creating an <code>Item</code> object and pushing it into an array.</li>
    <li>Return the array when the method executes.</li>
    </ul>
    <p>If you refresh <em>index.html</em>, you’ll see nothing has changed. This makes sense because the model has only been defined; we haven’t accessed it.</p>
    <hr>
    <h2>Exposing Your Data</h2>
    <p>Controllers act like proxies, giving you access to the model’s attributes and allowing templates to access them in order to dynamically render the display. In addition to accessing attributes from an associated model, controllers can also store other application properties that need to persist without saving to a server.</p>
    <p>Currently, our app has the following controller (the one that defines a static data set):</p>
    <pre>App.IndexRoute = Ember.Route.extend({&#x000A;      setupController: function(controller) {&#x000A;        controller.set('content', ['red', 'yellow', 'blue']);&#x000A;      }&#x000A;    });</pre>
    <p>We can directly associate our model with <code>App.IndexRoute</code> using the <code>model</code> method (AKA the model hook):</p>
    <pre>App.IndexRoute = Ember.Route.extend({&#x000A;      model: function() {&#x000A;        return App.Item.all();&#x000A;      }&#x000A;    });</pre>
    <p>Remember that Ember defines your controller if you don’t explicitly define it yourself, and that is what’s happening in this case.</p>
    <blockquote><p>Behind the scenes, Ember creates <code>IndexController</code> as an instance of <code>Ember.ArrayController</code>, and it uses the model specified in the <code>model</code> method.</p></blockquote>
    <p>Now we just need to update the index template to access the new attributes. Opening <em>index.html</em>, we can see the following Handlebars template code:</p>
    <pre>{{#each item in model}}&#x000A;        &lt;li&gt;{{item}}&lt;/li&gt;&#x000A;    {{/each}}</pre>
    <p>With one small change (adding the <code>title</code> property), we can immediately see the titles returned from the Hacker News API:</p>
    <p><code>{{item.title}}</code></p>
    <p>If you refresh your browser now, you should see something similar to the following:</p>
    <pre>&lt;h3&gt;Welcome to Ember.js&lt;/h3&gt;&#x000A;    &lt;ul&gt;&lt;li&gt;Persona is distributed. Today.&lt;/li&gt;&#x000A;    &lt;li&gt;21 graphs that show America's health-care prices are ludicrous&lt;/li&gt;&#x000A;    &lt;li&gt;10 000 concurrent real-time connections to Django&lt;/li&gt;&#x000A;    &lt;li&gt;Docker, the Linux container runtime: now open-source&lt;/li&gt;&#x000A;    &lt;li&gt;Let's Say FeedBurner Shuts Down…&lt;/li&gt;&lt;/ul&gt;&#x000A;    </pre>
    <p>If you want to display more information, simply add more properties:</p>
    <pre>{{item.title}} - {{item.postedAgo}} by {{item.postedBy}}</pre>
    <p>Refresh to see the updates you’ve made. That’s the beauty of Handlebars; it makes it trivial to add new data elements to the user interface.</p>
    <p>As I mentioned before, controllers can also be used to define static attributes that need to persist throughout the life of your application. For example, I may want to persist certain static content, like this:</p>
    <pre>App.IndexController = Ember.ObjectController.extend({&#x000A;      headerName: 'Welcome to the Hacker News App',&#x000A;      appVersion:  2.1&#x000A;    });</pre>
    <p>Here, I subclass <code>Ember.ObjectController</code> to create a new controller for my <em>index</em> route and template to work with. I can now go to <em>index.html</em> and update my template to replace the following:</p>
    <pre>&lt;h2&gt;Welcome to Ember.js&lt;/h2&gt;</pre>
    <p>with:</p>
    <pre>&lt;h2&gt;{{headerName}}&lt;/h2&gt;</pre>
    <blockquote><p><em>Models</em> are object representations of the data your application uses.</p></blockquote>
    <p>Handlebars will take the specified attributes in my controller and dynamically replace the <code>{{headerName}}</code> placeholder with its namesake value. It’s important to reinforce two things:</p>
    <ul>
    <li>By adhering to Ember’s naming conventions, I didn’t have to do any wiring to be able to use the controller with the index template.</li>
    <li>Even though I explicitly created an <code>IndexController</code>, Ember is smart enough not to overwrite the existing model that’s been associated via the route.</li>
    </ul>
    <p>That’s pretty powerful and flexible stuff!</p>
    <hr>
    <h2>Next up…Templates</h2>
    <p>Working with data in Ember isn’t difficult. In actuality, the hardest part is working with the various APIs that abound on the web.</p>
    <blockquote><p>The fact that I can easily pump in my JSON data into an Ember object makes management substantially easier—although I’ve never been a big fan of large data sets on the client-side, especially when represented as objects.</p></blockquote>
    <p>It’s something I’ll have to do more testing on, and I hope that Ember Data makes all of this trivial.</p>
    <p>With that said, I briefly touched on templates in this article. They’re very important… so much so that I want to tackle this topic in its own article. So in the next article, we’ll go over how to leverage Handelbars to build your user interface and drill-down into the various directives the templating framework offers.</p>
    </div>
]]>
</Body>
<Summary>I hope that you’re starting to see that Ember.js is a powerful, yet opinionated, framework. We’ve only scratched its surface; there’s more to learn before we can build something truly useful!...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/-fRrSIgHeWU/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27880/guest@my.umbc.edu/fc4e0bcde9af57e18d766f88c8d49e8a/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>ember</Tag>
<Tag>handlebars</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>javascript-and-ajax</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 17 Apr 2013 19:20:52 -0400</PostedAt>
<EditAt>Wed, 17 Apr 2013 19:20:52 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="30059" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30059">
<Title>Have You Embarrassed Yourself Online?</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Many web services offer an accidental megaphone. They need to protect us from ourselves.</p>
    <p>I haven’t used Facebook’s Groups feature, but today brings <a href="http://allthingsd.com/20130417/facebook-gives-timeline-billing-to-groups-product/" rel="nofollow external" class="bo">news</a> that the company is boosting its visibility by adding the section to users’ Timeline pages. On some intuitive level, this bothers me: Groups is about having private conversations among friends and colleagues, reportedly. Yet the Timeline is one of the most visible, public parts of a Facebook user’s page. So what gives?</p>
    </div>
]]>
</Body>
<Summary>Many web services offer an accidental megaphone. They need to protect us from ourselves.  I haven’t used Facebook’s Groups feature, but today brings news that the company is boosting its...</Summary>
<Website>http://www.technologyreview.com/view/513846/have-you-embarrassed-yourself-online/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30059/guest@my.umbc.edu/ed25683063a73a680fb05c4c48f8f13d/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, 17 Apr 2013 19:13:19 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27876" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27876">
<Title>WP Migrate DB Pro</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>I think the most common tech question we get on ShopTalk show is how to keep a WordPress database in sync between live and local. This (paid) plugin can do it right from one admin screen to another by POSTing secure requests of SQL data bit by bit until they are in sync. </p>
    <p><a href="http://deliciousbrains.com/wp-migrate-db-pro/" title="Direct link to featured article" rel="nofollow external" class="bo">Direct Link to Article</a> — <a href="http://css-tricks.com/wp-migrate-db-pro/" rel="nofollow external" class="bo">Permalink</a></p>
    <p><small><a href="http://css-tricks.com/wp-migrate-db-pro/" rel="nofollow external" class="bo">WP Migrate DB Pro</a> is a post from <a href="http://css-tricks.com" rel="nofollow external" class="bo">CSS-Tricks</a></small></p>
    </div>
]]>
</Body>
<Summary>I think the most common tech question we get on ShopTalk show is how to keep a WordPress database in sync between live and local. This (paid) plugin can do it right from one admin screen to...</Summary>
<Website>http://deliciousbrains.com/wp-migrate-db-pro/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27876/guest@my.umbc.edu/840a42d317c95205d73c8a971609e217/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>link</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tricks</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 17 Apr 2013 18:37:43 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27921" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27921">
<Title>Is God Sexist or Affirming? Find out tomorrow night in Academic IV at 7:30pm!</Title>
<Body>
<![CDATA[
    <div class="html-content">Hello everyone! I am pleased to share with you all that Dr. David Lamb (<a href="http://www.davidtlamb.com">www.davidtlamb.com</a>), author of “God Behaving Badly: Is the God of the Old Testament Angry, Sexist, and Racist?” will be speaking tomorrow night during IV LIVE on … <a href="http://umbciv.wordpress.com/2013/04/17/is-god-sexist-or-affirming-find-out-tomorrow-night-in-academic-iv-at-730pm/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>Hello everyone! I am pleased to share with you all that Dr. David Lamb (www.davidtlamb.com), author of “God Behaving Badly: Is the God of the Old Testament Angry, Sexist, and Racist?” will be...</Summary>
<Website>http://umbciv.wordpress.com/2013/04/17/is-god-sexist-or-affirming-find-out-tomorrow-night-in-academic-iv-at-730pm/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27921/guest@my.umbc.edu/3aaa5317cf8df23b605b29d01728d309/api/pixel</TrackingUrl>
<Tag>posts</Tag>
<Group token="iv">Intervarsity Christian Fellowship</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/iv</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/xsmall.png?1567536344</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/original.png?1567536344</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/xxlarge.png?1567536344</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/xlarge.png?1567536344</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/large.png?1567536344</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/medium.png?1567536344</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/small.png?1567536344</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/xsmall.png?1567536344</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/094/dd82d58268453ca1c56996aa87e97fca/xxsmall.png?1567536344</AvatarUrl>
<Sponsor>InterVarsity Christian Fellowship</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 17 Apr 2013 18:18:43 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27875" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27875">
<Title>Preventing the Performance Hit from Custom Fonts</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The issue is 1) custom fonts are awesome and we want to use them 2) custom fonts slow down our pages by being large additional resources. Dealing with this has been in the air recently so I thought I'd round up some of the ideas and add thoughts of my own. </p>
    <p></p>
    <h3>Only load on large screens</h3>
    <p>The first idea I saw was Dave Rupert's tests on only loading @font-face on large screens. Turns out if you use @font-face but don't ever apply that font-family, the font won't be downloaded. Pretty smart, browsers. <a href="http://codepen.io/davatron5000/pen/nrfGA" rel="nofollow external" class="bo">Dave's demo.</a></p>
    <pre><code>@font-face {&#x000A;      font-family: 'Dr Sugiyama';&#x000A;      font-style: normal;&#x000A;      font-weight: 400;&#x000A;      src: local("Dr Sugiyama Regular"), local("DrSugiyama-Regular"), url(<a href="http://themes.googleusercontent.com/static/fonts/drsugiyama/v2/rq_8251Ifx6dE1Mq7bUM6brIa-7acMAeDBVuclsi6Gc.woff">http://themes.googleusercontent.com/static/fonts/drsugiyama/v2/rq_8251Ifx6dE1Mq7bUM6brIa-7acMAeDBVuclsi6Gc.woff</a>) format("woff");&#x000A;    }&#x000A;    &#x000A;    body {&#x000A;      font-family: sans-serif;&#x000A;    }&#x000A;    @media (min-width: 1000px) {&#x000A;      body {&#x000A;        font-family: 'Dr Sugiyama', sans-serif;&#x000A;      }&#x000A;    }</code></pre>
    <p>Jordan Moore has an article on the Typekit Blog <a href="http://blog.typekit.com/2013/04/17/fallback-fonts-on-mobile-devices/" rel="nofollow external" class="bo">"Fallback Fonts on Mobile Devices"</a> that uses the same thinking.</p>
    <blockquote><p>I applied this thinking to my own project by producing two separate font kits: a “full” font kit containing all the typographical styles I originally intended to use, and a “light” kit containing fewer fonts (and, consequently, weighing significantly less). I loaded the kits via JavaScript depending on the width of the user’s screen, with the value based on the smallest breakpoint.</p></blockquote>
    <p>With Dave's technique, you wouldn't have to worry about FOUT (Flash of Unstyled Text) since it's using native @font-face and most browsers have dealt with that. Jordan's technique would be more subject to FOUT I would think, having to load the fonts after a test, but you could fix that how you always fix that with Typekit: <a href="http://blog.typekit.com/2010/10/29/font-events-controlling-the-fout/" rel="nofollow external" class="bo">using <code>visibility: hidden</code> while the fonts load</a>.</p>
    <h3>Ajax in the fonts</h3>
    <p>If you're biggest concern is slowing down the render time (not necessarily the fully loaded page time), you could Ajax in the stylesheet that contains the @font-face stuff after document ready. Omar Al Zabir <a href="http://www.codeproject.com/Articles/462209/Using-custom-font-without-slowing-down-page-load" rel="nofollow external" class="bo">has a tutorial on this</a>. (thx <a href="https://twitter.com/ilikevests/status/324593491411873792" rel="nofollow external" class="bo">Kevin</a>)</p>
    <pre><code>$(document).ready(function(){&#x000A;      $.ajax({&#x000A;        url: fontFile,&#x000A;        beforeSend: function ( xhr ) {&#x000A;          xhr.overrideMimeType("application/octet-stream");&#x000A;        },&#x000A;        success: function(data) {&#x000A;          $("&lt;link /&gt;", {&#x000A;            'rel': 'stylesheet'&#x000A;            'href': 'URL/TO/fonts.css'&#x000A;          }).appendTo('head');&#x000A;        }&#x000A;      });&#x000A;    });</code></pre>
    <p>Making sure the font files have far expires headers is important too. In order to beat FOUT here, you would add a class to the <code>&lt;html&gt;</code> element (immediately with JavaScript) that you would use to <code>visibility: hidden</code> what you want to hide until the fonts load, and remove it in the Ajax success callback.</p>
    <h3>Lazy load the fonts, load on subsequent page loads after cached</h3>
    <p>Extending that idea, perhaps we could only display custom fonts if we were pretty darn sure the font files were cached. On the back-end, we check for a cookie (that we'll set ourselves later) that indicateds the fonts are cached.</p>
    <pre><code>// Check if cookie exists suggesting fonts are cached&#x000A;    &#x000A;    if (fonts_are_cached) {&#x000A;      echo "&lt;link rel='stylesheet' href='/URL/TO/fonts.css'&gt;";&#x000A;    }</code></pre>
    <p>On the front-end, we'll do the exact opposite. If the cookie isn't there, we'll lazy-load those fonts and then set the cookie.</p>
    <pre><code>// Check if cookie exists suggesting fonts are cached&#x000A;    &#x000A;    if (!fonts_are_cached) {&#x000A;    &#x000A;      // Don't slow down rendering&#x000A;      $(window).load(function() {&#x000A;    &#x000A;        // Load in custom fonts&#x000A;        $.ajax({&#x000A;          url: 'URL/TO/font.woff'&#x000A;        });&#x000A;        $.ajax({&#x000A;          url: 'URL/TO/font.eot'&#x000A;        });&#x000A;        // Don't actually do anything with them, just request them so they are cached.&#x000A;    &#x000A;        // Set cookie indicating fonts are cached&#x000A;    &#x000A;      });&#x000A;      &#x000A;    }</code></pre>
    <p>Not foolproof, since that cookie isn't 100% proof that font is cached. But if you set it to expire in like one day it stands a decent chance. No FOUT here though, since it either doesn't load the fonts at all or does it natively with @font-face. If you don't mind FOUT (i.e. you want to show your custom font on that first page load no matter what), you could create the <code>&lt;link&gt;</code> and insert the fonts stylesheet instead of just requesting the fonts.</p>
    <p>Another alternative would be to place a data URI version of the font into localStorage and yank it out when you need it. You would create a <code>&lt;style&gt;</code> element, put the @font-face code in that using the data URI version of the font, and inject that. Apparently The Guardian is trying that.</p>
    <blockquote>
    <p>@<a href="https://twitter.com/scottjehl" rel="nofollow external" class="bo">scottjehl</a> Related to the cache discussion: the Guardian is playing with localStorage. <a href="https://t.co/s9kZm8r6JT" title="https://github.com/guardian/frontend/blob/master/common/app/assets/javascripts/modules/fonts.js#L88" rel="nofollow external" class="bo">github.com/guardian/front…</a> @<a href="https://twitter.com/davatron5000" rel="nofollow external" class="bo">davatron5000</a> @<a href="https://twitter.com/chriscoyier" rel="nofollow external" class="bo">chriscoyier</a></p>
    <p>— Tim Kadlec (@tkadlec) <a href="https://twitter.com/tkadlec/status/324603294251094017" rel="nofollow external" class="bo">April 17, 2013</a></p>
    </blockquote>
    <p>Fair warning, localStorage can be slower than cache.</p>
    <blockquote>
    <p>@<a href="https://twitter.com/tkadlec" rel="nofollow external" class="bo">tkadlec</a> @<a href="https://twitter.com/scottjehl" rel="nofollow external" class="bo">scottjehl</a> @<a href="https://twitter.com/davatron5000" rel="nofollow external" class="bo">davatron5000</a> @<a href="https://twitter.com/chriscoyier" rel="nofollow external" class="bo">chriscoyier</a> local storage works if you absolutely need it, but can be slower to read than browser cache</p>
    <p>— Addy Osmani (@addyosmani) <a href="https://twitter.com/addyosmani/status/324610077287907328" rel="nofollow external" class="bo">April 17, 2013</a></p>
    </blockquote>
    <hr>
    <p>A possible advantage to using JavaScript fanciness is knowing which font versions you need.</p>
    <blockquote>
    <p>@<a href="https://twitter.com/davatron5000" rel="nofollow external" class="bo">davatron5000</a> @<a href="https://twitter.com/sturobson" rel="nofollow external" class="bo">sturobson</a> @<a href="https://twitter.com/chriscoyier" rel="nofollow external" class="bo">chriscoyier</a> We're loading data uri'd fonts w/ insertBefore. Defaulting to WOFF.css, using TTF or EOT if android/ie</p>
    <p>— Scott Jehl (@scottjehl) <a href="https://twitter.com/scottjehl/status/324597243044831233" rel="nofollow external" class="bo">April 17, 2013</a></p>
    </blockquote>
    <p><a href="https://gist.github.com/scottjehl/5406853" rel="nofollow external" class="bo">And how.</a></p>
    <h3>The Future</h3>
    <p>This all gets better the more information we can get our hands on regarding the clients situation. </p>
    <p>What kind of bandwidth and latency are they getting? This is pretty hard (and heavy) to test and not super reliable even when we can. Perhaps the <a href="http://www.w3.org/TR/netinfo-api/#the-networkinformation-interface" rel="nofollow external" class="bo">network information API</a> will help someday. </p>
    <p>What is their screen size? What are the capabilities of the browser? We can test this stuff in JavaScript, but what if it would be better to know server side? Perhaps <a href="https://github.com/igrigorik/http-client-hints" rel="nofollow external" class="bo">Client-Hints</a> will help someday.</p>
    <p></p>
    <p><small><a href="http://css-tricks.com/preventing-the-performance-hit-from-custom-fonts/" rel="nofollow external" class="bo">Preventing the Performance Hit from Custom Fonts</a> is a post from <a href="http://css-tricks.com" rel="nofollow external" class="bo">CSS-Tricks</a></small></p>
    </div>
]]>
</Body>
<Summary>The issue is 1) custom fonts are awesome and we want to use them 2) custom fonts slow down our pages by being large additional resources. Dealing with this has been in the air recently so I...</Summary>
<Website>http://css-tricks.com/preventing-the-performance-hit-from-custom-fonts/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27875/guest@my.umbc.edu/95157723eeae5fe177264f957c74c50c/api/pixel</TrackingUrl>
<Tag>article</Tag>
<Tag>css</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tricks</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 17 Apr 2013 17:37:29 -0400</PostedAt>
<EditAt>Wed, 17 Apr 2013 17:37:29 -0400</EditAt>
</NewsItem>

</News>
