<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Mobile in Higher Ed</title>
	
	<link>http://www.dmolsen.com/mobile-in-higher-ed</link>
	<description>for when i need more than 140 characters</description>
	<lastBuildDate>Tue, 21 Feb 2012 14:31:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MobileInHigherEd" /><feedburner:info uri="mobileinhighered" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>RESS, Server-Side Feature-Detection and the Evolution of Responsive Web Design</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/HiqOjiRhWCk/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/ress-and-the-evolution-of-responsive-web-design/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:05:34 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[beep]]></category>
		<category><![CDATA[browser detection]]></category>
		<category><![CDATA[dataatlas]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[feature detection]]></category>
		<category><![CDATA[ffly]]></category>
		<category><![CDATA[future friendly]]></category>
		<category><![CDATA[jonarnes]]></category>
		<category><![CDATA[lukew]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[mustache]]></category>
		<category><![CDATA[responsive web design]]></category>
		<category><![CDATA[ress]]></category>
		<category><![CDATA[rwd]]></category>
		<category><![CDATA[slightlylate]]></category>
		<category><![CDATA[ua-parser-php]]></category>
		<category><![CDATA[wurfl]]></category>
		<category><![CDATA[yiibu]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=335</guid>
		<description><![CDATA[In May 2010 Ethan Marcotte (@beep) wrote the seminal article, Responsive Web Design. At first I took a dim view of the piece. Most of my mobile experience at the time was in developing mobile-optimized experiences that relied on browser-detection &#38; serving separate templates. Honestly, it worked for me as a, primarily, server-side dev and it [...]]]></description>
			<content:encoded><![CDATA[<p>In May 2010 Ethan Marcotte (<a href="http://twitter.com/beep">@beep</a>) wrote the seminal article, <em><a href="http://www.alistapart.com/articles/responsive-web-design/">Responsive Web Design</a></em>. At first I took a dim view of the piece. Most of <a href="http://m.wvu.edu/">my mobile experience</a> at the time was in developing mobile-optimized experiences that relied on browser-detection &amp; serving separate templates. Honestly, it worked for me as a, primarily, server-side dev and it worked well. To me, responsive web design seemed like a front-end solution that didn&#8217;t take into account many of the issues facing mobile developers&#8230; apart from screen width that is.</p>
<p>Fast forward a year and a half (<em>and quite a few arguments</em>)&#8230; I&#8217;ve now worked on <a href="http://happyholidays.wvu.edu/">one responsive project</a>, I&#8217;ve watched a number of other responsive projects come out of <a href="http://universityrelations.wvu.edu/">our department</a>, and I&#8217;ve come to appreciate where and when responsive web design works and works well. On top of that I&#8217;ve learned how helpful front-end projects like <a href="http://modernizr.com/">Modernizr</a>, <a href="http://microjs.com/">MicroJS</a>, and <a href="http://yepnopejs.com/">YepNope.js</a> can be to any developer. That being said, it&#8217;s tough to teach an old dog new tricks and, to me, it still seemed as if their was something not quite right about responsive web design.</p>
<p>At this point I won&#8217;t rehash the arguments. Yes, dear dead horse, you can have a rest. Instead, I&#8217;ll focus on an article Luke Wroblewski (<a href="http://twitter.com/lukew/" rel="nofollow">@lukew</a>) wrote entitled, <em><a href="http://www.lukew.com/ff/entry.asp?1392" rel="nofollow">Responsive Design + Server Side Components</a></em>.</p>
<h2>RESS: Responsive Design + Server Side Components</h2>
<p>For a while now I&#8217;ve felt like I was somehow out of touch for still preferring browser-detection over responsive design (<em>like I said, I&#8217;m an old dog</em>). I&#8217;m assuming it&#8217;s because I tend to follow front-end folks on Twitter who are very much on the responsive web design bandwagon. But between <a href="http://www.lukew.com/ff/entry.asp?1392">Luke&#8217;s article</a>, <a href="http://yiibu.com/">Yiibu’s</a> talk, <em><a href="http://www.slideshare.net/yiibu/adaptation-why-responsive-design-actually-begins-on-the-server">Adaptation</a>,</em> as well as their <a href="https://github.com/yiibu/profile">Profile tool</a>, and the news that <a href="http://www.circleid.com/posts/20120111_analysis_of_server_side_mobile_web_detection/">82% of Alexa&#8217;s top 100 properties used server-side detection to modify some amount of their content</a> I started to feel a little less out of touch.</p>
<p>The principle concept that I found so intriguing in Luke&#8217;s article, as well as the work done by Yiibu, is that <strong>browser-detection can be used to help inform an overall responsive design as opposed to being the be-all-end-all for templating</strong>. By this I mean that partial pieces of content can be inserted intelligently and where appropriate (<em>think images</em>) into a larger layout that&#8217;s given to all browsers and is governed by responsive design principles. Hence the combining of &#8220;<em>responsive design</em>&#8221; and &#8220;<em>server side components</em>&#8221; in Luke&#8217;s name for the technique.</p>
<p>This isn&#8217;t something that I should consider revolutionary. On the face of it&#8217;s sort of &#8220;<em>Duh!</em>&#8221; but sometimes even the obvious has to be pointed out. It&#8217;s nice to see a bridge of sorts form between these two competing concepts. Their is value on both sides of the fence and they can and should work together. The question is &#8220;<em>How?</em>&#8221;</p>
<h2>Implementing a RESS Solution</h2>
<p>Luke does a good job of <a href="http://www.lukew.com/ff/entry.asp?1392">taking a reader through a theoretical(?) RESS solution</a> that is based on his experiences at his start-up, Bagcheck. He shows,  quite clearly, how the server-defined partials fit in nicely with an overall responsive design. One thing that the original RESS example fails to review is <em>how</em> content is classified for browsers though there is a nod towards user agent detection. I was curious to see how that part of a RESS solution worked so I put together one of my own that used <a href="http://mustache.github.com/">Mustache</a> just like in his example and <a href="http://detector.dmolsen.com">Detector.</a></p>
<p><a href="http://detector.dmolsen.com/demo/mustache/">My implementation of a RESS solution</a> is very simple. I didn&#8217;t explore much beyond modifying some markup, adaptive images, and CSS. The first thing that I realized when I started tackling the &#8220;<em>how</em>&#8221; was that I was going to have to categorize browsers into classes (<em>to be fair, Luke does mention classes</em>). For the <a href="http://detector.dmolsen.com/demo/mustache/">purposes of the example</a> I set the browser classes to be <a href="http://detector.dmolsen.com/demo/mustache/?pid=13ee8513d6fb7f97aef6635309b91f40">desktop</a>, <a href="http://detector.dmolsen.com/demo/mustache/?pid=e1bd58cc186d3a2156b6ebddb558fd41">mobile-advanced</a>, and <a href="http://detector.dmolsen.com/demo/mustache/?pid=658e6d9b003bb3f3a3d9ae6e5ca1a42a">mobile-basic</a>. The desktop class has &#8220;regular-sized&#8221; images, the mobile-advanced class has smaller images as well as some modified CSS, and the mobile-basic class has a very simple layout that utilizes accesskeys.</p>
<p>If you&#8217;re interested in how I set-up <a href="http://detector.dmolsen.com/demo/mustache/">the demo</a> and <a href="https://github.com/dmolsen/Detector/wiki/Templating-with-Detector-&amp;-Mustache-Tutorial">how it all works</a> please <a href="https://github.com/dmolsen/Detector/wiki/Templating-with-Detector-&amp;-Mustache-Tutorial">check out the tutorial</a> and <a href="https://github.com/dmolsen/Detector/tree/master/web/demo/mustache">the source</a>. What I&#8217;d like to talk about now is how I ended up with my classifications and how I think it points to more responsive solutions <em>on the server</em> and not just in the browser.</p>
<h2>Taking Feature-Detection Server-Side</h2>
<p>Developers have been using server-side libraries &amp; services like <a href="http://wurfl.sourceforge.net/">WURFL</a>, <a href="http://deviceatlas.com/">DeviceAtlas</a>, and <a href="http://51degrees.mobi/">51Degrees.mobi</a> to provide mobile device characteristics for ages. In that respect, server-side feature-detection is nothing new. I would propose that we update our terminology a bit though. &#8220;<em>Device detection</em>&#8221; seems anachronistic and, frankly, misguided to me. Who cares what a device can do if the browser, the bit we as developers actually interact with, can&#8217;t access them?  This is not to suggest that these device databases don&#8217;t contain that kind of information but rather that they include details that, for the most part, might not matter to developers. In order to get more relevant data there is one technique that server-side developers should appropriate from our front-end brethren and it&#8217;s <em>browser</em> <em>feature-detection</em>.</p>
<p>In his article, <em><a href="http://infrequently.org/2011/01/cutting-the-interrogation-short/">Cutting the Interrogation Short</a></em>, Alex Russell (<a href="http://twitter.com/slightlylate">@slightlylate</a>) makes an interesting proposal. He suggests, &#8220;<em>feature tests should only ever be run</em> <strong><em>when you don’t know what UA you’re running in</em></strong>.&#8221; This is a proposal I wholeheartedly agree with. So where to store the results of these feature tests that you want to run only once per user-agent? Alex suggests a few methods that rely on the front-end detection libraries but I would suggest that the results get stored in a server-side cache (<em>but, hey, I&#8217;m biased</em>). Feature test results stored on the server, using the user agent as a key, gives server-side code the ability to act on them making the server-side code that much smarter about what should be delivered. If necessary, the server-side code can always pass the list of features for a particular user agent to the browser as a cookie or a JavaScript include. Also, if tests are stored server-side the initial set of tests can be <a href="http://detector.dmolsen.com/demo/modernizr-listing/">extremely robust</a>. The developer would capture a lot of details but still have control over what gets delivered to the browser thereby optimizing the experience for their visitors. Hopefully, it could make for a &#8220;<em>best of both worlds</em>&#8221; scenario.</p>
<p>And server-side feature-detection is what is being done in my <a href="http://detector.dmolsen.com/demo/mustache/">RESS demo</a> and helping me classify browsers&#8230; well, sort of. The demo was created to help put my browser- and feature-detection library, <a href="http://detector.dmolsen.com/">Detector</a>, through its paces. One of its core features is offering <a href="https://github.com/dmolsen/Detector/wiki/Detector-Family-Tutorial">browser families</a> based on definitions that combine information from traditional user agent parsing (<em>via <a href="https://github.com/dmolsen/ua-parser-php">ua-parser-php</a></em>) and information from <a href="http://modernizr.com">Modernizr</a>-based tests (<em><a href="http://detector.dmolsen.com/demo/modernizr-listing/">full list</a></em>). The families in the demo are not based purely on browser features as determined feature-detection but that&#8217;s not to say that Detector couldn&#8217;t (<em>and it probably should</em>) be expanded to include more information on, say, browser-window width (<em>which is currently one of the few things it doesn&#8217;t capture</em>) and could then rely almost exclusively on feature tests. But there&#8217;s actually one area where these cached feature tests would offer a lot of help&#8230;</p>
<h2>It&#8217;s Not Just About Mobile Versus Desktop</h2>
<p>RESS, server-side feature-detection, and Detector are <em>not</em> mobile solutions. Yes, they come from people focused on mobile-related issues but any of these options can be used in helping deliver optimized experiences to <em>any</em> browser. In the same way that Modernizr helps polyfill for older browsers, server-side feature-detection and RESS can and do offer similar capabilities. I&#8217;d hate to see them get pigeonholed as solutions that are only implemented by mobile developers. I believe that the combination of these techniques can offer a very robust platform for building <a href="http://futurefriend.ly">future friendly</a> websites and apps. That said, there is still work to do to make these solutions as robust as possible.</p>
<h2>RESS Doesn&#8217;t Solve the Dumb Content Problem&#8230; Yet</h2>
<p>In <em><a href="http://mpulp.mobi/2011/05/next-steps-of-responsive-web-design/">Next Steps of Responsive Web Design</a></em> Jon Arnes Sæterås (<a href="http://twitter.com/jonarnes">@jonarnes</a>) writes, &#8220;<em>It is not only the <strong>design</strong> of the web site and the <strong>layout</strong> of content that needs to be adapted of enhanced; the idea of being responsive, adaptive and enhancing, must be implemented in the whole value chain.</em>&#8221; His value chain contains four parts:</p>
<ul>
<li>Stupid Editor</li>
<li>Stupid CMS</li>
<li>Stupid Web Server</li>
<li>Device (<em>I&#8217;d suggest browser</em>) assumed to be intelligent</li>
</ul>
<p>RESS and storing feature-detection results on the server  can go a long way in making the web server smarter and giving us a better idea of just how intelligent that browser is. But even addressing those two things only means that the <em>output</em> is smarter. Neither solutions address how content enters the system (<em>e.g. the editor</em>) and how it&#8217;s stored (<em>e.g. the CMS</em>). For example, in the <a href="http://detector.dmolsen.com/demo/mustache/?pid=e1bd58cc186d3a2156b6ebddb558fd41">mobile-advanced layout of the demo</a> on whom or what does it fall to properly crop &amp; size the images?</p>
<p>In the same way that responsive web design made designers and front-end developers think more about how to be both mobile and <a href="http://futurefriend.ly/">future friendly</a> I&#8217;m hopeful that RESS and server-side feature-detection can start a conversation amongst those of us focused on the server end of things (<em>especially content management systems!</em>) about how we can better deliver content to make those responsive web designs that much better. Can we help responsive web design evolve that much more?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=HiqOjiRhWCk:7Cjpt45R87A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=HiqOjiRhWCk:7Cjpt45R87A:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=HiqOjiRhWCk:7Cjpt45R87A:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=HiqOjiRhWCk:7Cjpt45R87A:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/HiqOjiRhWCk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/ress-and-the-evolution-of-responsive-web-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/ress-and-the-evolution-of-responsive-web-design/</feedburner:origLink></item>
		<item>
		<title>Detector v0.5 Released: ua-parser-php Integration, Browser Families, Expanded Feature Tests, &amp; New Wiki</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/029b_-Ep-hs/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/detector-v0-5-released-ua-parser-php-integration-browser-families-expanded-feature-tests-new-wiki/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:00:18 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[ua-parser]]></category>
		<category><![CDATA[ua-parser-php]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=332</guid>
		<description><![CDATA[Detector v0.5 has been posted to GitHub. The Detector demo site has also been updated to reflect the new version. About Detector Detector is a simple, PHP- and JavaScript-based browser- and feature-detection library that can adapt to new devices &#38; browsers on its own without the need to pull from a central database of browser information. Detector dynamically creates profiles [...]]]></description>
			<content:encoded><![CDATA[<p>Detector v0.5 has been <a href="http://github.com/dmolsen/Detector/">posted to GitHub</a>. The <a href="http://detector.dmolsen.com/">Detector demo site</a> has also been updated to reflect the new version.</p>
<h2>About Detector</h2>
<p><a href="https://github.com/dmolsen/Detector">Detector</a> is a simple, PHP- and JavaScript-based browser- and feature-detection library that can adapt to new devices &amp; browsers on its own without the need to pull from a central database of browser information. Detector dynamically creates profiles using a browser&#8217;s <em>(mainly)</em> unique user-agent string as a key. Using <a href="http://modernizr.com/">Modernizr</a> it records the HTML5 &amp; CSS3 features a requesting browser may or may not support. <a href="https://github.com/dmolsen/ua-parser-php">ua-parser-php</a> is used to collect and record any useful information <em>(like OS or device name)</em> the user-agent string may contain.</p>
<p>With Detector a developer can serve the appropriate markup, stylesheets, and JavaScript to a requesting browser without being completely dependent on a front-end-only resource loader nor a browser-detection library being up-to-date. Detector can be used with a solution like <a href="http://mustache.github.com/">Mustache</a> to <a href="https://github.com/dmolsen/Detector/wiki/Templating-with-Detector-&amp;-Mustache-Tutorial">provide robust templating support</a>.</p>
<p>The following are the major changes in this release:</p>
<h2>ua-parser-php Integration</h2>
<p>I was unhappy with the original browser detection library in Detector so I created a PHP-based pseudo-fork of the <a href="http://code.google.com/p/ua-parser/">ua-parser project</a> called <a href="https://github.com/dmolsen/ua-parser-php">ua-parser-php</a>. It is included as a submodule of Detector and provides a much more robust classification system for browsers and mobile devices. Because of the <a href="https://github.com/dmolsen/ua-parser-php">number of attributes</a> it parses out of a user-agent string it should give developers more flexibility when developing solutions.</p>
<h2>Browser Families</h2>
<p>With the new <a href="https://github.com/dmolsen/Detector/wiki/Detector-Family-Tutorial">families feature</a> in Detector developers can organize browsers that share certain traits into groupings. With families a developer can test for a browser&#8217;s grouping rather than each individual feature that browser may support when displaying content. This might be especially useful for templating solutions.</p>
<h2>Expanded Feature Tests</h2>
<p><a href="http://modernizr.com">Modernizr 2.5.2</a> has been included with this release as well as an expanded set of features including tests for cssremunit, deviceorientation, devicemotion, and lowbandwidth support. See the <a href="http://detector.dmolsen.com/demo/modernizr-listing/">full list of Detector&#8217;s core tests</a>.</p>
<h2>Detector Wiki Added</h2>
<p>I&#8217;ve attempted to grow the <a href="https://github.com/dmolsen/Detector/wiki">documentation for Detector</a> beyond the original, limited README by using the wiki that comes with a GitHub repository. Content includes:</p>
<ul>
<li><a href="https://github.com/dmolsen/Detector/wiki/How-Detector-Works">How Detector Works</a></li>
<li><a href="https://github.com/dmolsen/Detector/wiki/Adding-&amp;-Using-Detector-With-Your-Application">Adding &amp; Using Detector With Your Application</a></li>
<li><a href="https://github.com/dmolsen/Detector/wiki/Detector-Test-Tutorial">Detector Test Tutorial</a></li>
<li><a href="https://github.com/dmolsen/Detector/wiki/Detector-Family-Tutorial">Detector Family Tutorial</a></li>
<li><a href="https://github.com/dmolsen/Detector/wiki/Templating-with-Detector-&amp;-Mustache-Tutorial">Templating with Detector &amp; Mustache Tutorial</a></li>
</ul>
<h2>Other Changes</h2>
<p>Those are the big changes but their are a few other, minor changes:</p>
<ul>
<li>a configuration file for setting debug mode as well of locations of files &amp; directories is now included</li>
<li>both core and extended profiles can now be versioned</li>
<li>the original layout of the files has been cleaned up some</li>
<li>two simple demos, one for <a href="http://detector.dmolsen.com/demo/ytembed/">including a YouTube video</a> and the <a href="http://detector.dmolsen.com/demo/mustache/">other for templating</a>, are now included</li>
<li>while not a change in Detector per se, the <a href="http://detector.dmolsen.com/archive.php">archive of user agents</a> now contains <strong>170+ user agents</strong> and their associated feature tests</li>
</ul>
<p>If you have any questions about the project please feel free to drop a line in the comments.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=029b_-Ep-hs:mowDlqYXJ6c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=029b_-Ep-hs:mowDlqYXJ6c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=029b_-Ep-hs:mowDlqYXJ6c:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=029b_-Ep-hs:mowDlqYXJ6c:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/029b_-Ep-hs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/detector-v0-5-released-ua-parser-php-integration-browser-families-expanded-feature-tests-new-wiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/detector-v0-5-released-ua-parser-php-integration-browser-families-expanded-feature-tests-new-wiki/</feedburner:origLink></item>
		<item>
		<title>Book Review: “Head First Mobile Web”</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/IOXV6nmUb-o/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/02/book-review-head-first-mobile-web/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:00:28 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[grigs]]></category>
		<category><![CDATA[head first mobile web]]></category>
		<category><![CDATA[lyzadanger]]></category>
		<category><![CDATA[mobile web]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=331</guid>
		<description><![CDATA[I recently purchased the book Head First Mobile Web by Jason Grigsby (@grigs) and Lyza Danger Gardner (@lyzadanger). I follow Jason and Lyza on Twitter as well as read their blog posts on Cloud Four so I figured it&#8217;d be a good read. It was really useful and I learned quite a bit from it. [...]]]></description>
			<content:encoded><![CDATA[<p><em>I recently purchased the book <a href="http://www.amazon.com/gp/product/1449302661/ref=cm_cr_rev_prod_title">Head First Mobile Web</a> by Jason Grigsby (<a href="http://twitter.com/grigs">@grigs</a>) and Lyza Danger Gardner (<a href="http://twitter.com/lyzadanger">@lyzadanger</a>). I follow Jason and Lyza on Twitter as well as read their blog posts on <a href="http://www.cloudfour.com/blog/">Cloud Four</a> so I figured it&#8217;d be a good read. It was really useful and I learned quite a bit from it. Read on for my Amazon.com review. And if it comes off really gushy it&#8217;s because I really liked the book.</em></p>
<p>When talking &#8220;mobile&#8221; apps seem to get all of the attention but a mobile-optimized website is a necessity for many businesses. Any company that relies on email or social media to help spread the word about their offerings (<em>think &#8220;web links&#8221;</em>) really should make sure their website is easily viewable on a phone. Jason and Lyza do a fantastic job of taking a &#8220;new to mobile&#8221; developer through the various options that are available for making a website mobile-optimized (<em>their are many!</em>).</p>
<p>The book includes hands-on lessons with each chapter (including <a href="http://hf-mw.com/">code you can download</a>) and useful &#8220;case studies&#8221; to make it clear how each technique should be used. By covering the latest trends like Responsive Web Design and HTML5 APIs and some old school techniques like device detection and CSS-MP &#8220;Head First Mobile Web&#8221; makes a great resource for anyone looking to get into mobile web development or, like myself, looking to brush up on their skills.</p>
<p>What I think I appreciate most about the book, beyond the depth &amp; practicality of the information, is Jason&#8217;s and Lyza&#8217;s frankness in the pros and cons of each solution and being clear how each can be useful. I was most struck by this in the WURFL section. A lot of time is spent talking device detection (<em>one of my favorite mobile techniques</em>) but they&#8217;re very clear about some of the licensing downsides to the product. They don&#8217;t just gloss over that very important issue.</p>
<p>It&#8217;s a surprisingly quick read considering the thickness of the book. That&#8217;s probably because, rather than being big blocks of text talking theory, it has a lot of practical examples, tips &amp; tricks and uses a great conversational tone. This book really is designed to be, above all, practical and easy to learn from. If you&#8217;re at the start of a project and want to know what is available to you with mobile web or using web technologies (<em>they also cover PhoneGap for making HTML-based apps</em>) you should really <a href="http://www.amazon.com/gp/product/1449302661/ref=cm_cr_rev_prod_title">pick this one up</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=IOXV6nmUb-o:gmcsoafDDpU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=IOXV6nmUb-o:gmcsoafDDpU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=IOXV6nmUb-o:gmcsoafDDpU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=IOXV6nmUb-o:gmcsoafDDpU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/IOXV6nmUb-o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/02/book-review-head-first-mobile-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/02/02/book-review-head-first-mobile-web/</feedburner:origLink></item>
		<item>
		<title>Introducing ua-parser-php: Slicing &amp; Dicing User Agent Strings</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/bGFSQKqER1w/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/30/introducing-ua-parser-php-slicing-dicing-user-agent-strings/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 14:30:57 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ua-parser]]></category>
		<category><![CDATA[ua-parser-php]]></category>
		<category><![CDATA[user agent]]></category>
		<category><![CDATA[user agent parsing]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=327</guid>
		<description><![CDATA[Update on February 11, 2012: ua-parser-php was updated to v1.0.0. The list of supported browsers and devices was greatly expanded. A number of bug fixes were also added by Bryan Shelton. ua-parser-php is a PHP-based pseudo-port of the ua-parser project. ua-parser-php is designed to parse a user agent string and return certain properties like browser name, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update on February 11, 2012:</strong> <code><a href="https://github.com/dmolsen/ua-parser-php">ua-parser-php</a></code> was updated to v1.0.0. The list of supported browsers and devices was greatly expanded. A number of bug fixes were also added by Bryan Shelton.</p>
<p><code><a href="https://github.com/dmolsen/ua-parser-php">ua-parser-php</a></code> is a PHP-based pseudo-port of the <code><a href="http://code.google.com/p/ua-parser/">ua-parser</a></code> project. <code>ua-parser-php</code> is designed to parse a user agent string and return certain properties like browser name, OS version, and, in some cases, device name. <code>ua-parser-php</code> utilizes the user agents regex YAML file from <code>ua-parser</code> but otherwise uses its own set of properties to describe a browser, OS, and device. <code>ua-parser-php</code> was created as a new browser-detection library for the browser- and feature-detection library <a href="https://github.com/dmolsen/Detector">Detector</a>.</p>
<p>If you want, you can <a href="http://uaparser.dmolsen.com/">test your browser against ua-parser-php</a>. As usual, <a href="https://github.com/dmolsen/ua-parser-php">the code is available on GitHub</a>.</p>
<h2>Usage</h2>
<p>Using ua-parser-php is straightforward. Simply include it in your project, make the call to parse the user agent and you&#8217;ll be returned an object with various properties of the user agent. Examples follow:</p>
<div id="gist-1706269" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">require</span><span class="p">(</span><span class="s2">&quot;UAParser.php&quot;</span><span class="p">);</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$result</span> <span class="o">=</span> <span class="nx">UA</span><span class="o">::</span><span class="na">parse</span><span class="p">();</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">full</span><span class="p">;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; Chrome 16.0.912/Mac OS X 10.6.8</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">browserFull</span><span class="p">;</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Chrome 16.0.912&quot;</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">browser</span><span class="p">;</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Chrome&quot;</span></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">version</span><span class="p">;</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;16.0.912&quot;</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">major</span><span class="p">;</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; 16 (minor, build, &amp; revision also available)</span></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">osFull</span><span class="p">;</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Mac OS X 10.6.8&quot;</span></div><div class='line' id='LC23'><br/></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">os</span><span class="p">;</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Mac OS X&quot;</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">osVersion</span><span class="p">;</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;10.6.8&quot;</span></div><div class='line' id='LC29'><br/></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">osMajor</span><span class="p">;</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; 10 (osMinor, osBuild, &amp; osRevision also available)</span></div><div class='line' id='LC32'><br/></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">/* </span></div><div class='line' id='LC34'><span class="cm">     * in select cases the device information will also be captured</span></div><div class='line' id='LC35'><span class="cm">     */</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">deviceFull</span><span class="p">;</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Palm Pixi 1.0&quot;</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">device</span><span class="p">;</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;Palm Pixi&quot;</span></div><div class='line' id='LC42'><br/></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">deviceVersion</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; &quot;1.0&quot;</span></div><div class='line' id='LC45'><br/></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">deviceMajor</span><span class="p">;</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; 1 (deviceMinor also available)</span></div><div class='line' id='LC48'><br/></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="cm">/*</span></div><div class='line' id='LC50'><span class="cm">     * Some other generic boolean options</span></div><div class='line' id='LC51'><span class="cm">     */</span></div><div class='line' id='LC52'><br/></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isMobile</span><span class="p">;</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the browser met the criteria of a mobile browser based on the user agent information)</span></div><div class='line' id='LC55'><br/></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isMobileDevice</span><span class="p">;</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the device met the criteria of a mobile device based on the user agent information)</span></div><div class='line' id='LC58'><br/></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isTablet</span><span class="p">;</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the device was a tablet according to the user agent information)</span></div><div class='line' id='LC61'><br/></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isSpider</span><span class="p">;</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the device was a spider according to the user agent information)</span></div><div class='line' id='LC64'><br/></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isComputer</span><span class="p">;</span></div><div class='line' id='LC66'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the device was a computer according to the user agent information)</span></div><div class='line' id='LC67'><br/></div><div class='line' id='LC68'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="nv">$result</span><span class="o">-&gt;</span><span class="na">isUIWebview</span><span class="p">;</span></div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">// -&gt; (would return true if the user agent was from a uiwebview in ios)</span></div><div class='line' id='LC70'><span class="cp">?&gt;</span><span class="x"></span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1706269/31bb071088f0996e580b2809f66b7a2d3339d929/gistfile1.aw" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1706269#file_gistfile1.aw" style="float:right;margin-right:10px;color:#666">gistfile1.aw</a>
            <a href="https://gist.github.com/1706269">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>If you want to grab a copy of the YAML data from <code>ua-parser</code> each night you can use a cron job and point it at the following bit of code:</p>
<div id="gist-1696796" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;<span class="k">require</span><span class="p">(</span><span class="s2">&quot;UAParser.php&quot;</span><span class="p">);</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;<span class="nv">$result</span> <span class="o">=</span> <span class="nx">UA</span><span class="o">::</span><span class="na">get</span><span class="p">();</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="cp">?&gt;</span><span class="x"></span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1696796/c596f719bf03c2ad9d49e8fac26ad42af348ce11/gistfile1.aw" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1696796#file_gistfile1.aw" style="float:right;margin-right:10px;color:#666">gistfile1.aw</a>
            <a href="https://gist.github.com/1696796">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p><strong>NOTE:</strong> Using this feature will overwrite a number of changes I&#8217;ve made to the <code>user_agents_regex.yaml</code> file included with the <code>ua-parser-php</code> distribution.</p>
<h2>Credits</h2>
<p>Thanks to the <a href="http://code.google.com/p/ua-parser/people/list"><code>ua-parser</code> team</a> for making the core data available to others so we can build our own solutions.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=bGFSQKqER1w:mq1St0aRrOs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=bGFSQKqER1w:mq1St0aRrOs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=bGFSQKqER1w:mq1St0aRrOs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=bGFSQKqER1w:mq1St0aRrOs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/bGFSQKqER1w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/30/introducing-ua-parser-php-slicing-dicing-user-agent-strings/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/30/introducing-ua-parser-php-slicing-dicing-user-agent-strings/</feedburner:origLink></item>
		<item>
		<title>The 2012 State of the Mobile Web in Higher Ed – Take the survey, get the results</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/sgSPfWGw6DY/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/the-2012-state-of-the-mobile-web-in-higher-ed-take-the-survey-get-the-results/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 19:00:03 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[higher ed mobile summit]]></category>
		<category><![CDATA[higheredexperts]]></category>
		<category><![CDATA[karinejoly]]></category>
		<category><![CDATA[nickdenardis]]></category>
		<category><![CDATA[stewartfoss]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=322</guid>
		<description><![CDATA[Karine Joly (@karinejoly) of Higher Ed Experts is currently running a survey regarding the state of mobile web at higher education institutions. Please, take a moment and fill it out. In the interest of full disclosure, I will be presenting on mobile strategy for Karine and Higher Ed Experts on March 13, 2012 as a [...]]]></description>
			<content:encoded><![CDATA[<p>Karine Joly (<a href="http://twitter.com/karinejoly">@karinejoly</a>) of <a href="http://higheredexperts.com">Higher Ed Experts</a> is currently running a survey regarding the state of mobile web at higher education institutions. Please, take a moment and <a href="http://higheredanalytics.com/mobile" target="_blank">fill it out</a>. In the interest of full disclosure, I will be presenting on mobile strategy for Karine and Higher Ed Experts on March 13, 2012 as a part of the <a href="http://higheredexperts.com/edu/webinar/going-mobile/" target="_blank">Higher Ed Mobile Summit</a>. I will be joined by Stewart Foss (<a href="http://twitter.com/stewartfoss/" target="_blank">@stewartfoss</a>) and Nick DeNardis (<a href="http://twitter.com/nickdenardis" target="_blank">@nickdenardis</a>). It promises to be a good overview of what mobile means to higher education as well as useful tips on how to get started.</p>
<p>The full note from Karine regarding <a href="http://higheredanalytics.com/mobile" target="_blank">her survey</a> is below:</p>
<blockquote><p>Hello,</p>
<p><strong>I&#8217;d like to invite you to complete this short survey about the state of the mobile web (mobile websites, apps, etc.) at your institution:</strong><br />
<strong><a href="http://higheredanalytics.com/mobile" rel="nofollow" target="_blank">higheredanalytics.com/mobile</a></strong></p>
<p>This is the second edition of this survey and 105 of your colleagues already completed it but we need more. Its goal is to assess how colleges and universities respond to the needs of the increasing population of mobile device owners.</p>
<p><strong>Please take the survey whether or not your institution has a mobile solution</strong> - as I&#8217;m trying to evaluate the current state for higher education as a whole &#8211; and not just for early adopters.</p>
<p>The results of this survey will be used for presentations and articles. Anybody who completes the survey will receive a copy of the executive summary of the survey report as well.</p>
<p>If you have any questions, please let me know. Thanks for your time and your help.</p>
<p>Karine</p>
<p>Higher Ed Mobile Web Summit<br />
<a href="http://higheredexperts.com/mobile" rel="nofollow" target="_blank">http://higheredexperts.com/mobile</a></p></blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=sgSPfWGw6DY:SljTa1thU_c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=sgSPfWGw6DY:SljTa1thU_c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=sgSPfWGw6DY:SljTa1thU_c:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=sgSPfWGw6DY:SljTa1thU_c:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/sgSPfWGw6DY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/the-2012-state-of-the-mobile-web-in-higher-ed-take-the-survey-get-the-results/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/the-2012-state-of-the-mobile-web-in-higher-ed-take-the-survey-get-the-results/</feedburner:origLink></item>
		<item>
		<title>Introducing Detector: Combining Browser- &amp; Feature-Detection for Your Web App</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/VurZhEqS9Do/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/introducing-detector-combining-browser-feature-detection-for-your-web-app/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 14:00:38 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[browser detection]]></category>
		<category><![CDATA[bryanrieger]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[device detection]]></category>
		<category><![CDATA[feature detection]]></category>
		<category><![CDATA[ffly]]></category>
		<category><![CDATA[future friendly]]></category>
		<category><![CDATA[jamesgpearce]]></category>
		<category><![CDATA[lukew]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[modernizr-server]]></category>
		<category><![CDATA[open device knowledge]]></category>
		<category><![CDATA[responsive web design]]></category>
		<category><![CDATA[ress]]></category>
		<category><![CDATA[stephanierieger]]></category>
		<category><![CDATA[yabfdl]]></category>
		<category><![CDATA[yiibu]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=318</guid>
		<description><![CDATA[Feb. 21, 2012: v0.5 of Detector was pushed out. Read about the new features. With the initial release of Yiibu&#8217;s Profile, Detector is already YABFDL (Yet Another Browser- and Feature-Detection Library). The main question behind Detector, &#8220;How does one go about intelligently combining browser- and feature-detection into one package?,&#8221; has been floating around in my head ever since I heard Yiibu&#8217;s talk, Adaptation. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Feb. 21, 2012</strong>: v0.5 of Detector was pushed out. <a href="http://www.dmolsen.com/mobile-in-higher-ed/2012/02/21/detector-v0-5-released-ua-parser-php-integration-browser-families-expanded-feature-tests-new-wiki/">Read about the new features</a>.</p>
<p>With the initial release of <a href="http://yiibu.com/">Yiibu&#8217;s</a> <a href="https://github.com/yiibu/profile">Profile</a>, <a href="http://detector.dmolsen.com/">Detector</a> is already <abbr title="Yet Another Browser- and Feature-Detection Library">YABFDL</abbr> <em>(Yet Another Browser- and Feature-Detection Library)</em>. The main question behind Detector, &#8220;<em>How does one go about <em>intelligently </em>combining browser- and feature-detection into one package?</em>,&#8221; has been floating around in my head ever since I heard Yiibu&#8217;s talk, <a href="http://www.slideshare.net/yiibu/adaptation-why-responsive-design-actually-begins-on-the-server">Adaptation</a>. Because of two recent events, our <a href="http://happyholidays.wvu.edu/">holiday card project</a> and the <a href="http://openddr.org/takedown.html">OpenDDR/WURFL/ScientiaMobile kerfuffle</a>, I decided to finally tackle that question and see what I could come up with to answer it.</p>
<h2>Introducing Detector</h2>
<p><a href="http://detector.dmolsen.com">Detector</a> (<em><a href="http://detector.dmolsen.com/">demo</a> &amp; <a href="https://github.com/dmolsen/Detector">code</a></em>)  is a simple, PHP- and JavaScript-based browser- and feature-detection library that is still in its infancy. Detector gives server-side developers information about what types of devices may be requesting their content as well as the HTML5 &amp; CSS3 features a requesting browser on that device may or may not support. With Detector a developer can serve the appropriate markup, stylesheets, and JavaScript to a requesting browser without being completely dependent on a browser-detection library being up-to-date nor completely dependent on a front-end-only script loader. <a href="http://detector.dmolsen.com/">Detector</a> is based on <a href="http://www.modernizr.com/">Modernizr</a>, <a href="https://github.com/jamesgpearce/modernizr-server">modernizr-server</a>, and the browser-detection library from <a href="https://github.com/dmolsen/MIT-Mobile-Web">Mobile Web OSP</a>. It also benefits from a healthy dose of inspiration from <a href="http://yiibu.com/">Yiibu&#8217;s</a> <a href="https://github.com/yiibu/profile">Profile</a>. Want more of the gory, technical details? <a href="https://github.com/dmolsen/Detector">Check out the README</a> for more information.</p>
<h2>Why Create Detector?</h2>
<p>With <a href="http://yiibu.com/">Yiibu&#8217;s</a> <a href="https://github.com/yiibu/profile">Profile</a>, Luke Wroblewski&#8217;s (<a href="http://twitter.com/lukew/">@lukew</a>) article, &#8220;<em><a href="http://www.lukew.com/ff/entry.asp?1392">RESS: Responsive Design + Server Side Components</a>,</em>&#8221; and the <a href="http://futurefriend.ly/">Future Friendly</a> movement I think that more and more folks are accepting that server-side technologies still have a large part to play in delivering mobile-optimized solutions. That being said, browser-detection cheerleaders like myself can learn a thing or two from the responsive design/feature-detection folks. Detector was created as a way of, hopefully, combining the best of both browser- and feature-detection and giving server-side developers a lot of power and flexibility in developing cross-browser, as well as mobile, solutions.</p>
<h3>Flexible &amp; Future Friendly</h3>
<p>I wanted to address two primary goals when developing Detector. The first goal was to create a solution that was forward looking and could adapt to new devices and browsers on its own. I didn&#8217;t want a developer to have to worry that their website might break if a new a browser came out with a different user-agent than those already being tracked. This is one of the real strengths of using feature-detection as a solution. A feature is either available or it isn&#8217;t. The first time Detector gets a visit from a new user-agent string it tests that browser for all of its available features and saves that profile to disk for future use with other browsers with that same user-agent. In this way Detector can grow and adapt to changes in the browser &amp; mobile landscape. Also, because Modernizr (<em>and it&#8217;s long list of <a href="http://www.modernizr.com/docs/#s2">pre-built tests</a></em>) serves as the core feature-detection library of Detector a developer can add and track their own tests just by using the <a href="http://www.modernizr.com/docs/#addtest">Modernizer.addTest() plug-in API</a>.</p>
<h3>Open Browser &amp; Device Knowledge</h3>
<p>My second goal was to see if I could find a way to capture and share device knowledge. While Detector is focused on <em>browser</em> knowledge as opposed to <em>device</em> knowledge I think the information is still useful overall. Especially to web developers who are, for the most part, only ever going to interact with the browser anyway. I feel very strongly that their should be a central, <strong>open</strong> resource for developers to rely upon to not only learn what browsers support what features but a way to use that data within their applications. Because of that I have signed onto the <a href="http://www.opendeviceknowledge.com/vision">Open Device Knowledge Collaborative</a>. Detector is not nearly stable enough to help create that resource now but I do hope that it can in the future. At some point I will create a central repository of browser profiles that anyone can use in their applications (<em>with or without Detector!</em>) and, via Git, developers will be able to submit their own profiles back to the central repository for others to use. It&#8217;s an ambitious idea and their are a lot of hurdles yet to overcome but I do think it&#8217;s an important goal for Detector and the community at large.</p>
<h2>Where Detector is Going</h2>
<p>Detector is far from perfect as a solution. As I said, it&#8217;s in its infancy. I&#8217;d love to see the following get addressed:</p>
<ul>
<li>New profiles could contain bad data that, in its current incarnation, wouldn&#8217;t get updated by more &#8220;reliable&#8221; browser visits in the future. Basically, is there a sampling and/or confidence metrics that could be used to re-test browsers?</li>
<li>Modernizr-based media query tests seem to be really flaky and it&#8217;s obviously a problem with Detector itself. When I use the media queries outside of Detector they work as expected.</li>
<li>Versioning of profiles as well as creating that central repository so profiles can be used by anyone.</li>
<li>Most importantly, <strong>Detector needs more browsers to use it to really test its capabilities and accuracy</strong>.</li>
</ul>
<p>While it is still early days for Detector hopefully lessons can be learned from its implementation for others developing similar solutions.</p>
<h2>Helping Me Test Detector</h2>
<p>If you can, please hit the <a href="http://detector.dmolsen.com/">Detector demo </a>(<em><a href="http://detector.dmolsen.com/">http://detector.dmolsen.com/</a></em>) on, preferably, your mobile device of choice and see if Detector works as expected. If it doesn&#8217;t please shoot me a note from the contact link under the Browser Profile information.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=VurZhEqS9Do:V2Ban-dsL2o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=VurZhEqS9Do:V2Ban-dsL2o:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=VurZhEqS9Do:V2Ban-dsL2o:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=VurZhEqS9Do:V2Ban-dsL2o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/VurZhEqS9Do" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/introducing-detector-combining-browser-feature-detection-for-your-web-app/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2012/01/18/introducing-detector-combining-browser-feature-detection-for-your-web-app/</feedburner:origLink></item>
		<item>
		<title>How to Sync Web Page Events With Embedded YouTube Videos</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/Uy9o9Bprpvs/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/how-to-sync-web-page-events-with-embedded-youtube-videos/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 14:30:00 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[gists]]></category>
		<category><![CDATA[holidaycard]]></category>
		<category><![CDATA[holidaycard2011]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[youtube]]></category>
		<category><![CDATA[youtube javascript player api]]></category>
		<category><![CDATA[youtubeplayer]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=315</guid>
		<description><![CDATA[As noted in the Creating CSS3 Snowflakes article, for our recent holiday card project we wanted to create an experience with the website that was closely tied to our centerpiece video. One of the keys to this was making the experience seem as seamless as possible to allow the viewer to immerse themselves in the video. We [...]]]></description>
			<content:encoded><![CDATA[<p>As noted in the <a href="http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/creating-css3-snowflakes/">Creating CSS3 Snowflakes</a> article, for our recent <a href="http://happyholidays.wvu.edu/">holiday card project</a> we wanted to create an experience with the website that was closely tied to our centerpiece video. One of the keys to this was making the experience seem as seamless as possible to allow the viewer to immerse themselves in the video. We also wanted to see if we could connect events in the video to events on the web page to further enhance the experience.</p>
<h2>Examples of Syncing Events</h2>
<p>To get an idea of what I mean by &#8220;<em>syncing web page events with an embedded YouTube video</em>&#8221; it might be good to check out two examples. The <a href="http://dmolsen.com/youtube-player/">first example</a> is very simple and it&#8217;s the one I created as a proof of concept for our holiday card project. The <a href="http://dmolsen.com/youtube-player/">example page</a> explains what you should see. The <a href="http://happyholidays.wvu.edu/">second example</a> is the <a href="http://happyholidays.wvu.edu/">holiday card itself</a>. The holiday card example will only work on Safari, Chrome and Firefox because of the CSS3 animations we used.</p>
<p>The main thing we did with the <a href="http://happyholidays.wvu.edu/">holiday card</a> project to make the experience seem seamless was to hide the text and other traditional page &#8220;chrome&#8221; when the video started playing. We did this with a simple opacity transition and then moved those elements far off the screen. Once these elements are removed the viewer is left with the video playing and the background. The background, an overview of our campus, is not a static though. The main character in the holiday card video was a sprite visiting and bringing holiday magic to various locations around campus. As the sprite visits places like our freshman dorms or our football stadium the location of the sprite is highlighted on the page background with those same locations changing color. It&#8217;s a subtle effect because we didn&#8217;t want to distract too much from the video itself. My favorite part is the sprite rising into the air from downtown Morgantown (<em>only viewable in Safari &amp; Chrome because of a specific type of CSS3 animation</em>).</p>
<p>So how did we do it?</p>
<h2>YouTube&#8217;s JavaScript Player API</h2>
<p>I think many folks are familiar with the <a href="http://code.google.com/apis/youtube/player_parameters.html">various parameters</a> that one can set on an embedded YouTube video to control how it looks &amp; behaves (<em>e.g. turn off related links</em>). If you aren&#8217;t familiar with them go <a href="http://code.google.com/apis/youtube/player_parameters.html">check them out now</a>. They can give you a lot of control, especially from a branding perspective. One step beyond that though is the <a href="http://code.google.com/apis/youtube/js_api_reference.html">YouTube JavaScript Player API</a>. It allows developers to control the player itself. It&#8217;s important to note that the <a href="http://code.google.com/apis/youtube/js_api_reference.html">YouTube JavaScript Player API</a> only works with the older embed code. An API for the iFrame embed is <a href="http://code.google.com/apis/youtube/iframe_api_reference.html">currently experimental</a>.</p>
<p>The YouTube JavaScript Player API allows you to use, you guessed it, JavaScript, to control things like starting a video, stopping a video, changing what video is playing in the player, playback quality, and even the player volume. While those things are useful, the best feature of the YouTube JavaScript Player API, especially when looking at syncing actions between a web page and video, is the event <code>onStateChange</code>. It is fired every time the video is started, paused, buffered, or ended. Luckily, there&#8217;s a simple YouTube JavaScript Player API wrapper, <a href="https://github.com/dmolsen/YoutubePlayer">YouTubePlayer</a> (<em>originally created by Anurag Mishra</em>), that makes it easy to quickly embed a video (<em>via <a href="http://code.google.com/p/swfobject/">SWFObject</a></em>) and then listen for these <code>onStateChange</code> events.</p>
<h2>Using <code>onStateChange</code> &amp; YouTubePlayer</h2>
<p>Using <a href="https://github.com/dmolsen/YoutubePlayer">YouTubePlayer</a> to listen to these <code>onStateChange</code> events is actually quite straightforward. As with any video the first thing you&#8217;ll want to do is embed it. All you need to know is the ID of the &lt;div&gt; where your video will be embedded and the ID of the YouTube video.</p>
<div id="gist-1494961" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">var</span> <span class="nx">vidId</span> 	<span class="o">=</span> <span class="s1">&#39;videoEmbed&#39;</span><span class="p">;</span>	 <span class="c1">// the ID of the div holding the video</span></div><div class='line' id='LC2'><span class="kd">var</span> <span class="nx">vidYTId</span>	<span class="o">=</span> <span class="s1">&#39;XhLrlhFzAjA&#39;</span><span class="p">;</span> <span class="c1">// the ID of the video from YouTube</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="kd">var</span> <span class="nx">YTVideo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">YoutubePlayer</span><span class="p">(</span><span class="nx">vidId</span><span class="p">,</span> <span class="nx">vidYTId</span><span class="p">,{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">width</span><span class="o">:</span> <span class="mi">640</span><span class="p">,</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">height</span><span class="o">:</span> <span class="mi">360</span><span class="p">,</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">objparams</span><span class="o">:</span> <span class="p">{</span> <span class="nx">allowFullscreen</span><span class="o">:</span> <span class="s2">&quot;true&quot;</span> <span class="p">},</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">ytparams</span><span class="o">:</span> <span class="p">{</span> <span class="nx">rel</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">showsearch</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">showinfo</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">modestbranding</span><span class="o">:</span> <span class="mi">1</span>  <span class="p">}</span></div><div class='line' id='LC9'><span class="p">});</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'><span class="c1">// objparams are the parameters that might get included in the old embed code (e.g. fullscreen)</span></div><div class='line' id='LC12'><span class="c1">// ytparams are the youtube player parameters</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1494961/a29a2a95ddfeb5835c3f3ed70d7da8ea7671533d/gistfile1.js" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1494961#file_gistfile1.js" style="float:right;margin-right:10px;color:#666">gistfile1.js</a>
            <a href="https://gist.github.com/1494961">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Once that&#8217;s done you can set-up event listeners that do something when the event you want to track is fired. For example, let&#8217;s listen for when a viewer starts playing a video and then listen for when the video ends. It&#8217;s important to note that &#8216;<em>playing</em>&#8216; is fired after a user pauses and then restarts a video. There&#8217;s no differentiation between starting a video for the first time and after pausing the video.</p>
<div id="gist-1495027" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c1">// listen for when the viewer decides to start playing the video</span></div><div class='line' id='LC2'><span class="c1">// hide the intro &amp; outro text divs as well as &quot;lower the lights&quot;</span></div><div class='line' id='LC3'><span class="nx">YTVideo</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;playing&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC4'>	<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;intro&#39;</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;text hide&#39;</span><span class="p">);</span></div><div class='line' id='LC5'>	<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;outro&#39;</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;text hide&#39;</span><span class="p">);</span></div><div class='line' id='LC6'>	<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;lights&#39;</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;darken&#39;</span><span class="p">);</span></div><div class='line' id='LC7'><span class="p">});</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'><span class="c1">// listen for when the video ends</span></div><div class='line' id='LC10'><span class="c1">// show the outro text div as well as &quot;bring up the lights&quot;</span></div><div class='line' id='LC11'><span class="nx">YTVideo</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;ended&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC12'>	<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;outro&#39;</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;text show&#39;</span><span class="p">);</span></div><div class='line' id='LC13'>	<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;lights&#39;</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;lighten&#39;</span><span class="p">);</span></div><div class='line' id='LC14'><span class="p">});</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1495027/664fc52426dc0528f082f20a4efee9ff258fef63/gistfile1.js" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1495027#file_gistfile1.js" style="float:right;margin-right:10px;color:#666">gistfile1.js</a>
            <a href="https://gist.github.com/1495027">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p><a href="https://github.com/dmolsen/YoutubePlayer">YouTubePlayer</a> gives really easy access to these events via the <code>.on()</code> function. But what about timing events like the fireworks in the <a href="http://dmolsen.com/youtube-player/">original example</a>?</p>
<h2>Timed Events with YouTubePlayer</h2>
<p>I  added the <code>.at()</code> alias and expanded the <code>.on()</code> functionality for <a href="https://github.com/dmolsen/YoutubePlayer">YouTubePlayer</a> to make it really easy to add timed events. Using the fireworks as a quick example:</p>
<div id="gist-1495049" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c1">// between 13secs and 17secs shoot off a firework every half a second (500ms)</span></div><div class='line' id='LC2'><span class="nx">YTVideo</span><span class="p">.</span><span class="nx">at</span><span class="p">(</span><span class="s1">&#39;13000-16500&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC3'>	<span class="nx">createFirework</span><span class="p">(</span><span class="mi">14</span><span class="p">,</span><span class="mi">73</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="kc">null</span><span class="p">,</span><span class="kc">null</span><span class="p">,</span><span class="kc">null</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="kc">true</span><span class="p">,</span><span class="kc">true</span><span class="p">);</span></div><div class='line' id='LC4'><span class="p">},</span> <span class="mi">500</span><span class="p">);</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1495049/dcc0a70285f863e614378d33342b60720c3f797f/gistfile1.js" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1495049#file_gistfile1.js" style="float:right;margin-right:10px;color:#666">gistfile1.js</a>
            <a href="https://gist.github.com/1495049">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Essentially the <code>.at()</code> function registers events with the browser with a certain name based on the time the event should take place (<em>e.g. 1100</em>). These events are then fired by a <code>setInterval()</code> function that tracks time once the viewer starts watching the video. Every time the tracked time is incremented (<em>e.g. from 1000ms to 1100ms</em>) a corresponding event is fired (<em>e.g. 1100</em>). Thanks to <code>onStateChange</code>, if the video is paused or buffering the tracked time isn&#8217;t incremented and no event is fired. If a video is scrubbed the tracked time is updated appropriately and incremented again.</p>
<p>For the most part timed events can be fairly straightforward as shown in <a href="https://github.com/dmolsen/YoutubePlayer/blob/master/scripts/example.js">the source for the simple example</a>. It can also get a little complicated as seen in the <a href="https://gist.github.com/1495085">source for the holiday card timed events JavaScript</a>. With the latter I was trying to make sure, because buildings stay highlighted after their event is fired, that if a user scrubbed backwards in time that buildings would be hidden again if appropriate.</p>
<h2>A Warning About Timed Events</h2>
<p>There is one very important thing to keep in mind when working with timed events. Because the tracked video time is sort of faked by using the <code>setInterval()</code> function (<em>e.g. we&#8217;re not polling the video directly for the current time in the video. that&#8217;s just not a good idea nor accurate</em>) the tracked time can fall behind the real video time. The main culprit for this is heavy JavaScript that gets called by your timed events and then causes the execution of the <code>setInterval()</code> to be blocked until the heavy JavaScript finishes running. Keep whatever you launch via the timed events as light as possible. Simple manipulations of the DOM might be best. That way, if you have a longer video, the timed events will play when they&#8217;re supposed to.</p>
<h2>Conclusion</h2>
<p>I always find it difficult to explain something like this without saying &#8220;Just look at the code.&#8221; Hopefully you were able to get a reasonable idea of how easy it is to use timed events to sync web page content with your embedded YouTube videos. I think there are a lot of opportunities to create richer experiences for viewers with this technique.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=Uy9o9Bprpvs:VQsQhFQlFdI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=Uy9o9Bprpvs:VQsQhFQlFdI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=Uy9o9Bprpvs:VQsQhFQlFdI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=Uy9o9Bprpvs:VQsQhFQlFdI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/Uy9o9Bprpvs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/how-to-sync-web-page-events-with-embedded-youtube-videos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/how-to-sync-web-page-events-with-embedded-youtube-videos/</feedburner:origLink></item>
		<item>
		<title>Creating CSS3 Snowflakes</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/msS37zzAUV0/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/creating-css3-snowflakes/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 14:00:45 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[animations]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[estellevw]]></category>
		<category><![CDATA[holidaycard]]></category>
		<category><![CDATA[holidaycard2011]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[snow]]></category>
		<category><![CDATA[snowflakes]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=313</guid>
		<description><![CDATA[For our recent holiday card project we wanted to create an experience with the website that mimicked the video that was the centerpiece of the project. While it was straightforward enough to use the same graphic style as the video we also wanted to include some of the same atmospheric effects as well like twinkling stars, [...]]]></description>
			<content:encoded><![CDATA[<p>For our recent <a href="http://happyholidays.wvu.edu/">holiday card project</a> we wanted to create an experience with the website that mimicked the video that was the centerpiece of the project. While it was straightforward enough to use the same graphic style as the video we also wanted to include some of the same atmospheric effects as well like twinkling stars, moving fog, sparkles and, most importantly, snow. To create these we used CSS3 animations and transitions.</p>
<h2>Making it Snow</h2>
<p>In order to make it snow in our project I modified some CSS created by Estelle Weyl (<a href="http://twitter.com/estellevw/">@estellevw</a>) for <a href="http://www.standardista.com/sxsw/">a SXSW talk she gave</a>. <a href="http://www.standardista.com/sxsw/">The talk</a> does a great job explaining the ins-and-outs of the CSS that gets used (<em>e.g. animations, border-radius, timing</em>) so I won&#8217;t repeat that here. The main contribution I made, beyond tweaking the CSS some to have the snowflakes look the way I wanted, was to create an easy way with JavaScript to:</p>
<ul>
<li>randomly places N amount of snow across the web page</li>
<li>randomly assign classes to each snowflake to randomize their look (<em>e.g. size, speed, delay, opacity</em>)</li>
<li>properly detect the height of a web page when snowflakes are created and update the animation keyframe so they fall an appropriate distance instead of a &#8220;one size fits all&#8221;-style. Unfortunately, <code>window.onresize</code> is not accounted for.</li>
</ul>
<p>You can<a href="http://dmolsen.com/css3-snowflakes"> view a demo of the CSS3 snowflakes in action</a>. If you think it&#8217;s interesting you can <a href="https://github.com/dmolsen/CSS3-Snowflakes">grab the code (CSS &amp; JavaScript) on GitHub</a> to use on your own site. <a href="https://github.com/dmolsen/CSS3-Snowflakes">Directions</a> on how to get it snowing are in the <a href="https://github.com/dmolsen/CSS3-Snowflakes">README</a>.</p>
<h2>Dependencies &amp; Browser Support</h2>
<p>There aren&#8217;t any real dependencies for this project other than <a href="http://caniuse.com/#feat=css-animation">browsers that support animations</a>. This means this project can be used with Safari, Chrome, and FireFox. If the appropriate -ms- extensions were added it would probably work with Internet Explorer 10 as well. In the demo I use <a href="https://github.com/ded/domready">domReady</a> to include the JavaScript in the <code>&lt;head&gt;</code> but that&#8217;s not necessary if you instead put the code before the <code>&lt;/body&gt;</code> tag.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=msS37zzAUV0:dgfn4rhzZ9Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=msS37zzAUV0:dgfn4rhzZ9Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=msS37zzAUV0:dgfn4rhzZ9Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=msS37zzAUV0:dgfn4rhzZ9Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/msS37zzAUV0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/creating-css3-snowflakes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/19/creating-css3-snowflakes/</feedburner:origLink></item>
		<item>
		<title>Video of My “Developing a Progressive Mobile Strategy” Freshly Squeezed Mobile Talk Now Available</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/oBV-h8xnuOM/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/15/video-of-my-developing-a-progressive-mobile-strategy-freshly-squeezed-mobile-talk-now-available/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 08:00:05 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[bdconf]]></category>
		<category><![CDATA[content strategy]]></category>
		<category><![CDATA[mobile strategy]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=312</guid>
		<description><![CDATA[If you&#8217;re looking to fill 25 minutes during your day, you can now check out the video of my Freshly Squeezed Mobile talk, &#8220;Developing a Progressive Mobile Strategy,&#8221; that I gave at Breaking Development (@bdconf) in September. The slide deck from that talk is available on SlideShare. Dave Olsen &#8211; Developing a Progressive Mobile Strategy [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re looking to fill 25 minutes during your day, you can now <a href="http://vimeo.com/33675962">check out the video</a> of my Freshly Squeezed Mobile talk, &#8220;<a href="http://www.slideshare.net/dmolsenwvu/developing-a-progressive-mobile-strategy-bdconf-version">Developing a Progressive Mobile Strategy</a>,&#8221; that I gave at Breaking Development (<a href="http://twitter.com/bdconf">@bdconf</a>) in September. The <a href="http://www.slideshare.net/dmolsenwvu/developing-a-progressive-mobile-strategy-bdconf-version">slide deck</a> from that talk is available on SlideShare.</p>
<p><iframe src="http://player.vimeo.com/video/33675962?title=0&amp;byline=0&amp;portrait=0" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/33675962">Dave Olsen &#8211; Developing a Progressive Mobile Strategy &#8211; BD Conf, Sept 2011</a> from <a href="http://vimeo.com/bdconf">Breaking Development</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>The folks at Breaking Development are slowly <a href="http://2012.bdconf.com/pastevents">sharing the videos of the other talks</a> at the September event. I highly, highly encourage you to check them out. Many thanks to them for sharing mine and the others.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=oBV-h8xnuOM:Tfi06bfiBrA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=oBV-h8xnuOM:Tfi06bfiBrA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=oBV-h8xnuOM:Tfi06bfiBrA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=oBV-h8xnuOM:Tfi06bfiBrA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/oBV-h8xnuOM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/15/video-of-my-developing-a-progressive-mobile-strategy-freshly-squeezed-mobile-talk-now-available/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/15/video-of-my-developing-a-progressive-mobile-strategy-freshly-squeezed-mobile-talk-now-available/</feedburner:origLink></item>
		<item>
		<title>EDUCAUSE Mobile Webinar &amp; Report</title>
		<link>http://feedproxy.google.com/~r/MobileInHigherEd/~3/maI2ihYmhUk/</link>
		<comments>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/06/educause-mobile-webinar-report/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 14:00:46 +0000</pubDate>
		<dc:creator>Dave Olsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[educause]]></category>
		<category><![CDATA[infographic]]></category>
		<category><![CDATA[webinar]]></category>

		<guid isPermaLink="false">http://www.dmolsen.com/mobile-in-higher-ed/?p=309</guid>
		<description><![CDATA[This Wednesday, December 7 at 1pm ET EDUCAUSE Live! will be hosting a webinar with representatives from the University of Mississippi to talk about their mobile strategy. A summary of the webinar: Those who work in a university setting are aware of mobile devices and their potential for enhancing campus life. In response, vendors are offering [...]]]></description>
			<content:encoded><![CDATA[<p>This Wednesday, December 7 at 1pm ET <a href="http://net.educause.edu/content.asp?SECTION_ID=652">EDUCAUSE Live! will be hosting</a> a webinar with representatives from the University of Mississippi to talk about their mobile strategy. A summary of the webinar:</p>
<blockquote><p>Those who work in a university setting are aware of mobile devices and their potential for enhancing campus life. In response, vendors are offering mobility solutions that claim they can address the needs of a typical university. This sounds appealing, but in reality a solid mobility strategy will likely consist of a suite of tools, approaches, and partnerships. This webinar will identify some of the big questions surrounding mobility and describe the approach that the University of Mississippi is taking for each. Examples are selecting scenarios that are good candidates for mobility, targeting native programming efforts to get the biggest bang for the buck, determining when to outsource and when to &#8220;do it yourself,&#8221; and employing successful mobility strategies from other industries. Also included will be highlights from a recent mobility survey. For Ole Miss, a solid mobility strategy has evolved from focused study and struggle, yielding valuable insights for other institutions.</p></blockquote>
<p>To attend the event you&#8217;ll <a href="http://net.educause.edu/RegisterNow/1030441">need to register</a>.</p>
<p>Related to this webinar is the ECAR report, <a href="http://www.educause.edu/Resources/MobileITinHigherEducation2011R/238470">Mobile IT in Higher Education</a>. There&#8217;s an <a href="http://www.educause.edu/MobileITinHigherEducation">infographic</a> that sums up the report. It&#8217;s always good to get more insight into how mobile is being used in higher education.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=maI2ihYmhUk:c2yRNdehkzA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=maI2ihYmhUk:c2yRNdehkzA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?i=maI2ihYmhUk:c2yRNdehkzA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MobileInHigherEd?a=maI2ihYmhUk:c2yRNdehkzA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MobileInHigherEd?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MobileInHigherEd/~4/maI2ihYmhUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/06/educause-mobile-webinar-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dmolsen.com/mobile-in-higher-ed/2011/12/06/educause-mobile-webinar-report/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.014 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-21 09:46:45 --><!-- Compression = gzip -->

