<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated on Sat, 11 Feb 2012 21:40:44 -0800 -->
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <atom:link href="http://software.intel.com/en-us/articles/mid/type/technical-article/feed/" rel="self" type="application/rss+xml" />
    <title>Intel Software Network articles Feed</title>
    <link>http://software.intel.com/en-us/articles/mid/type/technical-article/</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>How to build ffmpeg to run under Moblin 2</title>
      <description><![CDATA[ <div class="Section1">
<p class="MsoNormal"><span class="sectionBodyText"><br />The application ‘ffmpeg’ consist of three executables and 5 libraries. All the sources can be downloaded using the following svn command:</span></p>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal" ><span >Ø<span >      </span></span><span class="sectionBodyText">svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg </span></p>
<p class="MsoNormal"><span > </span><strong class="sectionHeading">Required patch</strong></p>
<p class="MsoNormal"><span class="sectionBodyText">One version which I tried ( download: svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg –r 17944)</span></p>
<p class="sectionBodyText">has a known problem with the sources. If you try to build the code, then you will get a compile time error:</p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">libswscale/swscale.c:488: error: ‘PIX_FMT_YUV420PLE’ undeclared</span></p>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal"><span class="sectionBodyText">The solution is solved by copying the contents of the libswscale directory from .</span><span ><span class="sectionBodyText">  </span> <a href="http://www.ffmpeg.org/releases/ffmpeg-0.5.tar.bz2" title="http://www.ffmpeg.org/releases/ffmpeg-0.5.tar.bz2" >http://www.ffmpeg.org/releases/ffmpeg-0.5.tar.bz2</a>    (see </span><span lang="EN" ><a href="http://www.ffmpeg.org/download.html" >http://www.ffmpeg.org/download.html</a>)</span></p>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal"><span class="sectionBodyText">Please Note, <b><i>only</i></b> the libswscale directory should be copied <b><i>over the top</i></b> of the existing files.</span></p>
<h3> </h3>
<h3><span class="sectionHeading" lang="FR">Build Instructions</span></h3>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal"><span class="sectionBodyText">Following instructions will help you build ffmpeg under a Linux system assuming that the tar ball from the download is copied to &lt;install_directory&gt;:<br /></span><br /> Ø      cd  &lt;install_directory&gt;<br /><br /> Ø      cd tar xvfz  ffmpeg.tar.gz   #Extract the tar ball to your local directory. You will find a directory tree under the name ffmpeg installed. All the required sources are installed within this tree provided that you are not enabling any additional third party libraries.<br /><br /> Ø      cd ffmpeg</p>
<p class="sectionBodyText"> Ø      ./configure –help &lt;cr&gt; # to show all the options available to rebuild ffmpeg. For a reference build with <b>gcc</b> there is no need to provide any parameters to configure. However if you would like to enable any third party libraries like ‘libfaad’, ‘libx264’ etc. then you need to add --enable-libfaad --enable-libx264 etc. as parameters to configure. If this is required make sure that you have these sources available on your development environment and that the third party libraries are rebuilt with the selected compiler / compiler options.</p>
<p class="sectionBodyText"> Ø      ./configure &lt;parameters as below&gt;</p>
<p class="MsoNormal"><span class="sectionBodyText"> </span>Ø      make &lt;cr&gt; #recommended sequence is ‘make clean’ followed by ‘make’. The rebuild will take several minutes (depending on your development environment). Two versions of each executable are produced: ex. ‘ffmpeg’ and ‘ffmpeg_g’. The ‘*_g’ contains the executable with debug information while the ‘*’ is the stripped version. In addition ‘ffplay, ffplay_g, ffserver and ffserver_g’ are produced as executables and libavutil, libavcodec, libavformat, libavdevice and libswscale are rebuilt.</p>
<p class="sectionHeadingText"> <b><span >Icc build</span></b>:</p>
<p class="MsoNormal"><span class="sectionBodyText">Depending on what version of icc you are using different configure parameters may be necessary.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">Using icc v10.1.xxx:</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span>Ø      ./configure cc=icc --extra-cflags=”-xL –O3” --extra-libs=-lsvml &lt;cr&gt; # Without linking in the extra library (libsvml.so) you get several references unresolved.</p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">Using icc v11.0.xxx:</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span>Ø      ./configure cc=icc –extra-cflags=”-xSSE3_ATOM –O3” –extra-libs=-lsvml &lt;cr&gt; #  The option –xSSE3_ATOM do require that you run the code on a processor which does support the ‘movbe’ instruction. If you would like to test the code on a processor not supporting the ‘movbe’ instruction you can add the option ‘-minstruction=nomovbe’ in the extra-cflag part of the command line above.<br />Ø      Make sure that the LD (linker) options do not contain ‘–march=generic’ in the config.mak file. This option causes an error from the compiler.<br /><span class="sectionBodyText"><br />Using icc v11.1.xxx:<br /></span><br />Ø      To avoid a run time erratum following source change is needed:   Open file ./libavcodec/x86/dsputil_mmx.c and on line #2944 insert // before || __ICC &gt; 1100. The line is highlighted below.</p>
<p class="MsoNormal" ><span ><v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke join></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape type="#_x0000_t75" id="_x0000_s1025" ><v:imagedata src="new_page_21_files/image001.png"><img height="151" width="576" src="http://software.intel.com/file/22666" /></v:imagedata></v:shape></span><br /><br />Ø      After the change it will look like: #if ARCH_X86_64 || ! ( __ICC) // || __ICC &gt; 1100</p>
<p class="MsoNormal" ><span class="sectionBodyText"></span></p>
<p class="sectionBodyText" >Ø      ./configure cc=icc –extra-cflags=”-xSSE3_ATOM –O3” &lt;cr&gt; # This simple configure does work but you get better performance if you also add the ‘--extra-lib=-lsvml’. Additional compiler switches can be used to improve the performance – for example ‘-no-prec-div’, ‘-vec-‘. As the no-prec-div has an effect on the fp calculations please refer to the compiler documentation before it is used. In addition the ‘-xSSE3_ATOM’ switch are no longer requiring a processor with ‘movbe’ support.</p>
<p class="sectionHeadingText"> Cross compilation.</p>
<p class="MsoNormal"><span class="sectionBodyText">It is standard practice to build the library and executables on a development machine and then copy the resultant files to the MOBLIN target.  You can use the option --enable–cross-compile in this case.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"></span></p>
<p class="MsoNormal" ><span class="sectionBodyText"></span></p>
<p class="MsoNormal"><span class="sectionBodyText">Once you have completed the configure stage you can just run the ‘make clean’ followed by ‘make’. You could expect additional warnings produced.</span></p>
<p class="MsoNormal"><span class="sectionHeading"></span></p>
<p class="MsoNormal"><b><span ><span class="sectionHeading">Building ffmpeg with third party libraries:</span></span></b></p>
<p class="MsoNormal"><b><span ><span class="sectionHeading"></span></span></b></p>
<p class="MsoNormal"><span class="sectionBodyText">The application can support 21 different external 3<sup>rd</sup> party libraries. Each of those are selected in the configure process by adding the option ‘--enable-&lt;library-name&gt;’. </span></p>
<p class="MsoNormal"><span class="sectionBodyText">Below is an example of using some of the different external libraries available:</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span>Ø      ./configure &lt;other options as above&gt; --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid<span class="sectionBodyText"> </span></p>
<p class="MsoNormal"><span class="sectionBodyText">The invocation above assumes that you will be using 6 external 3<sup>rd</sup> party libraries:</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libfaac       # for example you can download ‘faac-1.28.tar.gz’ or later version from the web.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libfaad       # for example you can download ‘faad2-2.7.tar.gz’ or later version from the web.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libmp3lame # for example you can download ‘lame-398-2.tar.gz’ or later version from the web.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libtheora    # for example you can download ‘libtheora-1.0.tar.tar’ or later version from the web. Please note that you can not use ICC v 10.1 to rebuild this library due to a compiler issue. This has been fixed with 11.1 version of the compiler.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libx264      # for example you can download ‘x264-snapshot-20090117-2245.tar.bz2’ or later version from the web.</span></p>
<p class="MsoNormal"><span class="sectionBodyText"> </span><span class="sectionBodyText">- libxvid      # for example you can download ‘xvidcore-1.2.1.tar.gz’ or later version from the web.<br /></span><span class="sectionBodyText"><br /><strong>Performance Notes:</strong> <br /><br />Best option combination for ICC: “-xSSE3_ATOM –O3 –vec- -static –no-prec-div –ansi_alias”. Also make sure you add –extra-libs=-lsvml in your configure invocation.<br /><br />Two ways of improving the performance of ffmpeg:<br /><br />1) Use the external 3rd party libraries which are supported – 20+ are available. They are optimized for their specific field. You need to select the suitable library – download the code and build them using the ICC. <br /><br />2) Use PGO. Here it is important to produce a set of .dyn files for the most common conversion you will be using. The code size improves a bit and the performance also gets a boost provided that you use any of the conversions for which you generated a .dyn file. If you select a totally different conversion you actually could get a slower performance compared to both gcc and icc (general optimized version). For those who are not familiar with the PGO optimization this is a three step procedure:<br /><br />a. Add the option –prof-gen to the extra-cflags section for the configure generation. Build ffmpeg. <br /><br />b. Run the resulting binary on your target. Make sure you use representative input files and output formats. You may want to repeat this process several times. For each run you will have a .dyn file generated on the target. Copy these files over to your development system.<br /><br />c. Now use the options –prof-use and –prof-dir &lt;directory path where you have the .dyn files which you copied in step b&gt; [make sure to remove –prof-gen option]. Generate a new make file with configure and build your ffmpeg. You may see a number of warnings ‘missing .dpi information for &lt;file name.’ This is information only and can be ignored. The finally generated ffmpeg should be both smaller and faster. <br /><br /><br />
<table cellpadding="5" cellspacing="0" rules="none" border="1">
<tbody>
<tr>
<th align="left" valign="middle" >Optimization Notice</th>
</tr>
<tr bgcolor="#ccecff">
<td>
<p>Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice.</p>
<p align="right">Notice revision #20110804</p>
</td>
</tr>
</tbody>
</table>
<br /><br /><br /><br /><br /></span></p>
</div> ]]></description>
      <link>http://software.intel.com/en-us/articles/how-to-build-ffmpeg-to-run-under-moblin-2/</link>
      <pubDate>Wed, 23 Sep 2009 00:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/how-to-build-ffmpeg-to-run-under-moblin-2/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/how-to-build-ffmpeg-to-run-under-moblin-2/</guid>
      <category>Mobility</category>
      <category>Open Source</category>
      <category>Tools</category>
      <category>Intel® AppUp(SM) Developer Community</category>
      <category>MID</category>
      <category>Intel® Software Development Tool Suites for Intel® Atom™ Processor Knowledge Base</category>
    </item>
    <item>
      <title>Gypsy: GPS Information Retrieval for Moblin 2.0 Linux</title>
      <description><![CDATA[ <div class="Section1">
<h1><span class="sectionBody"><strong>Update: Mar 29, 2011</strong> MeeGo (v1.1 released Oct 2010) is the successor of Moblin 2.0. MeeGo still uses GeoClue and Gypsy as Location Services for providing geolocation data. However, MeeGo has gained a robust set of APIs that utilize Qt. It is strongly encouraged that application developers code to the QtMobility Location APIs, which provide geolocation data. The Qt APIs are guaranteed to be a stable part of the MeeGo APIs, while the GeoClue/Gypsy APIs are not. However, the current implementation of the Qt Location APIs utilizes GeoClue/Gypsy for retrieving geolocation data on MeeGo devices. It may still be of interest to the reader to learn about how Gypsy works (article below), but LBS apps should code to the Qt Location APIs.<br /></span><br />Gypsy</h1>
<p>Gypsy has replaced gpsd as the GPS daemon for reporting location coordinates in Moblin 2.0. There are many reasons <a name="_ednref1" href="http://software.intel.com#_edn1">[1]</a> as to why Gypsy may be considered an improvement over gpsd. This article will briefly describe what you can do, as a developer, with Gypsy. A complete API<a name="_ednref2" href="http://software.intel.com#_edn2">[2]</a> and tutorial<a name="_ednref3" href="http://software.intel.com#_edn3"> [3]</a> are available at <a href="http://gypsy.freedesktop.org/">http://gypsy.freedesktop.org</a>.</p>
<h2>What can Gypsy do?</h2>
<p>Gypsy is a convenient way for getting location information from a GPS device. Multiple client applications can connect to Gypsy, and Gypsy can connect to one or more GPS devices<a name="_ednref4" href="http://software.intel.com#_edn4"> [4]</a>. Gypsy can interact with both Bluetooth and Serial (direct connection) devices, and will parse the device's cryptic data<a name="_ednref5" href="http://software.intel.com#_edn5"> [5]</a> into clearer, programmer friendly values<a name="_ednref6" href="http://software.intel.com#_edn6"> [6]</a>.</p>
<p>Developers interface directly with Gypsy by using its GLib API. Gypsy also has an open D-Bus API which can be controlled via Linux IPC (interprocess communication). This means that a location based application can be written in any language that supports<a name="_ednref7" href="http://software.intel.com#_edn7"> [7]</a> D-Bus communication, and can appropriately receive information from Gypsy.</p>
<h2>How Gypsy data is organized</h2>
<p>One difference between Gypsy and gpsd is in how Gypsy organizes its information, using Glib Objects to encapsulate different types of data<a name="_ednref8" href="http://software.intel.com#_edn8"> [8]</a>:</p>
<p><b>GypsyPosition:</b> holds position data (latitude, longitude, altitude)</p>
<p><b>GypsyCourse:</b> reports velocity information, in the form of speed, direction, and climb</p>
<p><b>GypsyAccuracy</b>: reports the estimated accuracy, also known as the Dilution of Precision (DOP) for position in the horizontal and vertical planes</p>
<p><b>GypsySatellite</b>: contains data from each visible satellite, including the satellite ID # (PRN), elevation, azimuth, and signal-to-noise ratio (SNR)</p>
<p>Each Object uses a method / signal architecture. For example, GypsyPosition has a method <i>gypsy_position_get_position</i>(...) that you can call at anytime to receive the current position. The other approach would be to use GypsyPosition's <span >“position-changed”</span> signal. You can register your own callback method, and instead of continually polling Gypsy for updates, your application will be signaled anytime the position changes.</p>
<h2><span ><span ><span ></span></span></span>Manually Locating and Launching Gypsy</h2>
<p class="MsoBodyText">The default installation path for <span >gypsy-daemon</span> is <span >/usr/libexec/gypsy-daemon</span>. If you're using the GLib API, you'll need to make sure that the gypsy daemon is running before you try and use it. An added benefit of using the D-Bus API is that <span >gypsy-daemon</span> will automatically launch (if it isn't running already) the first time you make a call to it.</p>
<p class="MsoBodyText">For debugging purposes, it might be useful to execute <span >gypsy-daemon</span> with a <span >“--no-daemon”</span> flag. This will keep the process inside the terminal and spit out debugging information.</p>
<h2><span ><span ><span ></span></span></span>Geoclue</h2>
<p class="MsoBodyText">Geoclue is a location service that is also included with Moblin 2.0. It uses multiple providers (like Gypsy, gpsd, Hostip, Geonames, etc...) to provide more than the Position/Velocity information given by Gypsy. It can also give Address information based upon your current location. Please see <a href="http://www.freedesktop.org/wiki/Software/GeoClue">http://www.freedesktop.org/wiki/Software/GeoClue</a> to find out more about Geoclue. If you liked this article, you might also read the author's article on Geoclue.</p>
<h2><span ><span ><span ></span></span></span>Building a new ecosystem</h2>
<p class="MsoBodyText">In a world where devices are becoming increasingly more mobile, location information is becoming a<span > </span>more integral part of a user's experience. Applications with location features are making it to a variety of different platforms, and are setting a new standard for mobile functionality. Look for Gypsy and Geoclue to carry this standard to Moblin 2.0-based netbooks, MIDs and smartphones.<a name="cite_ref-0"></a></p>
</div>
<div ><br clear="all" />
<hr width="33%" size="1" align="left" />
<div >
<p class="ListContents"><span ><span ></span>$&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>MRK,0&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>ZDA,123336.8069,17,06,2001,13.0&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>GLL,4916.45,N,12311.12,W,225444,A,*1D&lt;CR&gt;&lt;LF&gt;</span><a href="http://en.wikipedia.org/wiki/NMEA_0183#cite_note-0">[1]</a><span > <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>VTG,218.7,T,2.38,H,0.18,V&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>SGD,-1.0,G,-1.0,M&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>SYS,3T,9&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>ZEV,0.28745E-006&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,2,00,000,00,0.0,00.0,00,00,D&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,7,00,000,00,0.0,00.0,00,00,D&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,28,00,000,00,0.0,00.0,00,00,N&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,1,00,000,00,0.0,00.0,00,00,D&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,13,00,000,00,0.0,00.0,00,00,D&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,4,00,000,00,0.0,00.0,00,00,N&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,25,00,000,00,0.0,00.0,00,00,N&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,0,00,000,00,0.0,00.0,00,00,N&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,11,00,000,00,0.0,00.0,00,00,D&lt;CR&gt;&lt;LF&gt; <o:p></o:p></span></p>
<p class="ListContents"><span ><span ></span>NSV,0,00,000,00,0.0,00.0,00,00,N&lt;CR&gt;&lt;LF&gt;</span></p>
</div>
</div>
<br /><br />
<div >
<p class="MsoEndnoteText"><span ></span><span >method return sender=:1.26 -&gt; dest=:1.25 reply_serial=2<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>int32 0<span > </span>fields<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>int32 0<span > </span>timestamp<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>double 0<span > </span>latitude<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>double 0<span > </span>longitude<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>double 0<span > </span>altitude<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>struct {<span > </span><o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>int32 0<span > </span>accuracy level<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>double 0<span > </span>horizontal accuracy<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>double 0<span > </span>vertical accuracy<o:p></o:p></span></p>
<p class="MsoEndnoteText"><span ><span ></span>}<o:p></o:p></span></p>
</div>
<br /><br />
<div id="edn1" >
<p class="MsoEndnoteText"><a name="_edn1" href="http://software.intel.com#_ednref1" >[1]</a><span > </span>See <a href="http://gypsy.freedesktop.org/why-not-gpsd.html">“Why Should You Use Gypsy over GPSD”</a><i> <o:p></o:p></i></p>
</div>
<div id="edn2" >
<p class="MsoEndnoteText"><a name="_edn2" href="http://software.intel.com#_ednref2" >[2]</a><span > </span>See <a href="http://gypsy.freedesktop.org/reference/html/index.html">Gypsy Reference Manual</a></p>
</div>
<div id="edn3" >
<p class="MsoEndnoteText"><a name="_edn3" href="http://software.intel.com#_ednref3" >[3]</a><span > </span>See <a href="http://gypsy.freedesktop.org/gypsy-tutorial.html">Gypsy Tutorial</a></p>
</div>
<div id="edn4" >
<p class="MsoEndnoteText"><a name="_edn4" href="http://software.intel.com#_ednref4" >[4]</a><span > </span>See <a href="http://gypsy.freedesktop.org/reference/html/gypsy-design.html">Gypsy's Design</a></p>
</div>
<div id="edn5" >
<p class="MsoEndnoteText"><a name="_edn5" href="http://software.intel.com#_ednref5" >[5]</a><span > </span>Taken from Wikipedia: <a href="http://en.wikipedia.org/wiki/NMEA_0183">NMEA 0183</a><i><o:p></o:p></i></p>
<p class="MsoEndnoteText"><i><span ></span>Example NMEA 0183 Sentence Data:<o:p></o:p></i></p>
</div>
<div id="edn6" >
<p class="MsoEndnoteText"><a name="_edn6" href="http://software.intel.com#_ednref6" >[6]</a> <span ></span><i >Sample D-Bus Gypsy Position Data (connecting through Geoclue):</i></p>
<div id="edn7" >
<p class="MsoEndnoteText"><a name="_edn7" href="http://software.intel.com#_ednref7" >[7]</a><a href="http://www.freedesktop.org/wiki/Software/DBusBindings"><span > </span>DBusBindings</a> will list the different language bindings for D-Bus</p>
</div>
<div id="edn8" >
<p class="MsoEndnoteText"><a name="_edn8" href="http://software.intel.com#_ednref8" >[8]</a><span > </span>See <a href="http://gypsy.freedesktop.org/reference/html/index.html">Gypsy Reference Manual</a></p>
</div>
</div> ]]></description>
      <link>http://software.intel.com/en-us/articles/gypsy-gps-information-retrieval-for-moblin-20-linux/</link>
      <pubDate>Thu, 27 Aug 2009 21:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/gypsy-gps-information-retrieval-for-moblin-20-linux/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/gypsy-gps-information-retrieval-for-moblin-20-linux/</guid>
      <category>MID</category>
    </item>
    <item>
      <title>Geoclue: Location Information Retrieval for Moblin 2.0 Linux</title>
      <description><![CDATA[ <p><strong>Update: Mar 29, 2011</strong> MeeGo (v1.1 released Oct 2010) is the successor of Moblin 2.0. MeeGo still uses GeoClue as a Location Service for providing geolocation data. However, MeeGo has gained a robust set of APIs that utilize Qt. It is strongly encouraged that application developers code to the QtMobility Location APIs, which provide geolocation data. The Qt APIs are guaranteed to be a stable part of the MeeGo APIs, while the GeoClue APIs are not. However, the current implementation of the Qt Location APIs utilizes GeoClue for retrieving geolocation data on MeeGo devices. It may still be of interest to the reader to learn about how GeoClue works (article below), but LBS apps should code to the Qt Location APIs.<br /><strong>•          Geoclue</strong></p>
<p>Geoclue is a geoinformation service that will be included in Moblin 2.0. It uses multiple providers (like Gypsy, gpsd, Hostip, Geonames, etc...) to provide more than the Position/Velocity information given by most location-based APIs. For example, it can also give postal address information based upon your current location. With Geoclue, a GPS device isn't the only way to judge your current position. Providers are included that can estimate your position based on GSM (cell towers) and IP / Mac address.</p>
<p>This article will briefly describe what you can do, as a developer, with Geoclue. A complete API<a name="_ednref1" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_edn1">[i]</a> and tutorial<a name="_ednref2" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_edn2">[ii]</a> are available at <a href="http://www.freedesktop.org/wiki/Software/GeoClue">http://www.freedesktop.org/wiki/Software/GeoClue</a>.</p>
<p><b>•             <em>The Geoclue Master Provider</em></b></p>
<p>Selecting a provider to use in Geoclue normally requires some knowledge about the hardware that is being used. You would not be able to use the GPS providers (Gypsy and Gpsd) without a GPS device. Likewise, only a compatible phone can get its position using GSM by communicating with cell towers. You may also need to know something about your environment. Providers using Wi-Fi, GPS satellites, and Cell towers will only work as long as you can get a signal from their respective service. Additionally, there are providers that will only give Position information, and there are others that will only give Address information.</p>
<p>The Master Provider is an attempt to take away all of the complications of choosing the right provider. Just like any other provider, you may query for position and address information. The master will choose the best provider to provide what you are looking for. As the environment changes and a provider's signal goes weak, the master automatically switches to another provider and continues the flow of geoinformation.</p>
<p>The master can be controlled via a D-Bus or C API. As previously noted, a simple example (in C) of how to access the master provider is available at <a href="http://www.freedesktop.org/wiki/Software/GeoClue">http://www.freedesktop.org/wiki/Software/GeoClue</a>.</p>
<p><b>•             <em>Selecting your own provider</em></b></p>
<p>For more control, you may wish to select your own provider. Below is a table of the standard providers<a name="_ednref3" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_edn3">[iii]</a> that are included with Geoclue, along with the services that they provide.</p>
<p>
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr>
<td width="110" valign="top">
<p class="TableContents"><b>Provider</b></p>
</td>
<td width="205" valign="top">
<p class="TableContents"><b>Services</b></p>
</td>
<td width="350" valign="top">
<p class="TableContents"><b>Description</b></p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Hostip</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Position, Address</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A web service that guesses location based on the current IP address.</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Plazes</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Position, Address</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A web service that gets location based on your current router mac address. Interfaces with a user's Plazes account.</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Manual</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Address</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A user-specified address</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Localnet</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Address</p>
</td>
<td width="350" valign="top">
<p class="TableContents">User-specified address that maps to a router's mac address (home, office).</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Gsmloc</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Position</p>
</td>
<td width="350" valign="top">
<p class="TableContents">Gets cell ID data, and estimates location from a web service based upon that data</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Gypsy*</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Position, Velocity</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A GPS daemon that supports bluetooth and serial GPS devices</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">GPSd*</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Position, Velocity</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A GPS daemon that uses TCP sockets</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Yahoo</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Geocode</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A web service that converts an address to a position</p>
</td>
<td height="18"></td>
</tr>
<tr>
<td width="110" valign="top">
<p class="TableContents">Geonames</p>
</td>
<td width="205" valign="top">
<p class="TableContents">Geocode, ReverseGeocode</p>
</td>
<td width="350" valign="top">
<p class="TableContents">A web service that can convert an address to a position. Conversely, it can also find the nearest address to a given position.</p>
</td>
<td height="18"></td>
</tr>
</tbody>
</table>
</p>
<p>*Gypsy vs. Gpsd: As a note, the user should know that in Moblin 2.0, Gypsy is replacing gpsd as the default GPS daemon. See Gypsy's<a name="_ednref4" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_edn4">[iv]</a> site for an article<a name="_ednref5" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_edn5">[v]</a> that lists why Gypsy may be considered an improvement over gpsd.</p>
<p><b>•             <em>How Geoclue data is organized</em></b></p>
<p>Geoclue divides its geoinformation into Glib Objects to create a modular separation of different types of data. As viewed in the table above, only certain objects / services are available with each provider.</p>
<p><b>GeocluePosition</b>: holds position data (latitude, longitude, altitude)</p>
<p><b>GeoclueAddress</b>: returns a HashTable of address information (divided into "street", "postalcode", "area", "locality", "region", "country", etc...)</p>
<p><b>GeoclueVelocity</b>: reports velocity information, in the form of speed, direction, and climb</p>
<p><b>GeoclueGeocode</b>: converts an address to a position (latitude, longitude, altitude)</p>
<p><b>GeoclueReverseGeocode</b>: converts a position to an address</p>
<p><b>GeoclueAccuracy:</b> reports the horizontal and vertical accuracy levels. This can be applied to each of the previous services, except for <i>GeoclueVelocity</i></p>
<p>GeocluePosition, Address, and Velocity each use a method / signal architecture. For example, GeocluePosition has a method geoclue_position_get_position(...) that you can call at anytime to receive the current position. The other approach would be to use GeocluePosition's signal. You can create your own callback method that will  execute anytime a "position-changed" signal occurs. Instead of  continually polling Geoclue for updates, your application will be signaled anytime the position changes.</p>
<p><b>•             <em>Debugging Geoclue Providers</em></b></p>
<p>Each provider has its own daemon that runs when it is asked to. The default location for the Geoclue daemons is in the /usr/libexec directory. Running these daemons in separate terminals can be useful for debugging purposes, if you are having trouble connecting to a provider.</p>
<p><b>•             <em>Building a new ecosystem</em></b></p>
<p>In a world where devices are becoming increasingly more mobile, location information is becoming a  more integral part of a user's experience. Applications with location features are making it to a variety of different platforms, and are setting a new standard for mobile functionality. Look for Geoclue to help carry this standard to Moblin 2.0-based netbooks, MIDs and smartphones.</p>
<p> </p>
<p><br clear="all" /></p>
<hr width="33%" size="1" align="left" />
<p> </p>
<p><a name="_edn1" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_ednref1">[i]</a><a href="http://folks.o-hand.com/jku/geoclue-docs/rn01.html">     C API</a> and <a href="http://folks.o-hand.com/jku/geoclue-docs/rn02.html">D-Bus API</a></p>
<p><a name="_edn2" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_ednref2">[ii]</a><a href="http://folks.o-hand.com/jku/geoclue-docs/simple-example.html">    Using basic Geoclue Providers</a> tutorial</p>
<p>      <a href="http://folks.o-hand.com/jku/geoclue-docs/simple-master-example.html">Master Provider</a> tutorial</p>
<p><a name="_edn3" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_ednref3">[iii]</a><a href="http://www.freedesktop.org/wiki/Software/GeoClue/Providers">   Geoclue Providers listed</a></p>
<p><a name="_edn4" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_ednref4">[iv]</a><a href="http://gypsy.freedesktop.org/wiki/">   Gypsy - A GPS Daemon</a></p>
<p><a name="_edn5" href="http://software.intel.com/common/tiny_mce/plugins/paste/blank.htm#_ednref5">[v]</a><a href="http://gypsy.freedesktop.org/why-not-gpsd.html">    Why should you use Gypsy over GPSD</a></p> ]]></description>
      <link>http://software.intel.com/en-us/articles/geoclue-location-information-retrieval-for-moblin-20-linux/</link>
      <pubDate>Mon, 29 Jun 2009 21:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/geoclue-location-information-retrieval-for-moblin-20-linux/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/geoclue-location-information-retrieval-for-moblin-20-linux/</guid>
      <category>MID</category>
    </item>
    <item>
      <title>Building the Moblin Clutter Library with the Intel Compiler</title>
      <description><![CDATA[ <p><b>Building the Moblin Clutter Library with the Intel Compiler</b></p>
<p><b>Introduction</b></p>
<p><b>Build environment</b></p>
<p>The build instructions below are based on the assumption that the build environment is a Fedora10 installation. </p>
<p>A copy of the installation disks can be found here. <a href="http://fedoraproject.org/get-fedora">http://fedoraproject.org/get-fedora</a></p>
<p>It is important that the GCC tools are installed when the Fedora installation is installed.</p>
<p><b>Cross-development</b></p>
<p>The clutter libraries  and test environment  are first built on a Fedora installation, and then the resultant executables and libraries can then be copied over to a MOBLIN2 platform.</p>
<p><b>Virtualisation</b></p>
<p>The steps below can be undertaken on a virtual machine, the only restriction being that not all virtual machines support video acceleration  </p>
<p><b>The tests</b></p>
<p>There are a number of tests that can be used to benchmark the clutter library. The benchmark performance is measured by how many Frames Per Second (FPS) are achieved.<b><br clear="all" /></b></p>
<p><b>Building the Clutter Libraries</b></p>
<p><b>Downloading the sources</b></p>
<p>The sources for the clutter library can be obtained by using the following command.</p>
<p>In a development directory of your choosing download the sources</p>
<p>   git clone git://git.clutter-project.org/clutter</p>
<p>   git clone git://git.clutter-project.org/clutter-box2d</p>
<p>Progress for each download should be reported similar the following:</p>
<p> </p>
<p>$ git clone git://git.clutter-project.org/clutter<br /><br />Initialized empty Git repository in /home/intel/dv/clutter/clutter/.git/<br />remote: Counting objects: 25225, done.<br />remote: Compressing objects: 100% (10261/10261), done.<br />remote: Total 25225 (delta 20575), reused 18319 (delta 14944)<br />Receiving objects: 100% (25225/25225), 6.99 MiB | 104 KiB/s, done.<br />Resolving deltas: 100% (20575/20575), done.</p>
<p><b>Building the Sources</b></p>
<p>Directory structure should look similar to this:</p>
<p>             &lt;dev-dir&gt;/clutter/<br />            &lt;dev-dir&gt;/clutter-box2d</p>
<p> </p>
<p>In each of these sub directories build the libraries as follows:</p>
<p><b>Choosing which compiler </b></p>
<p><b>Building with GCC</b></p>
<p>For our installation, we'll use the environment variable  $PREFIX custom directory so as not to override any existing installation</p>
<p>     export PREFIX=/opt/custom/gcc<br />    ./autogen.sh --prefix=$PREFIX</p>
<p><b>Building with ICC</b></p>
<p>To build the library with the Intel compiler use the following commands</p>
<p>    export CC=icc<br />    export CXX=icc</p>
<p>   export PREFIX=/opt/custom/icc<br />  ./autogen.sh --prefix=$PREFIX</p>
<p><b>Continuing the build</b></p>
<p>When autogen has completed you should get a message similar to the display below </p>
<p>  <br />                                  Clutter    0.9.7<br />                         ====================<br />                                  prefix:   /opt/custom/gcc<br />                                Flavour:   glx/gl<br />                                 XInput:   no<br />                          GL headers:   GL/gl.h<br />                    Image backend:   gdk-pixbuf<br />                       Target library:   libclutter-glx-0.9.la<br />               Clutter debug level:   yes<br />                 COGL debug level:   minimum<br />                      Compiler flags:   -Wall -Wshadow -Wcast-align -Wno-uninitialized -Wno-strict-aliasing -Wempty-body -Wformat-security -Winit-self<br />        Build API documentation:   no<br />  Build manual documentation:   no<br />         Build introspection data:   auto</p>
<p>  </p>
<p>Now build the source by calling make</p>
<p>The progress of the make will be reported, the last few lines looking similar to this:</p>
<p>   Making all in tools<br />     CC    disable-npots.o<br />     LINK  libdisable-npots-static.la<br />     LINK  libdisable-npots.la <br />   Making all in po</p>
<p><b>Installing the new library</b></p>
<p>To install the new library call:</p>
<p>make install</p>
<p>Note, depending on the permissions of the installation directory (set with the $PREFIX variable in the previous steps) you may need to do this as root.</p>
<p> </p>
<p><b>Building the tests</b></p>
<p>The test directory has a number of tests. The README describes the tests as follows </p>
<p><i>"The conform/ tests should be non-interactive unit-tests that verify a single feature is behaving as documented. See conform/ADDING_NEW_TESTS for more details.</i></p>
<p><i> </i><i>The micro-bench/ tests should be focused performance test, ideally testing a single metric. Please never forget that these tests are synthetic and if you are using them then you understand what metric is being tested. They probably don't reflect any real world application loads and the intention is that you use these tests once you have already determined the crux of your problem and need focused feedback that your changes are indeed improving matters. There is no exit status requirements for these tests, but they should give clear feedback as to their performance. If the frame rate is the feedback metric, then the test should forcibly enable FPS debugging.</i></p>
<p><i> </i><i>The interactive/ tests are any tests who's  status can not be determined without a user looking at some visual output, or providing some manual input etc. This covers most of the original Clutter tests. Ideally some of these tests will be migrated into the conformance/ directory so they can be used in automated nightly tests."</i></p>
<p>To build the tests, from the top level of the test directory do: </p>
<p>    make</p>
<p>The build will report:</p>
<p>    Making all in data <br />    Making all in conform<br />    Making all in interactive<br />    Making all in micro-bench<br />    Making all in tools</p>
<p><b>Running the tests</b></p>
<p>Having built the tests, each test can be run from the command line.</p>
<p><b>Automatic running of  tests.</b></p>
<p>Many of the tests do not run to completion, but keep running,  The script in the appendix below gives an example of how the tests can be automatically called and killed after a predefined time.</p>
<b><br clear="all" /></b>
<p><b>Appendix 1 -  Script to drive test cases</b></p>
<p>#!/usr/bin/perl<br /># list of tests <b>TODO: EDIT THESE TO YOUR REQUIREMENTS<br /></b>@Tests=("test-actors", "test-behave", "test-clip","test-cogl-offscreen","test-cogl-primitives","test-cogl-tex-convert","test-cogl-tex-foreign","test-cogl-tex-getset","test-cogl-tex-polygontest","test-cogl-tex-tile","test-depth","test-layout","test-multistage","test-pixmap","test-project","test-random-text","test-rotate","test-scale","test-script","test-sharder","test-text","test-texture-quality","test-textures","test-threads","test-unproject","test-viewport");<br /><br />#@Tests=("test-actors", "test-behave");<br />@Results=();<br /><br /># for each test run it for 10 seconds<br />my $Timeout = 10;<br />## chdir interactive;<br />my $bStarted = 0;<br /><br />foreach my $Test (@Tests)<br />{<br />    # print "executing $Test\n ";<br />    eval {<br />        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required<br />        alarm $Timeout;<br />        # system("./$Test --clutter-show-fps &gt; res.$Test.txt");<br /><br />        # mark end of prev test<br />        push @Results, "END" if $bStarted;<br />        push @Results, "TEST:$Test\n-----------------------\n";<br />        $bStarted = 1;<br />        open (RUN,"./$Test --clutter-show-fps &amp;|");<br />        while(&lt;RUN&gt;)<br />        {<br />            push @Results, $_;<br />        }<br />        alarm 0;<br />    };<br />    if ($@) <br />    {<br />        die unless $@ eq "alarm\n"; # propagate unexpected errors<br />        # timed out<br />        system("killall -9 lt-test-interactive");<br />     }<br />}<br /># mark the end of the last test<br />push @Results, "END" if $bStarted;<br /><br /># process the results<br />my $NumTests = 0;<br />my $Total = 0;<br />my $Max = 0;<br />my $Min = 9999;<br />my $TestName="";<br /><br />print "\nName Min Max NumTests Average\n";<br />foreach my $Line (@Results)<br />{<br />    if($Line=~/^TEST:(.*)/)<br />    {<br />        # print "IN TEST $Line";<br />        $TestName= $1;<br />        chomp $TestName;<br />        $NumTests = 0;<br />        $Total = 0;<br />        $Max = 0;<br />        $Min = 9999;<br />    }<br /><br />    if($Line=~/END/)<br />    {<br />        # print "IN END :$Line";<br />        $Average = 0;<br />        $Average = $Total/$NumTests if $NumTests &gt; 0;<br />        print "$TestName $Min $Max $NumTests $Average\n";<br />    }<br /><br />    if($Line=~/\*\*\* FPS: (.*) \*\*\*/)<br />    {<br />        # print "IN FPS: $Line";<br />        $NumTests++;<br />        $Total = $Total + $1;<br />        $Max = $1 if $1 &gt; $Max;<br />        $Min = $1 if $1 &lt; $Min;<br />    }<br />}<br /><br />print "exiting ..\n";<br /> </p>
<p> </p>
<b><br clear="all" /></b>
<p><b> Appendix 2 - Essential notes on installing Fedora  </b></p>
<p>When installing Fedora you must install the Software Development tools.</p>
<p> </p>
<p> </p> ]]></description>
      <link>http://software.intel.com/en-us/articles/building-the-moblin-clutter-library-with-the-intel-compiler/</link>
      <pubDate>Sun, 14 Jun 2009 16:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/building-the-moblin-clutter-library-with-the-intel-compiler/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/building-the-moblin-clutter-library-with-the-intel-compiler/</guid>
      <category>Mobility</category>
      <category>Tools</category>
      <category>MID</category>
      <category>Intel® Compilers</category>
      <category>Intel® Software Development Tool Suites for Intel® Atom™ Processor Knowledge Base</category>
    </item>
    <item>
      <title>Developing for Mobile Internet Devices, Part 2: Designing, Coding and Testing a Twitter* Location-Based Application</title>
      <description><![CDATA[ By Paul Ferrill<br /><br />In<strong> </strong><a href="http://software.intel.com/en-us/articles/developing-for-mobile-internet-devices-part-1-tools-choices-and-development-environment-configuration/"><span ><strong>part 1</strong></span></a> of this series, I showed you what it takes to build applications for the Mobile Internet Device (MID) platform. I covered the basic issues of setting up a development workstation, choosing a programming language, and making good choices in terms of external libraries. I also discussed issues like device emulation, the importance of working through a prototype “hello world” application, and common problems to avoid.<br /><br />This installment gets down to the business at hand and walks through the process of designing and coding a working application. I chose a Twitter* application that will report the user’s current location as a way to exercise as many of the MID features as possible. Although it’s a simple application in terms of what it does, it has many of the parts you’d need to build any general-purpose user application.
<p class="sectionHeading"><br />Design Choices</p>
<p>Many of the functional parts of this application are foundational to everyday applications, requiring features such as user authentication, configuration storage and retrieval, network communications, and user interaction. It’s important to modularize the design as much as possible to both break the overall project down into manageable pieces and to make it easier to reuse the code.</p>
<p>The application checks each time it runs to see whether any user credential information has been entered. If not, it presents a typical user name/password login dialog box and stores the information in an encrypted local configuration file. A preferences dialog box makes it possible to change the user name and password after initial setup along with other program options.</p>
<p>For the initial release of this program, I assume that there is an active network connection. This is a bit of a stretch for the Compal JAX10* MID I tested on: It did not have an active 3G radio, so there was no “always-on” Internet connection. I was able to simulate having a consistent connection by using Wi-Fi, instead. Later versions might check for connectivity and, if currently disconnected, queue up the message to send the next time a connection to the Internet is available.</p>
<p>Another design consideration for the mobile form factor is deciding what happens when a button is pressed. With this particular application, there is a consequence for choosing single-key action; every time the user presses one of the action buttons, a message is sent to Twitter. If you assume the user won’t inadvertently press a button or do something like put the device in a back pocket with the application running, it shouldn’t be a problem. Alternatives might include adding a confirmation dialog box to each action (“Really send message?”), adding a button or a timer to lock the screen, or exiting the program by default after the message is sent.</p>
<p class="sectionHeading">Building a UI for the Small Screen</p>
<p>One of nice things about Python* is the abundance of libraries to do just about anything you need to do. The Compal* MID used for this project has a number of useful libraries installed as a part of the base operating system, and I chose to take advantage of them. The GTK+* user interface (UI) library contains a wealth of resources for building everything from a simple dialog box to a complex data-entry form. PyGTK is a wrapper around the GTK+ library and provides access to virtually every routine through standard Python objects.<br />Building a login dialog using PyGTK consists of creating a simple window with individual text boxes for username and password. You can find a good example and explanation of these techniques on the <a href="http://www.pygtk.org/pygtk2tutorial/sec-TextEntries.html">PyGTK tutorial page</a>. In the following code snippet the pass_input.set_visibility(False) line causes the password to be blanked by a dot symbol:</p>
<p> </p>
<pre name="code" class="cpp">def login(self):<br />        dialog = gtk.Dialog('Login', <br />                            self.window,<br />                            flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,<br />                            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,<br />                                     gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))<br />        dialog.set_default_response(gtk.RESPONSE_ACCEPT)<br />        <br />        userbox = gtk.HBox(False)<br />        <br />        user_label = gtk.Label('Username:')<br />        userbox.pack_start(user_label)<br />        <br />        user_input = gtk.Entry()<br />        user_input.set_activates_default(True)<br />        userbox.pack_start(user_input)<br />        <br />        dialog.vbox.pack_start(userbox)<br />    <br />        passbox = gtk.HBox(False)<br />        <br />        pass_label = gtk.Label('Password:')<br />        passbox.pack_start(pass_label)<br /><br />        pass_input = gtk.Entry()<br />        pass_input.set_activates_default(True)<br />        pass_input.set_visibility(False)<br />        passbox.pack_start(pass_input)<br />	  dialog.vbox.pack_start(passbox)<br /></pre>
Another chore for the small screen is creating a finger-friendly interface. For this application, that means buttons appropriately sized and spaced so that an adult‘s finger can easily press the button of choice. It is possible to code the button sizes specifically for the Compal screen size and resolution, but a more general approach would be to use the available system information to calculate the appropriate dimensions.
<p> </p>
<p>A second option with GTK+ is to create a table that fills the screen with a matrix of buttons that essentially takes up all the screen real estate. Although doing so might not be as visually appealing, it does accomplish the task of building a finger-friendly interface in which you can easily “click” the right button. It also provides a few more options for adding descriptive text to the button for the Twitter application. In Python, the matrix would look something like this:</p>
<p> </p>
<pre name="code" class="cpp">def create_table(self):<br />        self.table = gtk.Table(3,4,True) # Create a 3 row by 4 column table<br />        button1 = gtk.Button("Button 1") # Create a button named button1<br />        self.table.attach(button1,0,1,0,1) # put button 1 in location 0,1<br />        button2 = gtk.Button("Button 2")<br />        self.table.attach(button2,1,2,0,1)	<br />        button3 = gtk.Button("Button 3")<br />        self.table.attach(button3,1,2,0,1)<br />.<br />.<br />.	<br />        button12 = gtk.Button("Button 12")<br />        self.table.attach(button12,1,2,0,1)<br /></pre>
<p> </p>
<p>The lines with a single period are meant to indicate that the sequence repeats down to the final definition of button12.</p>
<p class="sectionHeading">Coding Practices</p>
<p>Python is a language that allows you to write code by the brute-force method, as in the lines above, or in a more elegant way using concepts like iteration. If you were to define all 12 buttons in a linear fashion, you would need 26 lines of code. Using the Python for construct, you can accomplish the same task in a mere seven lines of code. That equates to less than one-third of the code for this simple example, but the difference would be substantial for a larger table. Here’s the code in a more “Pythonic” way:</p>
<pre name="code" class="cpp">    def create_table(self):<br />        self.table = gtk.Table(3,4,True)<br />        for row in range(3):<br />            for col in range(4):<br />            	name = 'Twitter %i' % (row*4 + col + 1)<br />            	button = gtk.Button(name)<br />            	self.table.attach(button, col, col+1, row, row+1)<br /></pre>
<br />
<p>Keeping your code manageable is important when scripts start to get large. Python functions are a good way to break down your code into small, manageable pieces. It’s also important to point out that everything in Python is an object. You can see this to some extent in the create_table function through the use of the self construct. The function create_table creates a gtk.Table and returns it as an object—hence, the use of self to refer to the object being created. There is an abundance of resources on the Web if you’re not familiar with object-oriented programming concepts.</p>
<p>Taking advantage of all the built-in language features and functions is another way to keep your source code manageable. Python has a module for reading and writing configuration files named ConfigParser. This module provides all the tools you need to save and read program configuration information. It supports different sections and creates a file of name–value pairs within each section. There are even individual methods to retrieve specific types, such as getboolean, getint, and getfloat.</p>
<p>If you can’t find what you need in the Python standard library, chances are that someone else has already written what you need. A quick Google* search typically returns multiple choices for a specific tool. Python-Twitter is a good example of a helper library to accomplish the heavy lifting of sending messages to the Twitter service. It’s hosted on Google Code* and even comes with several sample applications.</p>
<strong>Testing and Debugging</strong>
<p>You can test code on the Compal MID in several ways. File transfer over a USB port is drop-dead simple and works well.  Optionally, you could attach a USB keyboard to the Compal MID and use the VI editor directly on the device for your editing and the Python interpreter for testing. This method works okay for small proof-of-concept efforts but gets out of control for anything but small, simple programs. Another, similar approach is to use Virtual Network Computing* (VNC) to remotely view the screen on the device through your workstation.</p>
<p>Another way is to use the emulator approach.  The Moblin* project has a tool called the Moblin Image Creator* (MIC) for building platform-specific images. With MIC you can also use the Xephyr* emulator tool to launch an independent session for testing purposes. This method has the advantage of a rapid build / test cycle to help work the bugs out of your code in short order.</p>
<p>A final way might be to test the initial version of the software on your Linux* desktop.  The advantage is that you don’t need MIC.  The disadvantages are that you may need additional hardware for your desktop (GPS, for example) and that you can’t test MID specific functionality (such as screen characteristics).</p>
<p class="sectionHeading">Lessons Learned</p>
<p>Don’t get bogged down in the details too early in the process. It’s important to completely flesh out your requirements in the beginning, then make some design decisions based on a clear picture of what you’re trying to accomplish. Get comfortable with your development tools—especially the debugging portion—as you’ll probably use them more than you think.</p>
<p>The easier it is for you to test and debug your code, the quicker you’ll get it running.</p>
<p>Have a convenient way to transfer files to your device that doesn’t require a lot of motion. This could be as simple as keeping an easily accessible USB cable plugged into your workstation. When you get down to squashing bugs, it helps to make the process as smooth and painless as possible, especially if you’re editing all the code on a workstation and have to move it over to the device for testing.</p>
<p class="sectionHeading">Summary</p>
<p>Building a solid application for the MID platform requires the same set of disciplined steps you would use in any software project. Be sure you don’t skip steps like these:</p>
<ul>
<li>Take your time on the design process, and consider alternatives.</li>
<li>Think through the UI design from a user’s perspective before you start coding.</li>
<li>Write your code with testing in mind.</li>
<li>Have a clear set of requirements that you can test.</li>
<li>Use tools such as source code control, and check in your code frequently.</li>
</ul>
<br />
<p class="sectionHeading">About Author</p>
<p>Paul Ferrill has been writing in the computer trade press for more than 20 years. He got his start writing networking reviews for PC Magazine on products like LANtastic and early versions of Novell Netware. Paul holds both BSEE and MSEE degrees and has written software for more computer platforms and architectures than he can remember.</p>
<br /><span class="sectionHeading"><br />Link to Part 1 of this series</span><br /><br /><a href="http://software.intel.com/en-us/articles/developing-for-mobile-internet-devices-part-1-tools-choices-and-development-environment-configuration/"><span ><strong>Tools, Choices, and Development Environment Configuration</strong></span></a>.<br /><br /> ]]></description>
      <link>http://software.intel.com/en-us/articles/developing-for-mobile-internet-devices-part-2-designing-coding-and-testing-a-twitter-location-based-application/</link>
      <pubDate>Tue, 19 May 2009 00:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/developing-for-mobile-internet-devices-part-2-designing-coding-and-testing-a-twitter-location-based-application/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/developing-for-mobile-internet-devices-part-2-designing-coding-and-testing-a-twitter-location-based-application/</guid>
      <category>Mobility</category>
      <category>Intel® AppUp(SM) Developer Community</category>
      <category>MID</category>
    </item>
    <item>
      <title>An Edge By Design for MID Applications</title>
      <description><![CDATA[ <em>Design research and design-driven best practices can help your application development get an edge.<br /><br />By Knut Graf.  Knut is a Principal Designer at <a href="http://www.frogdesign.com/" target="_blank">frog design</a>, a global innovation firm. <br /></em><br /><span class="sectionHeading">Abstract<br /></span><br />The Mobile Internet Device (MID) platform has to establish a following of users and a set of high quality applications, which presents a kind of chicken and egg challenge. The lack of a track record to refer to, along with other factors that are common to emerging platforms, makes application development on MIDs challenging. Yet, high-quality applications are critical to the platform's success. Design, as expertise and as a set of practices, can address many of the risk factors that characterize this situation.<br /><br />Design ensures that the product vision is relevant to the user by gathering knowledge about the user and the application's usage environment through informal discovery activities and through formal research. Based on the knowledge gained in this discovery phase, a crisp feature definition lays the groundwork for a great user experience, which is built out through a compelling look and feel. A prototype confirms the product vision amongst team members and guides implementation and testing, thereby reducing the need for lengthy and tedious traditional requirements documentation.<br /><br />The guidance and streamlining that design brings to an application development process allows the core development team members to devote proper amounts of attention to technical challenges and quality, greatly improving the odds that the project will be completed and successful.<br /><br /><span class="sectionHeading">Introduction</span><br /><br />The software industry has established a track record over the last few decades of slowly making its development practices more efficient and effective. Even so, software projects are still burdened with high failure risks. The quality of projects that make it to market is hard to predict. For example, in consumer-facing applications, for every well-rounded product, there is another one full of bugs and quirks. Properly introducing "design" into a software project is one way to increase its odds of success.<br /><br />Many processes and best practices address risk and quality concerns in software projects. In practice however, such practices compete with established habits and the temptation to take shortcuts.<br /><br />Design has a variety of effects. Approached naively, design can raise expectations and then confuse and complicate the actual process, inundating unprepared developers with distractions and implicit requirements. On the other hand, a proper approach to harnessing design for software development can ensure that the end product is both relevant and beautiful. Along the way, the collaborative aspects of design process can align stakeholder's expectations and even save development time by using prototypes to communicate project goals.<br /><br />Design - whether it be "Interaction Design," "User Interface Design," or "Experience Design" - is not retrofitting a screen with pretty graphics. Applying design to an existing project provides limited value. Design in software development is much more valuable when applied as a way to discover, refine, and execute proper success criteria.<br /><br /><span class="sectionHeading">Addressing the MID Form Factor</span><br /><br />The Mobile Internet Device, or MID, is a low-power mobile device with many of the capabilities of a full PC. It employs a small, high-resolution touch screen and a reduced keypad. The MID platform provides unique new usage opportunities and advantages that translate into an exciting new market opportunity. MIDs offers new capabilities in terms of computing power, display quality, touch-input quality, and connectivity, along with a high amount of energy invested in the software tools. <br /><br />The way the platform's promise translates into value to the end user is through the software running on it. Software turns abstract capabilities into user-facing features. Software applications will decide the fate of the platform: Compelling usefulness will give mobile internet devices a place in our everyday lives, bringing success to the platform. Falling short, MIDs will join our Palm* Pilots in the gadgets drawer, awaiting their fate at the next garage sale.<br /><br />The platform's promise does not guarantee success. MIDs faces some specific challenges in terms of application development - challenges that design can help address.<br /><br /><strong>Thinking Small<br /></strong><br />With or without all the power delivered by a MID, the small device form factor limits the gamut of interactions that people will want to engage in. Comparing the same task on a small device and a large device, the small device requires more dexterity and concentration from the user. Simplifying tasks for small devices means challenging the user's habits and expectations.<br /><br /><strong>Lean Teams<br /></strong><br />The limited out-of-the-gate user base constrains the economically sensible investment to be made. Development teams will be lean and schedules will be short, even as the application development community is still familiarizing itself with the MID development environment.<br /><br /><strong>Porting</strong><br /><br />Many projects are ported from existing implementations on other platforms. Considerable updates to such projects are often required to allow them to take full advantage of the specific conditions offered by MIDs.<br /><br /><strong>Device Definition</strong><br /><br />Smart phones, with ever-growing capabilities, and the booming netbook contest the space for the MID platform. Acceptance for MIDs depends on unique value which neither of these other device classes can offer.<br /><br /><span class="sectionHeading">Establishing a Target Design</span><br /><br />In software application development, challenges are not unusual. Any software development project, regardless of the platform, comes with challenges. The way to mitigate the risk associated with these challenges is to decide upon a focused, valuable target, and to stay on this target. <br /><br />At the heart of a software application is the basic idea, "does it do something useful?" For the application to be successful, the answer must be "yes." A software project starts with existing ideas for specific features, or with general goals. These existing goals are formalized, to arrive at an implementable specification. During this process of formalization, the goals are examined, refined and adjusted.<br /><br />The first step towards the feature definition is learning who the end user is, what the end user likes, and what the end user does.<br /><br />A certain amount of general knowledge about users can be derived from the MID platform goals as a whole, as well as from interpreting the usage opportunities offered by target devices appearing on the market. Beyond this common sense approach, design provides a set of tools to get a clear picture of the end user and of the opportunities for application usage afforded to the user.<br /><br /><strong>User Personas</strong><br /><br />A user persona provides a description of an imaginary, but specific person who would use the application. A user persona is meant to be realistic and robust. A user persona describes the habits, preferences and environment of the target character, to provide a framework from which the character would make judgments and decisions. The user persona is a conceptual simulator for the practical value of new features.<br /><br /><strong>Idealized Personas<br /></strong><br />The practical use of an application is not the only question to consider. An application can be an enabler to the user, providing functionality that is socially attractive and desirable, regardless of its usefulness in a traditional sense. <em>Idealized personas</em> provide a handle on defining this type of functionality. Idealized personas are traditionally used in the discipline of marketing, not in the more "down to earth" context of usability. Actual people aspire to the attributes the idealized persona embodies. The idealized persona is more sophisticated then a real person, bound by fewer constraints. Some stereotypes might be used to define this persona. The idealized persona provides a sounding board for empowering, uncommon feature possibilities.<br /><br /><strong>Scenarios</strong><br /><br />A scenario describes a situation, and a sequence of events, in which the device and the software application running on it are used. The scenario is meant to be realistic, to provide a background to judge the value of the planned application and its features. The more detailed the scenario is, the more it can serve as a source and validation point for specific ideas.<br /><br />Other, less standardized forms of documentation can be used as a basis for feature definition. The assumptions and conclusions in any feature documentation can be tested and strengthened by personas and scenarios as verification points.<br /><br />Personas and scenarios are speculative in nature: they are based on assumptions. To add a grounding in realism to these assets, we recommend that design research activities be performed. <br /><br /><strong>Mining Reality for Knowledge: Research</strong><br /><br />Design research mines real life for project-relevant information. Common methods include surveys, user interviews, and contextual inquiry, in which the researcher engages with a user one-on-one to observe activities. Ranging from simple to very involved, the value of the research results grows with the depth of user-engagement. <br /><br />Design research requires preparation time and careful analysis of data. The schedule impact must be weighed against the benefits to the project. Consider that often the benefit is a drastic reduction of risk. <br /><br />For applications that provide narrow specialized feature sets for vertical markets, the value of research is fairly obvious: it provides knowledge of the problem domain to the team. For common applications with mass-market, mainstream functionality, the value proposition is more subtle: while the team is familiar with the domain, the deeper examination can provide insights into key differentiators that escape the naked eye.<br /><br /><strong>Generating the Design<br /></strong><br />Equipped with a picture of a target user, and solid knowledge of the real-world context, designers unearth feature opportunities for the application. Some opportunities will be obvious from looking at a scenario. Interpreting research data and applying abductive reasoning to the problem space knowledge uncovers further opportunities.<br /><br />Designers define features by mapping the opportunities and constraints to an actual software structure. To arrive at valid results, design principles are applied to guide this exercise. In absence of specific native design principles for MID devices, proven design principles from other small platforms can be used.<br /><br />The actual feature definition is expressed as a vision of the resulting program, and this is done in the form of diagrams, wireframes, and visual mock-ups. Abstract features are given a concrete expression. This documentation provides a moment of truth for project stakeholders. It serves as the first concrete shared picture of "the design" and a glance at the project outcome. As the project continues, collaborative discussions will adjust this picture. <br /><br />The design addresses core features first, and then it takes on secondary features such as peripheral details. One after another, parts of the application get addressed, designed, documented, designed and adjusted.<br /><br /><span class="sectionHeading">Design Principles for Mobile Platforms<br /></span><br />For relevance to the MID form factor, Table 1 lists a set of design principles that are relevant and apply to mobile platforms.<br /><br />
<table class="tableformat1" border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td valign="top">Mobile Platforms Design Principal</td>
<td valign="top">Description</td>
</tr>
<tr>
<td valign="top"><strong>Immediate Results</strong></td>
<td valign="top">Small, mobile devices offer themselves to be used spontaneously, whenever opportunity beckons. Such an opportunity for using the device, especially when occurring in a mobile situation, may not last long, as other things compete for the user's attention. To ensure a successful user experience, the application accessed by the user must waste no time in providing results. The tasks offered by the application must be straightforward, leading to immediate results. Long sessions that require continuous user attention are better suited for a full-size PC.<br /><br />The home screen application of the HP* Mini 1000 MI (Mobile Internet) Edition netbook is an example for focus on immediate results. The HP MI Edition is the Linux* version of this product. Its home screen accumulates recent e-mail, web shortcuts and thumbnails for favorite music and photos. The traditional "launch and dig" sequence to get to content is eliminated. In contrast to this approach, most other netbooks just offer collections of program icons on their home screen.</td>
</tr>
<tr>
<td valign="top"><strong>Adequate Feature Density</strong></td>
<td valign="top">Besides being short, the path to results must also be obvious. Few users will tolerate forced way-finding exercises. Given the constrained screen real-estate, this principle is applied by carefully designing decision trees to present clear decision points, and by limiting the amount of inputs asked of the user. Full-size PC applications have more leeway for less-clear structure. Feature density is an important consideration especially when porting existing full-size applications to a MID.</td>
</tr>
<tr>
<td valign="top"><strong>Adequate Information Density</strong></td>
<td valign="top">While the small, high-resolution screen is a brilliant display, it is still, and foremost, simply small. The number of concurrently displayed content items should be more limited, to avoid intolerably microscopic text and graphics</td>
</tr>
<tr>
<td valign="top"><strong>Flow</strong></td>
<td valign="top">Since not every interaction can be reduced to a few buttons on a few screens, the user will inevitably spend time completing non-trivial tasks. Those tasks may be necessary sequences, such as forms that must be filled, or voluntary sequences, such as meandering through a media library. In either case, the immersion that is achieved by presenting a steady stream of simple choices, creates a level of comfort. The immersion must not be interrupted trivially by modal alerts or dead-end flows. This is a general design principle, but on a small form factor platform, the temptation to present such interruptions is higher then on full-size PC applications, because fewer opportunities are available to communicate secondary information in more subtle ways.</td>
</tr>
<tr>
<td valign="top"><strong>Interruptability</strong></td>
<td valign="top">It is a common full-size PC experience ritual to launch an application, and then to open a document, or to perform some other initiation procedure, before getting to the actual task at hand, and to save and quit the application when done. On a MID device, where application state management is not on the user's mind, and usage session durations are short, this ritual gets in the way. Dealing with any sort of sequential task becomes more feasible, even attractive, once it is possible to effortlessly "Pick up where you left off".</td>
</tr>
<tr>
<td valign="top"><strong>Progressive Disclosure</strong></td>
<td valign="top">Progressive disclosure, the hiding of secondary information on secondary screens, is a well-known, valuable design principle. Applied to a MID, it can be read slightly differently: high density of information, as encountered in an existing PC application, can be preserved, behind lower-density summary screens, when the application is ported to a MID. Such summary screens, presented as the initial entry points of an application, provide the right small-device scale and satisfy many scenarios. More traditional, higher-density screens underneath, can provide unexpected horsepower for full-featured PC functionality. Handled with care, progressive disclosure is a valuable principle for porting existing applications to MIDs.</td>
</tr>
</tbody>
</table>
<br /><strong>Table1: Design Principals for Mobile Platforms</strong><br /><br /><span class="sectionHeading">Look and Feel<br /></span><br />Expressing features as parts of a software application is not a mechanical procedure. It’s a subjective process, in which the designer makes personal decisions. As a result, the application gains a unique personality. This personality is expressed in the “look and feel,” which has a great impact on shaping the user experience. The user experience — literally the string of moments the user lives through while interacting with the product — determines the user's memory and judgment about the device.<br /><br />Look and feel ensures usability through design patterns that string user-facing objects together in ways that make sense. These patterns are reused across the application, providing comfort and predictability.<br /><br />Look and feel is concerned with the details of the experience: the central moments when the user pays detailed attention, and those less important moments that lie in between and help string the important ones together. All these moments benefit from the beauty of well-executed emphasis and guidance, through visual means like composition, contrasts and harmonies on a pixel level.<br /><br />The user’s experience of an application is shaped over time, as the application changes state during use, bringing up one screen after another, or updating the content that is shown on the screen. This temporal aspect of the experience is part of look and feel too. It can be shaped to provide a good flow, actively help the user with tracking the application’s state, through meaningful transitions.<br /><br />Iconic examples of strong, experience-shaping look and feel are the “Fluent” interface of Microsoft* Office 2007, or the category-defining appearance of the Adobe* Lightroom application. Such strong statements can be controversial at first, as they force users to jettison old habits. But they usually establish a following and invite imitations.<br /><br /><strong>Implementation Complexity as a Concern<br /></strong><br />While working on the ‘look and feel’, the designer must be aware of the implementation platform, and its constraints and opportunities as they relate to the user interface. For MIDs, Hildon* is the primary choice platform, and it has some very specific characteristics. It cannot be emphasized enough that the design must be implementable on the given platform, by the developers tasked with the job, in the timeframe available.<br /><br />To avoid surprises, it is essential that the actual development team members who are responsible for the UI execution provide their perspective to the designer during the look and feel work. A professional designer is prepared to listen.<br />With a design team on board, there usually is a temptation to go for a totally custom UI, to maximize usability, beauty, flow, and branding. These are noble intentions, but must be checked against the realities of schedule- and resource constraints. A simpler look and feel that is actually executable might be a better way to go. After all, the measure of success is the real product that makes it to market.<br /><br />To ensure that the project is on track, the design must be truly understood by all stakeholders. A particular asset can communicate the design much better then any combination of diagrams, wireframes and specification documents: the prototype.<br /><br /><span class="sectionHeading">Expressing Living Features: A Prototype</span><br /><br />As the regular implementation preparation proceeds, a design team can provide a valuable contribution typical project constituents can’t — a prototype. A developer, sometimes called a design technologist, puts the prototype together. This prototype shows core moments and aspects of the application. The ideas shown are those of the project team as a whole, as captured from the stakeholders. The design team shapes these ideas, infusing them with a user-facing structure that eventually evolves into a coherent look and feel. The main value of a prototype is its ability to play out concurrent changes from multiple separate angles of the project. Valuable time can be saved this way, and the project team can cover a lot of ground in the process. <br /><br />The prototype is an antidote to analysis paralysis. Application structure, functionality, and look and feel come together as a unit and are refined together. The in-progress result is visible to the entire team, serving as a validation point. The aspect of validation can be taken further, by presenting the prototype to users, who provide both usability feedback and emotional responses, without the need for preparation of additional test assets.<br /><br />The prototype neither has to be perfect nor complete, as long as it provides meaningful insights. Bugs and dead ends are allowed and expected, so the developer can focus on relevant details.<br /><br />As the prototype is built out, it takes on the role of a living specification, replacing much of the traditional specification documentation that otherwise must be written and maintained. Traditional specifications still play a supporting role, filling in detail for areas that the prototype doesn’t cover. The application developers refer directly to the prototype as a reference for the implementation. The QA team can do the same, informing a traditional QA process by referencing the prototype, bringing efficiencies to the testing process.<br /><br /><span class="sectionHeading">To Do This, Do You Need a Designer?<br /></span><br />The answer to the above question is, “it depends.” Do you have enough knowledge of your problem space to perform a well-grounded feature definition? Do you have the time to take care of the details for a good follow-through? Will your stakeholders take care of this for you?<br /><br /><strong>Common Sense…</strong><br /><br />It is evident that not every good piece of software is produced with the involvement of a dedicated designer or design team. Much useful work, in terms of crisp feature definition and high execution quality, can be done by “simply” assuming a design perspective.<br /><br />This reliance on common sense thrives when a self-motivated developer is driving the work and making her own decisions, within a manageable scope of work. But the efficiency of this approach does drop off, experience suggests, as the complexity of the challenge grows and more stakeholders come to the table. This is not at all a matter of malevolence by any stakeholder: all parties do want the best outcome. It is more a matter of entropy: as more perspectives and opinions come into play, more forces are at work. In such a situation, any perspective that is not formally represented will not be heard. Ask yourself: who is representing the end user?<br /><br /><strong>…And Addressing Complexity</strong><br /><br />As project size increases, the complexity of the design-addressable challenges also grows, quickly reaching a point where common sense falls short. Here, the benefits of a professional perspective become obvious. Just as the development team should not be handling accounting on the side, it is not in a position to be handling design. The design team’s role is not meant to weaken other project contributors design ideas. On the contrary, the design team synthesizes everyone’s contributions, amplifying the good ones. This synthesis is essential when many different perspectives need to be heard. On large projects without formal design participation, design will go wrong.<br /><br />Engaging a design team can bring otherwise unattainable results to a software project: a unique execution, with an outstanding look and feel. This can turn out to be the single, critical differentiator in the marketplace. <br /><br /><span class="sectionHeading">Change the Odds</span><br /><br />Full-size desktops and laptops have long given up their position as the only form factors for personal computing. After small form factors had been pioneered by the PDA, the mobile phone matured to provide ad-hoc information access and media consumption. The laptop as sole choice for mobile content creation and productivity has made room for the netbook, its smaller, less powerful sibling. Each of these form factors thrives on useful, attractive software. That’s evident when you consider the variety of software being used on near-identical hardware. <br /><br />The MID form factor is in a position to be the next step in this march of personal computing to ubiquity. New form factors start as an underdog. To fuel their possible success, great applications first have to be created, under developmental conditions that are more challenging than those on established platforms. As the software industry comes to terms with the platform, design can make a contribution to the quality of individual software experience offerings, which is what counts most at the current moment in the lifecycle of the platform.<br /><br /><span class="sectionHeading">About the Author</span><br /><br />Knut Graf is a Principal Designer at <a href="http://www.frogdesign.com/" target="_blank">frog design</a>, a global innovation firm. Frog Design* works with the world’s leading companies, helping them create and bring to market meaningful products, services, and experiences. Knut joined frog in 1997 and has since served as Developer, as Content Architect and as Senior Design Analyst before assuming the role of Principal Designer. Knut has worked with clients such as SAP*, Microsoft*, and HP*. His recent work includes contributing to the well-received HP Mini 1000 MI edition user interface as a design lead on the project.<br /><br />Knut's work focuses on software user interfaces, from idea development to implementation. He guides software designs through the time- and resource constraints that real-world software projects bring, ensuring that the user experience of the end product is of the highest quality possible.<br /><br />In his work, Knut brings a programmer’s view of software development to a German design education background, to create innovative solutions that empower both the end user and the development team that has to meet shipping deadlines. In Knut’s opinion, design work must be judged by the quality of the end product. It is the actual result that matters, not the unrealized potential. ]]></description>
      <link>http://software.intel.com/en-us/articles/an-edge-by-design-for-mid-applications/</link>
      <pubDate>Thu, 30 Apr 2009 00:00:00 -0700</pubDate>
      <comments>http://software.intel.com/en-us/articles/an-edge-by-design-for-mid-applications/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/en-us/articles/an-edge-by-design-for-mid-applications/</guid>
      <category>Mobility</category>
      <category>Intel® AppUp(SM) Developer Community</category>
      <category>MID</category>
    </item>
  </channel></rss>
