<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Think Vitamin &#187; Mobile</title>
	<atom:link href="http://thinkvitamin.com/category/mobile/feed/" rel="self" type="application/rss+xml" />
	<link>http://thinkvitamin.com</link>
	<description>A blog about the web</description>
	<lastBuildDate>Thu, 09 Sep 2010 01:38:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>How to Wirelessly Sync Google Calendar to your iPhone</title>
		<link>http://thinkvitamin.com/mobile/iphone/how-to-wirelessly-sync-google-calendar-to-your-iphone/</link>
		<comments>http://thinkvitamin.com/mobile/iphone/how-to-wirelessly-sync-google-calendar-to-your-iphone/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 11:03:59 +0000</pubDate>
		<dc:creator>Keir Whitaker</dc:creator>
				<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://carsonified.com/?p=3197</guid>
		<description><![CDATA[By <strong>Keir Whitaker</strong><br />Recently I set out to find a more robust way of synchronizing my Google Calendars to my iPhone, thankfully I found one. To date I have been using the Google Calendar to iCal sync tool &#8220;Calaboration&#8220;. In terms of functionality it&#8217;s great. My Google Calendars sync seamlessly with my local iCal program and once I [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fiphone%2Fhow-to-wirelessly-sync-google-calendar-to-your-iphone%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fiphone%2Fhow-to-wirelessly-sync-google-calendar-to-your-iphone%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Recently I set out to find a more robust way of synchronizing my Google Calendars to my iPhone, thankfully I found one.</p>
<p>To date I have been using the Google Calendar to iCal sync tool &#8220;<a href="http://code.google.com/p/calaboration/">Calaboration</a>&#8220;. In terms of functionality it&#8217;s great. My Google Calendars sync seamlessly with my local iCal program and once I plug in my iPhone in the calendars update. Perfect &#8211; right?</p>
<p><em><strong>Notice:</strong> iPhone development will be one of the many topics covered at <a href="http://events.carsonified.com/fowa/2009/london?utm_source=TV&amp;utm_medium=Text+Link&amp;utm_campaign=NuevaSync">The Future of Web Apps London</a> 1-2 October 2009</em>.<br />
<span id="more-3197"></span></p>
<p>The main problem is that I rarely plug my phone in to my Mac Book and as a consequence have a very out of date iPhone calendar. I also use the iPhone to set reminders, without sync&#8217;ing these back to iCal they never make it back to Google Calendar &#8211; all in all an unsatisfactory solution.</p>
<h3>What&#8217;s the Ideal?</h3>
<p>In a perfect world I would be able to enter a new event on my iPhone and have it appear relatively instantly in Google Calendar (or vise versa), no plugging in and over the air.</p>
<h3>The Solution: NuevaSync</h3>
<p><a href="http://carsonified.com/wp-content/uploads/2009/08/nuevasync.png"><img style="border: 1px solid black;" title="nuevasync" src="http://carsonified.com/wp-content/uploads/2009/08/nuevasync.png" alt="nuevasync" width="470" /></a></p>
<p>After a quick search I came across <a href="https://www.nuevasync.com/">NeuvaSync</a>. It&#8217;s an online service which allows you to:</p>
<blockquote><p>Sync your calendar, contacts and e-mail over-the-air to your smart phone. NuevaSync works with Google Calendar, Contacts and GMail. Use the iPhone, Windows Mobile and other smart phones. It needs no app. Your phone&#8217;s built-in sync client and inbox is used. Just configure and sync. <cite><a href="https://www.nuevasync.com/">NuevaSync Web Site</a></cite></p></blockquote>
<h3>Simple Setup</h3>
<p>The basic service is free and setting up an account is straightforward. Once you have registered it allows you to login to Google and select the account(s) you would like to synchronize . Next the simple admin interface asks you to choose which services you would like to sync i.e. calendar, e-mail or contacts (or a combination of the three). Be careful here as on first use all data will be erased (more info on why that happens on the <a href="http://wiki.nuevasync.com/wiki/bin/view/Public/iPhoneiPodFaq">NeuvaSync Wiki</a>).</p>
<p>Next it&#8217;s just a case of setting up a new mail account on your iPhone. This is as simple as creating a new Exchnage account in your iPhone&#8217;s Mail settings. A detailed seven step graphical how to is available on the <a href="http://wiki.nuevasync.com/wiki/bin/view/Public/iPhoneConfiguration">wiki</a>.</p>
<h3>In Practice</h3>
<p>I have been using the service for a few days now and I am impressed. Adding and deleting events in either Google Calendar or on the iPhone are replicated quickly and it means that I no longer have to plug in my iPhone to keep up to date. NuevaSync also offer a premium service for $25 a year which includes &#8220;Push&#8221; e-mail.</p>
<p>There are other solutions out there, if you have experience of alternatives that have worked for you please put a link in the comments.</p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=3197&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/iphone/how-to-wirelessly-sync-google-calendar-to-your-iphone/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>How to build mobile widgets</title>
		<link>http://thinkvitamin.com/mobile/how-to-build-mobile-widgets/</link>
		<comments>http://thinkvitamin.com/mobile/how-to-build-mobile-widgets/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 21:46:21 +0000</pubDate>
		<dc:creator>Ryan Carson</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[mobile widgets]]></category>

		<guid isPermaLink="false">http://thinkvitamin.com/?p=1178</guid>
		<description><![CDATA[By <strong>Ryan Carson</strong><br />If you&#8217;re a web developer or designer, there&#8217;s a really exciting development happening right now called &#8216;mobile widgets&#8217;. Carsonified is working with Betavine to spread the word about mobile widgets, so we recently spent four days building one in order to see how hard or easy they are to build. The result was Twiggy, a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fhow-to-build-mobile-widgets%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fhow-to-build-mobile-widgets%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>If you&#8217;re a web developer or designer, there&#8217;s a really exciting development happening right now called &#8216;mobile widgets&#8217;. Carsonified is working with <a href="http://www.betavine.net/bvportal/web/guest/widgetzone">Betavine</a> to spread the word about mobile widgets, so we recently spent four days building one in order to see how hard or easy they are to build. The result was <a href="http://twiggy.carsonified.com">Twiggy</a>, a Twitter search widget, and today we&#8217;re going to talk about how we built it.</p>
<h3>So what is a mobile widget?</h3>
<p>A mobile widget is a simple web app that&#8217;s built with open web technology like HTML, CSS and JavaScript (we used <a href="http://jquery.com">jQuery</a>). You don&#8217;t have to write a line of Java or any proprietary code and you don&#8217;t have to understand anything about &#8216;mobile development&#8217;. The files are packaged up into a zip file and downloaded to the phone. The device installs the widget locally, and then it can talk to the web. Widgets can currently run on Nokia S60 phones (currently 1M+ and growing).</p>
<p>Widgets have access to a permanent storage facility for settings and downloaded data. This mechanism is similar to cookies, but the storage capacity is larger and does not automatically expire after a given time.</p>
<h3>Why are they a good idea?</h3>
<p>We think mobile widgets are a really good idea because they allow you to reach a huge non-iPhone audience. Don&#8217;t get me wrong, everyone at Carsonified has iPhones and we love The Steve, but we&#8217;re not &#8216;normal&#8217; and as web designers and developers, we have to consider there are a heck of a lot of people out there who would really benefit from useful widgets that ran on their phones. (They also run on Opera.)</p>
<p>Also, you can easily port mobile widgets to iPhone with a few simple tweaks. Here&#8217;s the version of <a href="http://elliottkember.com/twiggy">Twiggy that works on an iPhone</a>.</p>
<p>Here&#8217;s a quick video to show widgets in action, on a Nokia N96:</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3565995&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3565995&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>
<h3>Cold hard cash</h3>
<p>To encourage people to try building mobile widgets, Betavine are <a href="http://www.betavine.net/bvportal/competition/view.html?id=ff8080811f1f3dbb011f3721070438d1">running a competition with a prize of &pound;20,000</a>. There&#8217;s no obligation to Betavine, you keep the IP to the code and they promote the widget to Vodafone customers, so it&#8217;s a pretty nifty deal.</p>
<h3>What&#8217;s in a widget?</h3>
<p>As I mentioned above, a widget is built with HTML, CSS and JavaScript and packaged as a regular zip file, renamed to use the extension .wgt.</p>
<p>Here&#8217;s what&#8217;s in the zip:</p>
<ol>
<li>A widget configuration file. This is an XML file in the root of the widget structure that holds information about your widget including its size, name, author, and security information.</li>
<li>An index document. Like on a web page, this document contains the basic skeleton/content of the widget. Widgets content can be created using any markup that browsers handle natively, for example HTML, SVG, or XML files. This file also lives in the root of the widget structure.</li>
<li>Images. These are contained in a single images folder.</li>
<li>JavaScript files. These are contained in a single script folder.</li>
<li>Stylesheets. These are contained in a single style folder.</li>
</ol>
<p>I&#8217;m going to hand it over to <a href="http://twitter.com/elliottkember">Elliott Kember</a>, who built Twiggy, to go into detail about how Twiggy was built, and what hurdles we had to overcome. Over to you bud &#8230;</p>
<h3>Mobile widget tutorial</h3>
<p>Thanks, Ryan!</p>
<p>Hey everyone, I&#8217;m Elliott and I built Twiggy. I&#8217;m going to take you through a brief walk-through of how to build a widget.</p>
<p>First, you&#8217;ll need a directory. In that directory, make an &#8220;index.html&#8221; file, a &#8220;style.css&#8221; file, a &#8220;scripts&#8221; directory, and an &#8220;images&#8221; directory. You can structure your files any way you feel most comfortable with. If you want to split your CSS files up by contents later on, that&#8217;s fine.</p>
<p>Now, in your HTML file, put some content. For our widget, we&#8217;re using this:</p>
<pre>
<code>
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot;
  &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Twiggy&lt;/title&gt;
    &lt;!-- This is for the Opera Widget Emulator. --&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;if(window.parent&amp;&amp;
    parent.emulator)parent.emulator.begin(window)&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;
   &lt;/head&gt;
   &lt;body&gt;
  &lt;/body&gt;
&lt;/html&gt;
<!--formatted--></code>
</pre>
<p>You can open it in a browser, and see what it looks like (it should be blank). Now, get a copy of <a href="http://jquery.com">jQuery</a> and put it in your &#8220;scripts&#8221; directory, and add a line like this to your <head> to include it.</p>
<pre>
<code>
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
<!--formatted--></code>
</pre>
<p>Write all your application&#8217;s javascript in an &#8220;actions.js&#8221; file, which goes in your /scripts folder. Add it like this:</p>
<pre>
<code>
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/actions.js&quot;&gt;&lt;/script&gt;
<!--formatted--></code>
</pre>
<p>If you want to use any other jQuery plugins, drop them in the /scripts folder and include them as normal:</p>
<pre>
<code>
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/plugin.jquery.js&quot;&gt;&lt;/script&gt;
<!--formatted--></code>
</pre>
<p>Now, add these lines to your &lt;head&gt;, just in case you ever want to look at the page on your iPhone:</p>
<pre>
<code>
&lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=1,
maximum-scale=1,minimum-scale=1 user-scalable=no,width = 320&quot; /&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width;
initial-scale=1.2; maximum-scale=1.2; user-scalable=0;&quot; /&gt;
&lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot; /&gt;
&lt;meta names=&quot;apple-mobile-web-app-status-bar-style&quot;
content=&quot;black-translucent&quot; /&gt;
<!--formatted--></code>
</pre>
<p>They tell the iPhone how to render the page, what level of zoom to use, and basically tell it to treat the page like a web-app.</p>
<p>In your &lt;body&gt;, insert the following divs:</p>
<pre>
<code>
&lt;div id=&quot;home&quot; class=&quot;panel&quot;&gt;
  &lt;form id=&quot;main-search&quot; class=&quot;panel&quot; action=&quot;#&quot;&gt;
    &lt;label for=&quot;search&quot;&gt;What is your name?&lt;/label&gt;
    &lt;input id=&quot;search&quot; /&gt;
    &lt;input type=&quot;submit&quot; id=&quot;bigsubmit&quot; value=&quot;Go!&quot;/&gt;
  &lt;/form&gt;
&lt;/div&gt;
&lt;div id=&quot;results&quot; class=&quot;panel&quot;&gt;
  &lt;!-- result goes in here --&gt;
&lt;/div&gt;
<!--formatted--></code>
</pre>
<p>Inside the body, we&#8217;ve put two divs with class &#8220;panel&#8221;. These are different pages of our application, and only one will show at a time. When we submit the form on the &#8220;home&#8221; panel, we want the home panel to hide, and the &#8220;results&#8221; panel to show.</p>
<h3>The JavaScript</h3>
<p>Now for some actions.js Javascript code:</p>
<pre>
<code>
var search = function(text){
  text = &quot;Hello, &quot;+text+&quot;!&quot;;
  $(&#039;#home&#039;).hide();
  $(&#039;#results&#039;).text(text);
  $(&#039;.panel#results&#039;).fadeIn(&#039;fast&#039;);
  return false;
};

$(&#039;document&#039;).ready(function(){
  $(&#039;#search&#039;).focus();
  $(&#039;#results&#039;).hide();
  $(&#039;#main-search&#039;).submit(function(){
    value = $(&#039;#search&#039;).val();
    search(value);
  });
});
<!--formatted--></code>
</pre>
<p>Rad! We&#8217;ve got ourselves a widget.</p>
<h3>Making it look pretty</h3>
<p>Now let&#8217;s add some style:</p>
<pre>
<code>
*{outline: none !important;}
input::-moz-focus-inner { border: 0 !important; }

html, body {
  padding: 0;
  margin: 0;
}

body {
  display: block;
  width: 100%;
  font-family: verdana;
  background: #007FC0;
  text-align: center;
  color: white;
}

#home.panel {
  padding: 20px 0;
  display: block;
}

#results.panel {
  background: #ff00ff;
}

#search {
  margin-top: 10px;
  padding: 4px;
  border: 1px solid #ff00ff;
  font-size: 13px;
}
</code>
</pre>
<p>And we&#8217;ve got the beginnings of a widget.</p>
<h3>The configuration</h3>
<p>Now, all you have to do is add a config.xml file, which looks like this:</p>
<pre>
<code>
&lt;?xml version=&#039;1.0&#039; encoding=&#039;UTF-8&#039;?&gt;
&lt;widget dockable=&quot;yes&quot;&gt;
  &lt;widgetname&gt;My Awesome Application&lt;/widgetname&gt;
  &lt;description&gt;It asks you your name, and says hi!&lt;/description&gt;
  &lt;icon src=&quot;icon_64.png&quot; /&gt;
  &lt;width&gt;240&lt;/width&gt;
  &lt;height&gt;320&lt;/height&gt;
  &lt;author&gt;
    &lt;name&gt;John Q. Developer&lt;/name&gt;
  &lt;/author&gt;
  &lt;id&gt;
    &lt;name&gt;My Awesome Application&lt;/name&gt;
    &lt;revised&gt;2009-04-08&lt;/revised&gt;
  &lt;/id&gt;
&lt;/widget&gt;
<!--formatted--></code>
</pre>
<p>And you&#8217;ve got it. Feel free to open that in Opera just to test it out.</p>
<h3>Searching Twitter</h3>
<p>Now, if you want to search Twitter, include the plugin from <a href="http://tweet.seaofclouds.com/">tweet.seaofclouds.com</a> after your jquery javascript file:</p>
<pre>
<code>
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/jquery.tweet.js&quot;&gt;&lt;/script&gt;
<!--formatted--></code>
</pre>
<p>While you&#8217;re there, change your label to:</p>
<pre>
<code>
&lt;label for=&quot;search&quot;&gt;What are you looking for?&lt;/label&gt;
<!--formatted--></code>
</pre>
<p>Change your actions.js file to:</p>
<pre>
<code>
var search = function(text){
  $(&#039;#home&#039;).hide();
  $(&#039;#results&#039;).fadeIn(&#039;fast&#039;);
  $(&quot;#results&quot;).tweet({
              query: text,
              join_text: &quot;auto&quot;,
              avatar_size: 32,
              count: 10,
              loading_text: &quot;loading tweets...&quot;,
              auto_join_text_reply: &#039;&#039;, auto_join_text_default:
              &quot;&quot;, auto_join_text_ed: &quot;&quot;,
              auto_join_text_ing: &quot;&quot;, auto_join_text_reply:
              &quot;&quot;, auto_join_text_url: &quot;&quot;,
  });
  return false;
};

$(&#039;document&#039;).ready(function(){
  $(&#039;#search&#039;).focus();
  $(&#039;#results&#039;).hide();
  $(&#039;#main-search&#039;).submit(function(){
    value = $(&#039;#search&#039;).val();
    search(value);
    return false;
  });
});
<!--formatted--></code>
</pre>
<p>And add this to your CSS:</p>
<pre>
<code>
#results { float: left; display: block; width: 100%; }
ul { margin: 0; padding :0; }

li {
  list-style-type: none;
  text-align: left;
  background: white;
  color: #333;
  line-height: 1.5;
  border-top: 1px solid #007FC0;
  float: left;
  display: block;
  padding: 5px 0;
  font-size: 12px;
  width: 100%;
}

li img {
  float: left;
  display: block;
  margin: 5px 8px 5px 5px ;
}
</code>
</pre>
<p>And you&#8217;re done! Zip everything in that folder up into a file called &#8220;search.wgt&#8221; (zip -r search.wgt *) and put it on your phone via USB cable. When you run it, it&#8217;ll run as a widget.</p>
<h3>Testing with an emulator</h3>
<p>Go get the widget emulator and try it. It should look like this:</p>
<p><img src="http://img.skitch.com/20090408-j1ux25wnxjpsggxxj6ksq3ffej.png"></img><br />
<img src="http://img.skitch.com/20090408-j1ux25wnxjpsggxxj6ksq3ffej.png"></img></p>
<h3>The good, the bad and the ugly</h3>
<p>This is a cool experiment, because you now have a site that will work in just about anything. The iPhone will handle it, it&#8217;ll work as a dashboard slice, browsers like it, and it can be run as a widget. We&#8217;ve tried to port it to a PhoneGap app for the iPhone, but no success yet.</p>
<p>There&#8217;s really not too much to watch out for. You do, however, have to be careful with your 100% width layouts so that the application doesn&#8217;t scroll horizontally.</p>
<p>Here are some other gotchas:</p>
<ul>
<li>Auto-focus input fields wherever logical. Nobody likes using that !$?*! joystick mouse.</li>
<li>Hover effects are important. Make buttons obvious, because getting to them is a nightmare.</li>
<li>Make sure the phone has your typeface, and renders it nicely. I got caught out with italics.</li>
<li>Don&#8217;t resize images with HTML &#8211; although this is pretty good advice anyway. The phone does it wrong, and it looks horrible.</li>
<li>Even if you think you&#8217;re only bundling this on the phones, use CSS sprites &#8211; because once you&#8217;re done, you have a web app waiting to happen, and waiting for your button images to load on hover is lame.</li>
<li>There&#8217;s no keypress-type event handling, which is a damn shame if you&#8217;re making a game. Poll instead.</li>
<li>Remember, the phone is fast, but not as fast as your computer is. Neither is the network connection, so be thrifty.</li>
</ul>
<h3>Data storage for widgets</h3>
<p>Storing stuff on the phone is done through some Javascript API calls. You don&#8217;t have access to anything juicy yet, but you can store and retrieve strings, using the widget.getPreferenceForKey() and widget.setPreference() methods. To be clever, include the jQuery Cookie plugin and do this:</p>
<pre>
<code>
var get_key = function(key){
  if (typeof(widget) != &amp;#039;undefined&amp;#039;){ // A phone!
    return widget.preferenceForKey(key);
  }else{ // It&amp;#039;s a browser!
    return $.cookie(key);
  }
}

var set_key = function(value, key){
  if (typeof(widget) != &amp;#039;undefined&amp;#039;){
    return widget.setPreferenceForKey(value, key)
  }else{
    return($.cookie(key, value));
  }
}
<!--formatted--></code>
</pre>
<p>This way, you can set and get keys without worrying about whether you&#8217;re saving to a cookie, or to the phone. Happy hunting!</p>
<p><em>Elliott is a freelance developer who lives in Bath, and used to work for Carsonified. He writes CSS, uses Rails and is generally available. He also likes long walks on the beach and candle-lit dinners. You can find him at <a href="http://twitter.com/elliottkember">@elliottkember</a> or <a href="http://www.elliottkember.com">elliottkember.com</a>.</em></p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=1178&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/how-to-build-mobile-widgets/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Atlas: Under the Hood</title>
		<link>http://thinkvitamin.com/carsonified/features/atlas-under-the-hood/</link>
		<comments>http://thinkvitamin.com/carsonified/features/atlas-under-the-hood/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 21:02:52 +0000</pubDate>
		<dc:creator>Francisco Tolmasky</dc:creator>
				<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Cappuccino]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://thinkvitamin.com/?p=979</guid>
		<description><![CDATA[By <strong>Francisco Tolmasky</strong><br />At 280 North we&#8217;ve been working on a framework called Cappuccino for creating what we like to call desktop class applications. These are not your average web sites, but instead a new breed of web application that aims to replace many of the programs that currently run on your desktop. When we launched 280 Slides, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fcarsonified%2Ffeatures%2Fatlas-under-the-hood%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fcarsonified%2Ffeatures%2Fatlas-under-the-hood%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>At <a href="http://280north.com">280 North</a> we&#8217;ve been working on a framework called <a href="http://cappuccino.org">Cappuccino</a> for creating what we like to call desktop class applications. These are not your average web sites, but instead a new breed of web application that aims to replace many of the programs that currently run on your desktop. When we launched <a href="http://280slides.com">280 Slides</a>, the first application built on this framework, many people were surprised to see just what was possible in the browser. Since then, Cappuccino has been steadily progressing with over 40,000 downloads and code contributions from twenty-one individuals.</p>
<p>The goal of Cappuccino has always been to make it as simple as possible to build high quality applications in the browser, and up until now we&#8217;ve worked on providing built-in behavior for enabling such tasks as autosaving, undo/redo, and copy/paste.  But recently we&#8217;ve been focusing on an entirely new product: <a href="http://280atlas.com">Atlas</a>. Atlas is a new IDE and visual layout editor that leverages the power of Cappuccino, but drastically reduces the amount of work required for creating a truly rich application experience on the web.</p>
<p><strong>WYSIWYG</strong></p>
<p>With Atlas you can build and style your entire interface using drag and drop. By default we provide you with a large library of built in widgets along with the new Aristo open source theme, meaning your application will look fantastic with no additional work. However, you can also skin these applications entirely from the editor and extend the library of widgets with Atlas&#8217; plugin architecture. And unlike a lot of existing layout editor availabe today, Atlas is not a code generator. On the contrary, Atlas lets you edit the live JavaScript objects in memory and then takes a &#8220;snapshot&#8221; of them in place. When your application runs, it &#8216;thaws&#8217; these objects out, making sure that you see exactly how your application will look before you run it.</p>
<p><strong>Layout that Makes Sense</strong></p>
<p>Atlas provides a new take on web layout that make it easy to define precisely the behavior you want, while simultaneously doing away with existing browser inconsistencies.  Instead of having to learn the variety of different ways to position and resize elements in the browser, Atlas introduces the simple concept of &#8216;anchors and springs&#8217;. Anchoring an interface element to one of the edges around it ensures that it will stay &#8220;stuck&#8221; there when it&#8217;s container resizes. Activating the internal &#8216;springs&#8217; causes it to resize with its container.</p>
<p><object width="471" height="295"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3410186&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=eb6f00&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3410186&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=eb6f00&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="471" height="295"></embed></object></p>
<p>While simple to learn, these two tools enable you to create incredibly complex and fluid layouts. More importantly, they&#8217;re guaranteed to behave the same way regardless of the browser you&#8217;re running your web app in. Atlas also provides a large selection of collection views to handle common layout tasks such as split views, table views, and scroll views.</p>
<p><strong>Connections Reduce Glue Code</strong></p>
<p>A common problem that has plagued layout editors in the past is the need for additional glue code to &#8220;talk&#8221; to the generated interface.  In Atlas, much of this work can be done with a technology called &#8216;connections&#8217;. Connections allow you to visually define the interactions between interface elements and other objects.  For example, you can define what action a slider should take when it is dragged:</p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/02/picture-1.jpg"><img class="alignnone" title="Screenshot of Atlas" src="http://thinkvitamin.com/wp-content/uploads/2009/01/280atlas.jpg" alt="" width="440" height="365" /><br />
</a></p>
<p>Similarly, you can &#8216;bind&#8217; the contents of an array to a table, so that when it changes the table automatically updates as well, all without having to ever touch the keyboard:</p>
<p><img class="alignnone" title="Atlas 02" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas2.png" alt="" width="511" height="525" /></p>
<p><strong>Model View Controller Built-In</strong></p>
<p>Cappuccino is a Model-View-Controller framework, and Atlas takes this idea to the next level by allowing you to not only create visual elements, but abstract models and controllers as well. By allowing you to interact directly with the objects in your program visually, you can focus on building unique interactions instead of learning a myriad of APIs.</p>
<p>Atlas has gone a step further and provided a number of pre-built controllers to existing web services that you can simply drop in to their applications. You can then simply use connections to grab information from services like RSS and Twitter. Once again, Atlas&#8217; plugin architecture allows you to create controllers for your own web services as well, which you can then share with others.</p>
<p><img class="alignnone" title="Atlas 03" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas3.png" alt="" width="515" height="542" /></p>
<p><strong>Multi-Platform Support</strong></p>
<p>Cappuccino was built from the ground up in preparation for a world of multiple platforms. It is becoming increasingly important for applications to run in several different environments: browsers, social networks, handheld devices, and much more. In general, very little application logic or backend code has to change from platform to platform, but the interface usually needs to be recreated from scratch.</p>
<p>With Atlas, it is drop dead simple to create a unique and custom interface for different platforms like the web browser and the iPhone. Cappuccino will then intelligently load the correct interface for your application depending on the environment it is being run on, allowing you to reduce the amount of code you need to rewrite and as well as using just one language and API for all the platforms you deploy on. We call this idea &#8216;Write once, layout everywhere&#8217;, and we feel it is the right way to gaurantee a high quality experience everywhere you ship your application.</p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png"><img class="alignnone" title="Atlas 04" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png" alt="" width="540" height="402" /></a><br />
View <a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png">full size</a></p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png"><img class="alignnone" title="Altas 5" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png" alt="" width="540" height="402" /></a><br />
View <a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png">full size</a></p>
<p>Atlas will be shipping this summer and you can sign up for email updates at <a href="http://280atlas.com">280atlas.com</a>.</p>
<p>[Photo credit: <a href="http://flickr.com/photos/atelier_tee/">flickr.com/photos/atelier_tee</a>]</p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=979&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/carsonified/features/atlas-under-the-hood/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Interoperability: The rise of Music as Mobile Content.</title>
		<link>http://thinkvitamin.com/mobile/interoperability-the-rise-of-music-as-mobile-content/</link>
		<comments>http://thinkvitamin.com/mobile/interoperability-the-rise-of-music-as-mobile-content/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 10:04:17 +0000</pubDate>
		<dc:creator>jo</dc:creator>
				<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://carsonified.com/mobile/interoperability-the-rise-of-music-as-mobile-content</guid>
		<description><![CDATA[By <strong>jo</strong><br />With this years Future of Mobile conference coming up in a months time I have been looking at the key areas of change in the mobile ecosystem since last years event. Last year the Future of Mobile discussed the question &#8220;Will content be King&#8221;. Since then the focus from both Operators and handset manufacturers seems [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Finteroperability-the-rise-of-music-as-mobile-content%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Finteroperability-the-rise-of-music-as-mobile-content%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>With this years <a target="_blank" href="http://www.future-of-mobile.com/2008/london/">Future of Mobile</a> conference coming up in a months time I have been looking at the key areas of change in the mobile ecosystem since last years event.<br />
Last year the Future of Mobile discussed the question &#8220;Will content be King&#8221;. Since then the focus from both Operators and handset manufacturers seems to have been on improving the music capabilities of the phone itself and offering enhanced services to buy music. <a href="http://www.sonyericsson.com/cws/products/mobilephones/overview/w910i">SonyEricsson</a> have expanded their range of handsets with a shake to shuffle capability. Nokia are launching their <a href="http://musically.com/blog/tag/comes-with-music/">Comes with Music</a> service this week.<br />
<img title="Night time image of blurred light" alt="Night time image of blurred light" src="http://img.skitch.com/20081016-8cprsbii5p264sbseiiygc1b2y.jpg" /></p>
<p>We have seen many mobile music services come and go over the last few years. This begs the question, what is the key differentiator between success and failure? Nokia have big pockets and are continuing with their Windows only DRM embedded music. T Mobile and Google have sensibly partnered with Amazon to deliver DRM free music from a vast catalogue to the G1 phone. Apple are holding a middle ground with iTunes content for the iPhone but do make it a deliberately obtuse process to move any content into other media players and devices.</p>
<p>The increase in the onboard memory of mobile handsets seen in the last year is typically eight fold, meaning that many users now see their phone as replacing their mp3 player. As with all aspects of mobile the user experience is the key to success. Will users really take to a service that can fill the phone up with music, but locks it in there so they can&#8217;t knock up a virtual mix tape and pass it on to a friend? I doubt it, since the launch of the cassette tape people have taken great pleasure from sharing music with each other.</p>
<p>New services such as <a href="http://www.mobileindustryreview.com/2008/10/placeshift_your_music_inc_itunes_files_anywhere_with_didiom.html">Didiom</a> in the USA really understand what users want from their music collection and the collection of devices they have in their lives. This interoperability is the key to a successful service. The insightful J P Rangaswami perfectly summed up why DRM is always destined to fail on his <a href="http://confusedofcalcutta.com/2008/10/14/musing-gently-about-complex-adaptive-systems-and-drm/">Confused of Calcutta</a> blog this week. Companies that really get it are going from strength to strength like the UK&#8217;s <a href="http://www.indie-mobile.com/">Indy Mobile</a> who build lasting relationships between the record labels and mobile consumers.</p>
<p>At Future of Web Apps in London last week I had the pleasure of discussing the mobile future with Stefan Fountain, founder of Soocial, who is one of the most astute mobile theorists there is. He says&#8230;</p>
<p>&#8220;The future of mobile is not about a device, it&#8217;s about the service, maybe not even that. It&#8217;s about what you want to do&#8221;.</p>
<p>This quote is taken directly from his FOWA presentation which is available to watch, embed, and share <a href="http://events.carsonified.com/fowa/2008/london/videos/stefan-fountain/">right here</a>.</p>
<p>(Photo credit: <a href="http://flickr.com/photos/blogumentary/">Chuckumentary</a>)</p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=385&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/interoperability-the-rise-of-music-as-mobile-content/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Future Of Web Apps In An Integrated World</title>
		<link>http://thinkvitamin.com/mobile/the-future-of-web-apps-in-an-integrated-world/</link>
		<comments>http://thinkvitamin.com/mobile/the-future-of-web-apps-in-an-integrated-world/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 16:10:34 +0000</pubDate>
		<dc:creator>Rufus Evison</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/features/webapps/the-future-of-web-apps-in-an-integrated-world</guid>
		<description><![CDATA[By <strong>Rufus Evison</strong><br />It is said that you are more likely to leave your wallet behind than your cellphone when leaving the house. Most people are within 15 feet of their phone at any time, even when they are sleeping. One person in seven has been dumped by phone and the incidence of firing by phone is growing. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fthe-future-of-web-apps-in-an-integrated-world%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fthe-future-of-web-apps-in-an-integrated-world%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>It is said that you are more likely to leave your wallet behind than your cellphone when leaving the house. Most people are within 15 feet of their phone at any time, even when they are sleeping. <a rel="nofollow" target="_blank" href="http://www.reuters.com/article/technologyNews/idUSL1323642420071214">One person in seven has been dumped by phone</a> and the incidence of firing by phone is growing.</p>
<p>The phone is so omnipresent it is becoming set to take over as the task-oriented access point for the Web, while the PC, the TV, and other large screen access points will continue to be the choice for video streaming, browsing, and other activities involving heavy graphics or complicated interfaces. It is unlikely that the phone will take over as the online word processor any time soon.</p>
<h3>Moving functionality onto the phone: spending</h3>
<p>If you are more likely to have your phone with you than your purse, it starts to make sense for the phone to take over some of the functions that you need all the time. It is no surprise that payment is moving on to the phone. </p>
<p>Take your credit card, for example. What is a credit card, really, but a bunch of information held in a form that is awkward to replicate? In effect, it&#8217;s an account number combined with an ID. Any modern cellphone has more storage capacity than a hundred credit cards require, so why not move it onto the phone and have it with you the whole time?</p>
<p>However, managing your finances on your phone with a full-scale accounting application might not be convenient; you would really need a bigger screen than is really comfortable to carry around with you. So we have our first driver towards convergence right here. Moving a credit card to the phone and administrating your finances across a variety of web channels not only makes sense, but there are a lot of other advantages to it which we will discuss later.</p>
<h3>Traveling</h3>
<p>First let’s look at how another card with a magnetic strip has evolved. The humble tube ticket used to be the standard way of getting about in London; now 80% or more of eligible journeys are made using contactless <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Oyster_card">Oyster cards</a>. Contactless cards are quicker and more convenient than putting a card into a slot. So if we are going to move the credit card onto the phone then let it be as a contactless card. And if we have a contactless card, it might as well be our Oyster card as well. That way the Oyster can be &#8220;topped up&#8221; from the account attached to the credit card and save us a bit more bother. In the world of developing technology, convenience should be king. It is no surprise to find that the Oyster card is administrated over a web interface, so perhaps we should integrate that with our accounting package so that we can see our debits coming out of the bank account, and then drill down into the journeys.</p>
<p>Just making the phone into a ticket is limiting its usefulness, though. If you are connected to the network, the phone could know where you are and alert you just before you reached your stop. This would be handy for those people who tend to fall asleep and go straight past their stop. Also, it could spot if you are going the wrong way (oops, wrong platform and wrong train!). Clearly this could also work if we spread the ticket to cover &#8220;over-ground&#8221; rail and bus. It could do these tasks already, but it needs to know where you are going. If our application were tied to your calendar, then it would already know where you are going. If you had not put the trip into the calendar, then the phone could check while buying your ticket. It could even set an &#8220;out of office&#8221; autoreply on your email, add a calendar entry in to let people know where you are, and add the trip to your expenses claim form. Directing you to the right platform, the right train and then letting you know in time to gather your things together before you got there would be easy, too. Even more useful, for those unfamiliar with the tube system, would be help to find your way around the labyrinthine tunnels.</p>
<h3>Identification</h3>
<p>While we are at it, are there any other contactless cards we could add to our phone? Well, here at <a rel="nofollow" target="_blank" href="http://www.dunnhumby.com/">dunnhumby</a> there is our security pass. Now, a phone can&#8217;t replace all the functionality of my pass because having a photo visible is clearly an important security element. The phone could do the door-opening part of its work, though. I&#8217;m less likely to be left behind than the standard pass, so let&#8217;s look at how it could work if I remembered my phone but forgot my standard pass.</p>
<p>If I left my pass behind I could swipe my phone at a kiosk at reception. The kiosk could then print out a photo of me, from my badge record, to hang around my neck. Clearly I need to show that I really am me, so I would be asked for a password and a few other details before being given the temporary pass. Now the kiosk could ask for those details, but so could the phone. The phone is, after all, a computer.</p>
<p>We could also look at putting a biometric check on the phone. These are available on laptops, so why not phones? It isn&#8217;t 100% secure, but it is better than we have now. Now the phone has an advantage over the kiosk as a place to check my biometric data, because it is somewhere I am more comfortable with the verification information being stored. It also prevents data redundancy, as I only need to have my personal details in one place rather than several. If we are doing security checks with the phone then we want to ensure that loss of the phone does not let it out into the world. What we really need to do is to make this another joint application, with the phone accessing a secure hybrid online interface and backup system on the Web. Clearly this will need the best security we can find, but if it has that then we can start tying the security aspects up with that credit card we were talking about earlier.</p>
<h3>Security</h3>
<p>So now we have a phone/web application that knows how to identify you and can be used in a quick and easy way to give you access to money, travel and work. This is clearly of value, so what happens if you lose it? Well first, it is a phone so you may be able to locate it: you could call it, or get it to use GPS to tell you where it is. But what if it was stolen? You can can easily cancel it through the phone network. But not only that, your new replacement phone can make itself into a clone of your old one as soon as you have verified your identity. So your new phone/card wallet is safer than the old credit cards you used before, immune to shoulder surfing, and tied into the way you run your accounts. With a credit card someone can clone it and access your account, but a phone can change the code it uses with each transaction so even a thief could intercept the code they couldn&#8217;t use it.</p>
<p>Given that our phone knows who we are it could also act as a key. Not just at work, but for our homes, too. You could control access to your house remotely to let people in; your house is connected to the phone network after all. If you were organising a party you could make access to your house part of the invitation email as you pick people out of your contacts on your home PC. They would be able to access their email from their phones, effectively making their own phones into &#8220;keys&#8221; to get in. You could set up visitor phones to have access once for a limited slot (that party invite perhaps), or regularly on certain days (the cleaner) or on a permanent basis (the boyfriend). You could then remove the permission straight away (during an argument in a restaurant, say) and not worry that they will come busting in later (<em>I Will Survive</em> might never have been written if it had been that easy to change your lock!)</p>
<h3>Shopping</h3>
<p>Mixing phone access with web applications can help enable spending, traveling, working and security; perhaps it can do more than that. It is already tied into the way you budget, so why not set it up so purchases over $20 require a fingerprint? As we put verification on the phone instead of the kiosk it is easy, and it won&#8217;t slow things down as you are holding the phone to wave it near the checkout anyway. If it&#8217;s a big purchase, say $100, you could set it up to ask for a PIN number too. It&#8217;s your phone so you can set the limits to amounts you are comfortable with. All of this adds security, but could also help you stick to a budget.</p>
<p>Let&#8217;s go further than that. Why not decide what weight we are happy to carry in a single shopping trip, and say that if you purchase anything over 10kg you will be willing to pay $5 for delivery. Pickers gather a basket for you at your local store, so if it is heavy why not put the basket we have gathered into the same process? Your phone can exchange contact details and pay at the same time. That is all very well if you are buying everything in one store, and we could do it even with an ordinary credit card and epos (electronic point of sale) access to preferences. What happens if you build up to 10kg across a few shops? If your phone keeps track of your purchases it could ask, when you go over the weight limit in one trip, whether you want the latest purchase delivered. Perhaps, as a slightly more costly service, the picker in store could take the basket you picked from all the different shops and get them all delivered? This could combine with your online mapping application to remind you to get delivery when you are in the stores that do delivery, even if that means popping into a nearby store. It would also tie up to your overall shopping trip and maybe your packing list too. Going on holiday? Make the application remind you when you are near any items you need to buy before you go.</p>
<p>If we are putting cards into our application then including contactless loyalty cards clearly makes sense. What are the advantages? Well, the first is that if your loyalty card and your payment mechanism are on the same phone then you can begin to get credit for all those small purchases that were not worth getting your card out for before. Pulling out your phone to pay is even less work than getting your money out of your wallet, particularly if you don&#8217;t have to count the money, just wave the phone. Again convenience is king, and adding convenience is actually providing customers with value.</p>
<p>In order to get at the other advantages of the loyalty card being on the phone we should, perhaps, touch briefly on what a loyalty card is:</p>
<ul>
<li>A way for a retailer to say &#8220;Thank you for shopping here, do come again&#8221;</li>
<li>A way for you to tell the retailer which offers will interest you so as to keep the offers you are sent relevant</li>
<li>A way for the retailer to understand shopping habits so that they can become the type of shop that you, their customer, wants</li>
</ul>
<p>In any interaction between a retailer and a customer, both parties must benefit. If this is not the case then the interaction will not happen. When you buy a loaf of bread the retailer gets your money and you get to eat; both sides benefit. The same is true for a loyalty card. By becoming the place you want to shop the retailer becomes more profitable and both parties benefit. In the way I have described the phone developing I have been talking about the benefits to the phone&#8217;s owner. Some of them are overwhelming, and will mean that market forces make them happen, but that will not necessarily make them as convenient as I have described. The bank that puts their credit card onto our phones first has an advantage and people will start to switch to them. This, in turn, will pressure all banks to move their credit cards onto our phones.</p>
<p>This won&#8217;t work if there is just convenience to the customer without a clear commercial beneficiary. I mentioned the possibility of your phone keeping track of what you bought and arranging for the shopping to be delivered, if necessary. If a shopping trip stays within a single shop then that shop benefits, but if a trip takes the shopper through multiple shops only the customer benefits from the phone doing this work. Equally, where is the advantage to the product manufacturer in making the weights of its products available to millions of phones? Likewise, if credit cards are being added to the phone, who is going to provide the platform that lets you add them in and remove them when it becomes necessary to, for example, change your credit card provider?</p>
<h3>So, who&#8217;s going to do all of this work?</h3>
<p>Perhaps it would make sense to create a deal similar to that for loyalty cards: customers provide some information about themselves in exchange for having the platform to add and subtract cards and to set limits, alarms, and alerts. Given that loyalty cards are doing some of this kind of work already, it might make sense to extend an on-phone card to include the platform itself. This would allow much closer integration between phone and online applications without the causing the phone to be costing too much in bandwidth. One possible benefit to the loyalty scheme might be the advantage of having control over the branding as settings are changed and alerts read. Given that the platform will require maintenance, and will run within a possession we have already shown is integral to everyday life, there is a need for it to be of the level of quality that only comes at a considerable cost. As customers, we could offer a willingness to receive non-intrusive targeted offers and advertising within the platform interface and additional information about ourselves for targeting those offers in return for the loyalty card company providing the platform. Neither one of these seems too high a cost for the value such a platform would provide for us.</p>
<p>
This sort of deal with a loyalty card could have a significant advantage over phone manufacturers producing a home-grown solution: consistency. If convenience is king, then usability is the throne it sits upon. If something is not usable it is not really convenient. Usability comes from things working the way you expect them to without having to think. Given the rate at which we change from one phone to another, following fashions, we do not want to have to learn a new interface every time. We particularly do not want to risk having the way our credit card is protected changing continually. If your favourite loyalty card were the platform it could come with you. It will be a brand to rely upon to back up your phone and not accidentally delete your settings, your identification and half of your life.</p>
<h3>Conclusion</h3>
<p>
Nearly all of the functions to be integrated that I mention here are either in use on phones in other countries or are already in development. For example, contactless capability, referred to as NFC (Near Field Communication) looks like it will be standard for most new UK phones in about 18 months or so; in Japan it is already how everyone uses their phones. This kind of convergence and integration has not really happened yet, but is clearly on the horizon.</p>
<p>
So what is the future of web apps? They will tell us who we are, where we are, what we can spend and what we can spend it on. In effect, they can become the ultimate view nannies, always remembering the fact that the user will have set up the guidelines themselves.</p>
<p>The only question is not how far can the future development of web applications take us, but how far do we want it to go?</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/vitaminmasterfeed?a=I1HJS9Ed"><img src="http://feedproxy.google.com/~f/vitaminmasterfeed?d=960" border="0"></img></a> <a href="http://feedproxy.google.com/~f/vitaminmasterfeed?a=x2Itmz21"><img src="http://feedproxy.google.com/~f/vitaminmasterfeed?i=x2Itmz21" border="0"></img></a> <a href="http://feedproxy.google.com/~f/vitaminmasterfeed?a=63vW4wps"><img src="http://feedproxy.google.com/~f/vitaminmasterfeed?d=52" border="0"></img></a> <a href="http://feedproxy.google.com/~f/vitaminmasterfeed?a=ogytXVTs"><img src="http://feedproxy.google.com/~f/vitaminmasterfeed?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/vitaminmasterfeed?a=tFSjbzV6"><img src="http://feedproxy.google.com/~f/vitaminmasterfeed?d=961" border="0"></img></a>
</div>
<p><img src="http://feedproxy.google.com/~r/vitaminmasterfeed/~4/JBUOcpZOf0w" height="1" width="1"/></p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=1789&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/the-future-of-web-apps-in-an-integrated-world/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Coding for the mobile web</title>
		<link>http://thinkvitamin.com/mobile/coding-for-the-mobile-web/</link>
		<comments>http://thinkvitamin.com/mobile/coding-for-the-mobile-web/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 12:59:29 +0000</pubDate>
		<dc:creator>Chris Mills</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[mobile web]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/features/css/coding-for-the-mobile-web</guid>
		<description><![CDATA[By <strong>Chris Mills</strong><br />Introduction Good evening &#8212; in this article I will aim to demystify the world of mobile web development, or in other words, developing web sites so that they will provide an acceptable user experience on mobile devices. I&#8217;ll run through how &#8220;the mobile web&#8221; differs from the normal web, the basics of techniques you can [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fcoding-for-the-mobile-web%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fcoding-for-the-mobile-web%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<h2>Introduction</h2>
<p>Good evening &mdash; in this article I will aim to demystify the world of mobile web development, or in other words, developing web sites so that they will provide an acceptable user experience on mobile devices. I&rsquo;ll run through how &#8220;the mobile web&#8221; differs from the normal web, the basics of techniques you can employ to make your sites work sucessfully on both mobile and desktop browsers, some general DOs and DON&rsquo;Ts for mobile web design, and numerous resources where you can go to find out more information.</p>
<h2>How does the mobile web differ from the normal web?</h2>
<p>This is a good question &mdash; first maybe we should start by answering the question <q>what is the mobile web?</q> after all, there isn&rsquo;t a separate mobile web  that users of mobile devices plug into, leaving the desktop web for when they get home in front of their home computer. When I say <q>mobile web</q>, I mean <q>the Web as viewed through mobile devices.</q></p>
<p>At Opera, we passionately dedicate ourselves to creating browsers that allow you to view the whole web, regardless of (dis)ability or browsing device. There is one and <em>only</em> one web, and you can make this one web work for everyone on every device as long as you treat it with a bit of care and respect and follow web standards when creating your sites. There are exceptions to this rule however &mdash; in some cases separate mobile sites DO make sense, as you&rsquo;ll see below.</p>
<h3>The playing field is not level on mobile</h3>
<p>In the desktop domain, things are getting pretty easy for us web developers these days &mdash; most modern browsers support web standards pretty well, be they Opera, Firefox (and other Gecko-based browsers) or Safari (and other WebKit-based browsers). Even IE is causing us less pain than it used to, although IE 6 is still used by an alarming number of web users, due to factors such as corporate lock in. The story is quite different on mobile devices however:</p>
<ul>
<li>You&rsquo;ve got web browsers that offer support for <q>the full web</q>, like <a href="http://www.opera.com/products/mobile">Opera Mobile</a> and <a href="http://developer.apple.com/iphone/devcenter/">Safari</a> on the iPhone. Opera Mobile uses the same rendering engine as the equivalent desktop version, so the standards support is about the same.</li>
<li>You&rsquo;ve got constrained browsers, ie, browsers with a limited support for web standards. A few of these still only support WAP (such as WinWAP,) some support other standards like cHTML or HTML MP (for example the Japanese NTT DoCoMo iMode browsers,) and some support a limited subset of the web standards (such as Netfront, Pocket IE, and Blazer.)</li>
<li>Lastly, you&rsquo;ve got <a href="http://www.operamini.com">Opera Mini</a>, and other browsers that work via a proxy system. It mainly just acts as a client interface between the user and a big server farm. When the user submits a URL, the client asks the servers to look up the page. They then convert it into a lightweight binary markup language, format it for viewing on a mobile device, and send it back to the client for viewing. The major advantage of doing it this way is that the pages are reduced in size by up to 90%, saving the user lots of money on bandwidth. language  Say what web standards do and don&rsquo;t work well on mobile devices. Because of the way the service is set up, Opera Mini doesn&rsquo;t handle some aspects of Ajax/JavaScript very well &mdash; <a href="http://dev.opera.com/articles/view/javascript-support-in-opera-mini-4/">this is explained in detail here</a>.</li>
</ul>
<p><strong>Note: don&rsquo;t expect your ultra-interactive Ajax and DOM scripting animated sites to work well on mobile devices. JavaScript support on mobile devices varies a lot. Provide fallbacks at all times. An example of this approach is called <a href="http://domscripting.com/blog/display/41">Hijax</a>.</strong></p>
<p>So as you can see, you&rsquo;ve got quite a bit more to think about in terms of cross browser support on mobile devices. But never fear &mdash; my advice below will send you in the right direction, and as time goes on standards support will improve across mobile browsers, to the point where mobile web development isn&rsquo;t really that much of a worry anymore. When will that happen? Who knows!</p>
<h3>What are the other constraints of mobile browsers?</h3>
<p>Of course, there are more considerations when developing web sites that work on mobile devices, besides just mobile browser standards support. You also have to consider the constraints of the device itself, such as:</p>
<ul>
<li>Limited controls &mdash; don&rsquo;t just assume your user can control everything with a mouse, provide a keyboard alternative. Some mobile phone users may not have a mouse pointer equivalent, so constructs like <code>:hover</code> and <code>onClick</code> are useless to them (this is important for accessibility as well &mdash; some users may have disabilities that affect their ability to use their hands.) Also important is providing aids for inputting data &mdash; most of you will already know how annoying it is having to fill in a long web form using a mobile phone. To get around this, try to make as many things as possible selectable from a drop-down list, rather than expecting the user to type it in. Prefilling form fields with the most likely option is also a good idea.</li>
<li>Limited screen size &mdash; think about how usable your beautiful intricate 1024 x 768 design will look like on a 240 x 320 screen, or smaller than that&#8230;there are some ways to plan for this &mdash; you can deliberately make your design very simple and fluid, or you can serve appropriate pages to a mobile device using capability detection or media queries and media types (more on this later.) Some phones will help you out in this regard, with mechanisms such as &ldquo;zoom modes&rdquo;, but you can&rsquo;t guarantee it.</li>
<li>Limited memory and bandwidth &mdash; mobile devices will obviously have less memory available than desktop computers, therefore you need to think carefully about those image heavy galleries, and interactive streaming video applications you we planning on putting on your home page! Again, some mobile browsers have the option of turning images off, but again you can&rsquo;t be sure.</li>
<li>Limited typography &mdash; wow, you thought you had it bad with typography on desktop computers? You &rsquo;aint seen nothing yet! There are exceptions to this rule, but a lot of mobile devices have very limited font choices, like 1 or 2. This is partly down to the system, and partly down to the browser.</li>
<li>Limited colour palette &mdash; some mobile devices also have a very limited palette. Think about how much your page&rsquo;s experience reiles on colour, and make sure that colour contrasts still work ok on mobile devices.</li>
</ul>
<p>It is constraints like these that really make the mobile web experience different from the desktop web experience. Never try to kid yourself that the user experience on your site will be EXACTLY THE SAME on mobile devices as it is on desktop devices &mdash; this isn&rsquo;t going to happen. You do however need to make sure that the experience is still a good one, regardless of browsing device.</p>
<p>The only way to be really sure that your site provides a good mobile experience is to test, test, and test again, on multiple devices. Some web designers have been known to have half a dozen mobile devices at hand to test on, in addition to their normal phone, desktop computers, and game console browsers.</p>
<h2>Different approaches to the problem</h2>
<p>It is generally recognized that there are three ways to approach the mobile development problem (this is corroborated by Cameron Moll &mdash; <a href="http://dev.opera.com/articles/view/free-mobile-web-design-chapter-to-downlo/">check his book out for more</a>.) I&rsquo;d recommend trying to follow way number three if possible &mdash; as stated earlier, at Opera we believe that there should only be one web &mdash; but as I&rsquo;ve also said earlier, there are some case where this is difficult to achieve, and/or unnecessary. the three methods are as follows:</p>
<ol>
<li>Do nothing except follow web standards.</li>
<li>Create a completely seperate mobile site</li>
<li>Create one site, but add code to optimize it depending on the device and browser looking at it.</li>
</ol>
<p>Let&rsquo;s now go through each of these in turn.</p>
<h3>Do nothing except follow web standards and best practices</h3>
<p>The foundation of every good web site is a good HTML structure, with CSS for style and JavaScript for behaviour. If you follow the standards carefully, there is a pretty good chance that most mobile browsers will be able to at least interpret your sites and render them in a manner that is basically usable. For example:</p>
<ul>
<li>A site with good logical source order structure and without decorative images in the markup will display logically in a mobile browser&rsquo;s single column/mobile mode.</li>
<li>If your form elements have <code>label</code> elements then the browser will make more sense of form fields</li>
<li>If you also use good graceful degredation/progressive enhancement techniques for your CSS and JavaScript so that functionality not supported in browsers is either simplified, or ignored and an alternative provided, the chance of the site providing an acceptable user experience is increased greatly.</li>
</ul>
<p>This is not a bad way to go, but there is more that can be done to improve the mobile user experience if you have the time and the knowhow to spend on it. If your target audience includes a great deal of users using either non-HTML browsers (eg Japanese browsers that support WAP or cHTML, then you may be forced to detect for the device and serve up appropriate content.</p>
<h3>Provide a completely separate mobile site</h3>
<p>As mentioned before, I think this way should be avoided if at all possible. You can do device detection and redirect automatically so that it doesn&rsquo;t inconvenience the user base, but it does mean having to maintain two web sites. The main way to do this is to detect the browser via user agent sniffing or capability detection on the server-side, and then serve up the appropriate site. There are a number of good articles at <a href="http://dev.opera.com">dev.opera.com</a> about how to do this &mdash; see the resources section at the end.</p>
<p>But there are exceptions, where a separate mobile site may mke sense &mdash; you&rsquo;ve got to consider the user experience at all times. Some types of browsing device won&rsquo;t be likely to make use of certain web sites, or certain features of certain web sites. For example, take a site such as a university campus that has search functionality for looking up department phone numbers, but also contains pages and pages of university history. You are likely to want to use the former on a mobile device, say if you are meeting someone but can&rsquo;t find their department, but you are unlikely to want to sit and read reams of text on a mobile device while out and about.</p>
<p>In this situation, you could use some of the techniques described below to create a site that only serves a certain subset of it&rsquo;s functionality to mobile devices, or it might just be easier to create a seperate site entirely for mobile devices. You could just detect what kind of device your users have and serve them the appropriate site automatically, making the process completely transparent to the user, but this is seen as bad by many &mdash; many people don&rsquo;t like to be restricted like this, so if you are going to do it, provide a link to the full site so the user can try using it on their mobile browser if they wish.</p>
<p>One word of warning &mdash; device detection is very open to abuse. You often see a full desktop version of a site in all it&rsquo;s glory, and then a really rubbish basic mobile site experience alongside it, because the developer is just dumbing the mobile site down to the lowest common denominator. It&rsquo;s easier on him or her, but not fair on the target audience, as many mobile browsers can handle the full capabilities of the Web these days! You should instead be serving devices with as much capability as they can handle, and taking advantage of mobile specific benefits, such as location based services (LBS), and the <code>tel:</code> protocol, which can cause a mobile phone to dial a phone number when a link is clicked on.</p>
<h3>Provide one site&hellip;</h3>
<p>This is where it starts to get interesting. You can again rely on server-side capability detection, but optimize a single site for the mobile device, rather than redirect to a seperate site. There are databases of mobile phone capabilities availble, such as <a href="http://wurfl.sourceforge.net/">WURFL</a>. This comes in the form of an XML file that you can query to find out the capabilities of a device, before sending it optimized content. You can also query the UA strings of a mobile device to find out details such as whether the device has a camera, what the screen dimensions are, and what languages it would prefer content to be delivered in.</p>
<p>On the client side, you&rsquo;ve got a couple of options for optimizing content for mobile devices &mdash; media types and media queries.</p>
<h4>media types</h4>
<p>As you&rsquo;ll no doubt already know, you can specify different CSS to be used for different purposes, for example:</p>
<pre><code>
<link rel="stylesheet" media="screen" type="text/css" href="main.css" />
<link rel="stylesheet" media="print" type="text/css" href="print.css" />
<link rel="stylesheet" media="handheld" type="text/css" href="mobile.css" /></code></pre>
<p>the <code>handheld</code> media type allows you to target a mobile device with a stylesheet optimized for viewing on mobile devices (eg simplified layout, simplified typography etc.) It is a well-supported mechanism, and fairly simple to implement, but it does have it&rsquo;s drawbacks. Again, it is often abused by developers to serve a site a crappy lowest common denominator layout. So much so in fact, that Opera Mini recently changed it&rsquo;s default behavior from using the <code>handheld</code> stylesheet to using the <code>screen</code> stylesheet. Opera Mini can handle most full web sites, so it doesn&rsquo;t really need to use the <code>handheld</code> stylesheet. You can set Opera Mini to use it instead if you wish by switching to mobile view in the browser preferences.</p>
<h4>Media queries</h4>
<p>Media queries are a CSS 3 construct that act in a similar way to conditional comments &mdash; you can enclose a block of CSS rules inside a media query, and then have them applied to your markup (or not) depending on a condition, such as &ldquo;is the screen size less than 480 pixels&rdquo;? Put into code, this would look something like the following:</p>
<pre><code>img {
  margin: 0 0 10px 10px;
  float: right;
}

@media all and (max-width: 480px) {
  img {
    margin: 10px auto;
    float: none;
    display: block;
  }
}</code></pre>
<p>You could even use a couple of media queries together, as follows:</p>
<pre><code>body {
  max-width:800px;
  font-family:georgia, serif;
}

img {
  margin:0 0 10px 10px;
  float:right;
}

.info {
  position:absolute;
  left:8000px;
}

@media all and (max-width: 480px) {
  img {
    margin:10px auto;
    float:none;
    display:block;
  }
}

@media all and (max-width: 240px) {
  img {
    display:none;
  }
  .info {
    position:static;
  }
}</code></pre>
<p>So in this example (<a href="/images/articles/mobile101/source.zip">source code available here</a>,) images in browsers with a screen width larger than 480 pixels are displayed floated to the right, with the text flowing round them at a co<del class="edit=david">n</del>mfortable distance provided by the margins. (There is an alternative message hidden in <code>p</code> elements with a <code>class</code> of <code>info</code> &mdash; check the HTML source out.) The text flow might start to look a bit crappy on smaller screens, where there isn&rsquo;t enough room to have the images and an appreciable amount of text on the same line, so as soon as the viewport gets smaller than 480 pixels, the images are changed so that they no longer flow the text around them, but are instead displayed on separate lines using <code>display:block</code>. But wait &mdash; there&rsquo;s more! If the screen gets far too small for the images to be displayed usefully, then they disappear, and the alternative messages are displayed in their places, to give textual descriptions of those pictures &mdash; this provides an alternative mechanism of getting that information across to the reader, and also provides a textual alternative for blind users using screenreaders to view the site. Figure 1 shows the three different display settings when the example is viewed in a browser that supports media queries, such as Opera 9.5.</p>
<p><a href="/images/articles/mobile101/figure1.jpg"><img src="/images/articles/mobile101/figure1_small.jpg" alt="The three different viewing modes of the example" /></a></p>
<p>Figure 1: The three different viewing modes of my example.</p>
<p>This sounds great, but what&rsquo;s the downside? Well, browser support is currently very patchy for media queries. Opera browsers support them, so does Safari 3  (and other modern Webkit-based browsers), but Firefox <3 doesn&rsquo;t, and neither does IE or other web browsers. One way to tackle this is to use a combination of media types and media queries. This kind of approach is <a href="http://dev.opera.com/articles/view/how-to-serve-the-right-content-to-mobile/">explained in my article here</a>. It is a workaround of sorts, but certainly not ideal. This should improve in the future.</p>
<h2>Summary</h2>
<p>That&rsquo;s it for now. I hope my journey into the world of mobile development has been helpful. I&rsquo;ve only scratched the surface here, so be sure to dig into some of the resources below to learn more.</p>
<h2>Resources</h2>
<ul>
<li><a href="http://mobilewebbook.com/">Mobile web design book, by Cameron Moll</a></li>
<li><a href="http://dev.opera.com/articles/view/designing-and-developing-mobile-web-site/">Designing and developing mobile web sites in the real world</a> &mdash; a case study by Brian Suda</li>
<li><a href="http://dev.opera.com/articles/view/server-side-capability-detection-for-mob/">Server-side capability detection for mobile devices</a> by Brian Suda (includes more on WURFL, UA strings&#8230;)</li>
<li><a href="http://dev.opera.com/articles/view/javascript-support-in-opera-mini-4/">Ajax/JavaScript support in Opera Mini 4</a>, by me</li>
<li><a href="http://dev.opera.com/articles/view/opera-mini-request-headers/">Kristian von Streng HÃ¦hre&rsquo;s Opera Mini request header reference</a></li>
<li><a href="http://dev.opera.com/articles/view/how-to-serve-the-right-content-to-mobile/">How to serve the right content to mobile browsers</a>, again by my good self &mdash; includes media queries and media types</li>
<li><a href="http://dev.opera.com/articles/view/safe-media-queries/">Creating safe media queries that work cross browser</a></li>
<li><a href="http://dev.opera.com/articles/view/web-design-with-opera-mobile-in-mind/">Web design with Opera Mobile in mind</a>, again by me</li>
<li><a href="http://wurfl.sourceforge.net/">The WURFL homepage</a></li>
<li><a href="http://www.opera.com/products/mobile/">The Opera Mobile homepage</a></li>
<li><a href="http://www.operamini.com/">The Opera Mini homepage</a></li>
</ul>
<p><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=1775&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/coding-for-the-mobile-web/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Make your Site Mobile Friendly</title>
		<link>http://thinkvitamin.com/mobile/make-your-site-mobile-friendly/</link>
		<comments>http://thinkvitamin.com/mobile/make-your-site-mobile-friendly/#comments</comments>
		<pubDate>Mon, 14 May 2007 17:18:50 +0000</pubDate>
		<dc:creator>Virginia DeBolt</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile design]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/features/css/make-your-site-mobile-friendly</guid>
		<description><![CDATA[By <strong>Virginia DeBolt</strong><br />The number of mobile devices loose in the world greatly exceeds the number of desktop (or laptop) computers filling up desk and table space in offices and homes. The number of people who might view your site while clutching a screen measuring anywhere from 100 pixels to 640 pixels in width increases daily. Creating mobile-friendly [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fmake-your-site-mobile-friendly%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fmobile%2Fmake-your-site-mobile-friendly%2F&amp;source=thinkvitamin&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>The number of mobile devices loose in the world greatly exceeds the number of desktop (or laptop) computers filling up desk and table space in offices and homes. The number of people who might view your site while clutching a screen measuring anywhere from 100 pixels to 640 pixels in width increases daily. Creating mobile-friendly content is quickly becoming less of an occasional add-on and more of a standard practice.</p>
<p>This article will take a look at how you can create mobile-friendly content, how you can test your work, and offer a few tips for writing <abbr title="Cascading Style Sheets">CSS</abbr> for the media type <em>handheld</em>. If you are a Dreamweaver or Flash user, we&#8217;ll also take a look at something new from Adobe that will help you test your pages for handheld devices.</p>
<h3>Start with the basics</h3>
<p>If you begin with standards-based <abbr title="Hypertext Markup Language">HTML</abbr>  that is formatted with logical, semantic markup, you&#8217;re ahead of the game already. A well structured document with clear organization and semantic markup will display cleanly, be usable, and be accessible on any device &#8211; mobiles included. Using CSS to separate content from presentation means your content will be accessible, even on the least capable mobile device. Pay attention to other basics as well. For example, good alternative text  is an essential for any non-text element in your pages. Make sure that form fields are properly labeled.</p>
<p>Clean, semantic markup is crucial when you consider the variety found in mobile devices. Some phones may only understand <abbr title="Wireless Application Protcol">WAP</abbr>. More capable phones may  understand WAP2, which opens them up to rendering websites with <abbr title="Extensible Hypertext Markup Language">XHTML</abbr> and CSS. Some devices may display only monochromatic screen colors, while others may have full color. Some devices support CSS, some do not. Some only understand HTML 3.2, while others understand XHTML. Some devices undertand tables, floats, frames, JavaScript, and dynamic menus, but many do not. Most devices don&#8217;t support cookies. Devices at the high end of the mobile market such as BlackBerry, Palm, or the upcoming iPhone are highly capable and support nearly as much as a standard computer.</p>
<p>All those possibilities are enough to make you long for the days when the browser wars meant coding for Internet Explorer 4 or Netscape Navigator 4! But we have two things now that we didn&#8217;t have in the bad old days: a large body of knowledge about how to write standards-based HTML and XHTML using semantic markup and about how to separate content from presentation with CSS. If you stick to best practices in those two areas, the need to worry about every single rendering possibility from mobile devices diminishes and you can develop with confidence.</p>
<h3>Testing your site</h3>
<p>None of the free or fee-based testing options can equal the testing results you get with an actual device. I recommend testing with real mobile devices much as possible, but I know it isn&#8217;t feasible to run out and buy every single mobile device. There are some fairly reliable ways to test your site without going to that extreme. Some of the testing techniques are free, some are not. First, let&#8217;s look at the free options. </p>
<p>Opera provides two good testing tools. Using the standard <a href="http://www.opera.com/">Opera browser</a>, select View > Small Screen to see your page rendered in an approximation of what a mobile screen might display. The Opera web developer bar has a button called Display that allows you to toggle CSS on or off when viewing a page using small screen view. Here you see two Opera small screen views of my blog, <a href="http://www.webteacher.ws/">Web Teacher</a>, first with CSS, then without.</p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/OperaWithCSS.jpg" alt="Opera's small screen rendering with CSS " width="250" height="604" /><img src="http://www.thinkvitamin.com/misc/mobilefriendly/OperaNoCSS.jpg" alt="Opera's small screen rendering with no CSS" width="250" height="604" /></p>
<p>As you can see, Opera renders the images in small screen view. (We&#8217;ll talk more about images later.) Note that the small screen view renders the content in source order, that is, the order in which the elements appear in the HTML. Elements are clearly distinguishable from a semantic viewpoint: headings, links, paragraphs, blockquotes. The organizational and semantic underpinnings hold up so that the content is readable and useable. This is especially easy to see in  the second screen shot, with the CSS toggled off. Keep in mind that neither of the displays in the previous two screen captures are influenced by a handheld CSS media type stylesheet. When a heldheld CSS stylesheet is present, Opera&#8217;s small screen view will take it into account. More about this in a bit.</p>
<p>Opera  provides a free browser that can be downloaded and installed on handheld devices. It&#8217;s called Opera Mini. (You can purchase Opera Mobile for even more capability.) Both are available at <a href="http://www.opera.com/">opera.com</a>. Since Opera is in the business of providing browsers for mobiles, the company made  a helpful online mobile simulator at <a href="http://www.operamini.com/demo/">operamini.com/demo</a>. Here, you can load a page into the Mini Demo and operate it with mouse or keyboard as if it were a real mobile phone. The screen capture shows that the Mini Demo renders images and CSS. Again, there is no handheld CSS media type stylesheet affecting this rendering.</p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/OperaMiniDemo.jpg" alt="The Opera Mini simulator" width="234" height="517" /></p>
<p>Another free way to test your site for clear structure, organization, and proper semantics is with <a href="https://addons.mozilla.org/en-US/firefox/addon/60">Firefox&#8217;s Web Developer extension</a>. Use this tool to disable images, JavaScript, and CSS and you&#8217;ll have a good idea about whether your content is going to make sense and be navigable in one of older and less capable mobile phones. </p>
<p>Here&#8217;s a Firefox screen capture. For this, the Web Developer Toolbar was used to disable all CSS, all JavaScript, and all images. </p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/Firefox.jpg" alt="Firefox with CSS, JS, and images disabled" width="300" height="395" /></p>
<p>Viewing the page without images and with no functioning JavaScipt is very useful in terms of testing for older mobile devices. Keep in mind that some of the less capable mobile devices don&#8217;t render tables. None of them understand frames. Seeing your site this way really drives home the importance of standards-driven, semantic markup.</p>
<h3>Using specific emulators</h3>
<p>Some of the phone and PDA manufacturers have emulators on their sites that you can download and use for testing. Depending on your target audience, testing on a specific emulator might be helpful. If you are interested in specific device or manufacturer, check their site for developer resources. (For example, Sony Ericsson&#8217;s <a href="http://developer.sonyericsson.com/">Developer World</a>, Nokia has a developer forum with an <a href="http://forum.nokia.com/main/resources/getting_started/xhtml_content.html">XHTML section</a>,  </p>
<h3>Testing CSS Handheld media stylesheets</h3>
<p>An important  tool in the Firefox Web Developer Toolbar is CSS > View CSS by Media Type > Handheld.  If you look at Web Teacher in a standard monitor, you see that it is a simple two column layout using a left float for the content div and a large margin-left to create the sidebar as a second column. I&#8217;ll add a stylesheet for handheld media to the testing mix. It contains only two rules â€” to reset the sizes of the content div and sidebar div and to remove the float. Here&#8217;s the entire stylesheet:</p>
<pre><code>
#content {
	float: none;
	width: 95%;
}
#sidebar {
	width: 90%;
	margin-left: 5%;
}
</code></pre>
<p>The link to this stylesheet was added to the document head after the all media stylesheet, so as to be last in the cascade. I&#8217;ll use a <code>link</code> element for this. For those mobiles that do understand CSS, using <code>link</code> is more reliable than using <code>@import</code> for bringing in styles, although some of the more capable devices understand <code>@import.</code> Here&#8217;s the link element:</p>
<pre><code>
<link href="mobile.css" rel="stylesheet" type="text/css" media="handheld"></code></pre>
<p>Media types are mutually exclusive. A user agent can only support one media type when rendering a document. If I want to retain any of my existing styles in a handheld display, I need to take one more step, and that is to list all the media types I want my existing styles to apply to in a comma separated list. I change the link element for my existing stylesheet, which is called 2col.css to include this media attribute: <code>media="handheld,all"</code>. The two link elements are now:</p>
<pre><code>
<link href="2col.css" rel="stylesheet" type="text/css" media="handheld,all">
<link href="mobile.css" rel="stylesheet" type="text/css" media="handheld"></code></pre>
<p>The  styles and the color scheme I have in 2col.css should also apply to handheld renderings, but  the two column layout will be removed by the mobile.css rules.</p>
<p>Testing with the Firefox Web Developer Toolbar menu CSS > View CSS by Media Type > Handheld should now show handheld media results, and it does. </p>
<p>The first screen capture shows the two column layout, as it normally displays with the all media stylesheet. The second shows Firefox using the handheld media view.</p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/FirefoxAll.jpg" alt="Firefox rendering the all media styles" width="400" height="300" /></p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/FirefoxHH.jpg" alt="Firefox renders handheld media " width="400" height="300" /></p>
<p>From the second screen capture, you can see that Firefox has expanded the content div to 95%, according to the mobile.css rules. If you scrolled down the page past the content div, you would find the sidebar div now displays at 90% width after the content div. Note in the second screen capture, that styles from 2col.css such as the presentation of the list under the  title image and the background gradient behind the headings are retained because of the handheld media designation in that stylesheet.</p>
<p>You may not  want to retain any of your all media styles in the handheld CSS rules, as in this example. Keeping the background images, for example, results in longer page load times. Since many wireless mobile devices load very slowly, you  want to really simplify things for handhelds. In that case, simply leave the handheld media attribute out of your main stylesheet.  I&#8217;ll give you more tips for simplifying things for handheld media shortly.</p>
<h3>Testing with subscription services or with software</h3>
<p>The testing tools I just mentioned are all free. There are other options that are not free, but you might find them helpful and worth the expense. <a href="http://www.browsercam.com/default.aspx">Browser Cam</a>, where you can test your sites in all sorts of browsers, has added a testing area called Device Cam. Here you can test a page in a smattering of Windows Mobile-based <abbr title="Personal Digital Assistant">PDA</abbr>s and several BlackBerry versions. Here&#8217;s a screen capture of the test page in a Device Cam rendering of a BlackBerry. Note the strong resemblance to what you saw previously in Opera&#8217;s small screen view when the CSS was toggled off.</p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/DeviceCam.jpg" alt="Device Cam capture of a BlackBerry test" width="277" height="403" /></p>
<p>A brand new option for owners  of Adobe&#8217;s latest  CS3 software is Adobe&#8217;s  Device Central. Device Central uses skins for dozens of mobile devices  to display your content in various ways. Here&#8217;s a rendering of the test page in a Nokia 7390 skin.</p>
<p><img src="http://www.thinkvitamin.com/misc/mobilefriendly/Device CentralNokia7390.jpg" alt="Device Central rendering with a Nokia skin" width="350" height="557" /></p>
<p>Device Central can load a live URL or a file from many of the Adobe CS3 applications. It responds to the presence of a stylesheet of the handheld media type when the page is rendered using Opera&#8217;s small screen view. Using the Opera small screen view is an option with each of the skins in Device Central. Deselecting the option to view the rendering with Opera&#8217;s small screen view in Device Central rendered this page as two columns, in spite of the presence of the handheld stylesheet rules meant to eliminate that.</p>
<h3>Tips for handheld CSS</h3>
<p>Handheld media stylesheets can be  more extensive than the two rule example I showed you previously. A few more rules would certainly benefit Web Teacher, but keep in mind that  handheld stylesheets should be as small and compact as possible because of download time. </p>
<p>What can you do  to simplify your site  and make it more usable in mobiles? First, eliminate some of these problematic items from mobile display.</p>
<ul>
<li>Eliminate floats and frames</li>
<li>Eliminate columns &#8211; one column with the content first is the best option</li>
<li>Eliminate scripted effects such as popups or pop out menus in favor of plain old HTML and simple text menus</li>
<li>Eliminate decorative images that slow down the loading process. Use <code>display:none</code> to remove <em>anything</em> that isn&#8217;t absolutely necessary, such as links to external resources. Remember, however, that devices that don&#8217;t understand CSS won&#8217;t do anything with <code>display: none</code>. Any essential images need to be reworked for the small screen and the width and height attributes need to be included in the HTML.</li>
<li>Eliminate nested tables and layout tables. If you have tabular data,  consider finding a way to present it in a linearized alternate display.</li>
</ul>
<p>Once you&#8217;ve simplified through elimination, start building the rules you need to add. Consider these ideas.</p>
<ul>
<li>If you&#8217;re not already using relative measures, switch to  ems or percentages rather than pixels </li>
<li>Reduce margins, paddings and borders to suit the small screen</li>
<li>Use smaller font sizes for headings and paragraph text</li>
<li>If you have a long navigation list at the start of the page, add a skip to main content link, or move  the links to the end of document flow. Keep the number of clicks required to get to content as minimal as humanly possible. Without a mouse or keyboard, most mobile users have to click laboriously through any top navigation.</li>
<li>Make sure your color combinations provide good contrast between foreground and background colors, particularly for devices with fewer color options.</li>
</ul>
<h3>Tips for  bloggers</h3>
<p>Some blogging software provides the opportunity to format a single blog posting with several different templates, one of which can be meant for mobile users. This specially formatted and simplified material is posted to a unique URL on your site, perhaps something like mobile.mysite.com. If you&#8217;re a blogger, check your software to see if you have this capability with your blog. One important consideration for the mobile users of your blog is to keep the number of blog postings per page to a minimum for faster downloads.</p>
<p>In summary, making your site mobile friendly can be boiled down to a few concepts. Use validated, standards-based HTML or XHTML, ensure meaningful semantic markup with presentation removed to a stylesheet, and add handheld media rules as needed.</p>
<p><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
<img src="http://thinkvitamin.com/?ak_action=api_record_view&id=139&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://thinkvitamin.com/mobile/make-your-site-mobile-friendly/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
