<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/"
     version="2.0">

    <channel>

        <title>Ian Lawrence - Blog</title>
        <link>http://ianlawrence.info/random-stuff</link>
        <description>What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines. </description>
        <language>en-us</language>
        <generator>Plone 2.0</generator>

        
            
                  <item>
                      <title>Work in Manaus</title>
                      <link>http://ianlawrence.info/random-stuff/work-in-manaus</link>
                      <description>INdT is looking for high skilled professionals to be part of the Development Team. </description>
                      <author>vern</author>
                      <pubDate>Mon, 30 Jun 2008 11:21:59 -0500</pubDate>
                      
     
        <category>Developer</category>
     
     
        <category>INdT</category>
     
     
        <category>Job</category>
     
      <content:encoded>
        <![CDATA[
<p>INdT need to hire professionals <strong>passionate by mobile</strong>, <strong>internet</strong> and <strong>technology</strong>, with excellent team work spirit.</p>
<p><strong>Resumés</strong> shall be sent to the e-mail: rh_seleciona 'at' indt.org, with “<strong>DesLinux</strong>” in the subject field.</p>
<p class="callout">*DO NOT* send me CV's. <br /></p>
<p>If you want information about what it is like working in Manaus or what to expect if you are selected (from a foreigners perspective) I will help with that, no problem.</p>
<p><img class="image-inline" src="../images/linux-indt" alt="Linux INdT" /><br /></p>
<p><b>Linux Developer</b></p>
<p><strong>Academic Background:</strong><br />
Bachelor in Computer Science<br />
Computer Engineering or<br />
Data Processing</p>
<p><b>Language skills:</b><br />
Intermediate English.</p>
<p><b>Solid knowledge in:</b><br />
- GNU/Linux (Use and development)<br />
- C/C++<br />
- Python</p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Code Swarm</title>
                      <link>http://ianlawrence.info/random-stuff/code-swarm</link>
                      <description>"I like the fireworks and explosions around a developers name when a commit lands in an open source project... then the explosions soon after when the other branches merge with trunk."</description>
                      <author>vern</author>
                      <pubDate>Wed, 25 Jun 2008 13:49:00 -0500</pubDate>
                      
     
        <category>Art</category>
     
     
        <category>Communities</category>
     
     
        <category>Organic</category>
     
     
        <category>Repository</category>
     
     
        <category>Video</category>
     
      <content:encoded>
        <![CDATA[<p>I got totally into <a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/">visualizing commit histories</a> during the holidays of the Festa of São João in the North East of Brazil</p>
<p> I chose a cool free software project I am involved with and watched it evolving organically over time.</p>
<p>Here is the code swarm for the <a href="http://test.kernel.org/autotest">Autotest project</a>. Autotest is a test framework written in python which I have started using to do some testing on mobile devices.</p>
It starts off with just one or two developers 'mbligh' and 'apw' and over time the role of the central node is taken over by others notably 'showard', who wrote the Django frontend.<br /> 
These patterns are also observed in other key open source projects like python and <a href="http://oebfare.com/blog/2008/jun/24/django-code_swarm/">django</a> where developers cluster around a central developer or team of developers whose quality attracts other developers and so the ball starts rolling
<p></p>. It also shows the qualities needed in a lead developer i.e the ability to love your creation so much that you can let it go.
<object width="425" height="350"> <param name="movie" value="http://www.youtube.com/v/1mIxShcq3Cc"> </param> <embed src="http://www.youtube.com/v/1mIxShcq3Cc" type="application/x-shockwave-flash" width="425" height="350"> </embed> </object>
<br />
The fireworks on the project are really starting to pick up as we reach the explosions of the last month. Its one project to watch, that is for sure. :)<br />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Adding your application and its icon to the Ubuntu Mobile Desktop</title>
                      <link>http://ianlawrence.info/random-stuff/adding-your-application-and-its-icon-to-the-ubuntu-mobile-desktop</link>
                      <description>The final step for your new mobile application</description>
                      <author>vern</author>
                      <pubDate>Mon, 09 Jun 2008 07:44:36 -0500</pubDate>
                      
     
        <category>Desktop</category>
     
     
        <category>Documentation</category>
     
     
        <category>Mobile</category>
     
     
        <category>Mobile Guide</category>
     
     
        <category>Ubuntu Mobile</category>
     
      <content:encoded>
        <![CDATA[
<p>This information also appears on the <a href="https://help.ubuntu.com/community/UMEGuide">Ubuntu Mobile Guide</a></p>
Assuming you have a fairly recent drop of UME, new applications should:
<br /><br />
<ol><li>install a .desktop file into /usr/share/applications</li><li>        
install an icon into /usr/share/icons/hicolor/&lt;size&gt;/&lt;type&gt; (e.g. /usr/share/icons/hicolor/64x64/apps/myapp.png)</li></ol>
<br />

If 1 is done correctly, the app should show up in the UI.  <br /><br />
If 1 and 2 are done, it will also have the right icon :)<br /><br />
<h3>OnlyShowIn</h3>
The  <a href="http://standards.freedesktop.org/">freedesktop.org</a> has a standard<br />
<pre>OnlyShowIn</pre>
for the application to appear in certain environments.<br /><br />So you can also add
<pre>OnlyShowIn=GNOME;Mobile;</pre>
<p></p>
<p>to the desktop file and the icon will appear on the desktop.</p>
<p class="discreet">Also something to note:</p>
<br />
For example, <a href="https://code.edge.launchpad.net/~ubuntu-mobile/cheese/ubuntu">cheese</a> does not have
<pre>OnlyShowIn</pre>
but it appears in <a href="http://live.gnome.org/Hildon">hildon desktop</a>...others also do not have
<pre>OnlyShowIn</pre>
and do not appear..it seems that there is some special <br />implementation for ubuntu mobile which is seen in the gconf keys:
<br />
<pre>/desktop/hildon/htmlhomeplugin/onlyshowin_filter</pre>
<p>Check</p>
<pre>OnlyShowIn</pre>
value in .desktop.  If
<pre>_False_</pre>
then every .desktop is shown and
<pre>/onlyshowin_ignore</pre>
<p>Always show these apps, even if they don't have</p>
<pre>OnlyShowIn</pre>
Cheese is in this list hence it is always shown
<p></p>
<p>Apparently this key should go away when *every* application is a good citizen and complies to the freedesktop.org standards.
<br /></p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Working in Recife</title>
                      <link>http://ianlawrence.info/random-stuff/working-in-recife</link>
                      <description>Swapping the river for the sea.</description>
                      <author>vern</author>
                      <pubDate>Tue, 03 Jun 2008 12:31:26 -0500</pubDate>
                      
     
        <category>Canola</category>
     
     
        <category>INdT</category>
     
     
        <category>Life</category>
     
     
        <category>Maragogi</category>
     
     
        <category>Recife</category>
     
      <content:encoded>
        <![CDATA[
<p>I am here with the rest of the guys from Manaus at INdT <br /></p>
<p>doing some crazily cool stuff with Canola and well, forging</p>
<p>ideas basically.</p>
<p>It is incredibly cool here if you are a nerd but its not <br /></p>
<p><br /></p>
<p> <br />
<img class="image-inline" src="../../images/work-in-recife/image_preview" alt="Work in Recife" /> <br /></p>
<p>all work, right. Some of us <br /></p>
<p><img class="image-inline" src="../images/beach-turma/image_preview" alt="Beach Turma" /><br /></p>
<p>took off to Maragogi in the next state called Alagoas.</p>
<p>We ended up going diving</p>
<p><img class="image-left" src="../images/diving" alt="Diving" /><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>which was incredible as we saw so many fish</p>
<p><img class="image-inline" src="../images/fish/image_preview" alt="Fish" /><br /></p>
<p>and very relaxing. A perfect weekend to recharge the</p>
<p>batteries ready for the next coding sprint.</p>
I love Brazil!<br />
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>River Trails</title>
                      <link>http://ianlawrence.info/random-stuff/river-trails</link>
                      <description>This adventure is released under an open source license. To roll your own you will need:

1. A GPS
2. A 770 Hacker Edition 
3. A boat and a river
4. Good friends (and a good liver)

Alternatively of course you can contact one of the guys at the end and they will roll a customized one just for you.
</description>
                      <author>vern</author>
                      <pubDate>Mon, 07 Apr 2008 12:22:23 -0500</pubDate>
                      
     
        <category>Amazon</category>
     
     
        <category>GPS</category>
     
     
        <category>Geo</category>
     
     
        <category>Hacking</category>
     
      <content:encoded>
        <![CDATA[
<p>After the <a href="django-bluetooth-and-gps-on-ubuntu-mobile">GPS enabled web application</a>I created seemed to work in theory it arrived the time to test it in practice. <br /></p>
<p>I decided to GPS mark all of the floating bars along the</p>
<p>
<img src="../../downloads/debian/gps/taruma.jpg" /> <br />Tarumã Açu (which is the first 'tributary' after leaving Manaus).</p>
<p>This is probably not so useful really as floating bars, well, float around the river basically but it is like most enjoyable things in life: good while it lasts.</p>
<p>I rounded up the usual suspects<br /><img src="../../downloads/debian/gps/job_well_done.jpg" /></p>
<p>prepared the technology<br /><img src="../../downloads/debian/gps/770_brahma.jpg" /><br /></p>
<p>and off we set in Clives' amazing GPS</p>
<p>
<img src="../../downloads/debian/gps/gps.jpg" /></p>
<p> enabled boat, plotting bars<br /><img src="../../downloads/debian/gps/boat.jpg" /></p>
<p> <img src="../../downloads/debian/gps/bar.jpg" /><br /></p>
<p>as we went.<br /></p>
We had an encounter along the way with a huge peacock bass<br /> <img src="../../downloads/debian/gps/peacock_bass.jpg" /><br />which are great sport fish and fight like ninja's when you hook one.<br />Memories are unfortunately somewhat hazy after this so here are the waypoints in <a href="../../downloads/debian/gps//waypoints.txt">text </a>and <a href="../../downloads/debian/gps/taruma_waypoints.gdb">gdb</a> formats.<br /><br /><a href="http://maguirenet.com/">Maguires Guesthouse </a>and <a href="http://amazontrekkers.com/">Amazon Trekkers </a>if you are up for it <br /><br />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Django,Bluetooth and GPS on Ubuntu Mobile</title>
                      <link>http://ianlawrence.info/random-stuff/django-bluetooth-and-gps-on-ubuntu-mobile</link>
                      <description>How to create a GPS enabled web application for a Mobile Internet Device</description>
                      <author>vern</author>
                      <pubDate>Sun, 16 Mar 2008 13:22:03 -0500</pubDate>
                      
     
        <category>Bluetooth</category>
     
     
        <category>Django</category>
     
     
        <category>GPS</category>
     
     
        <category>Geo</category>
     
     
        <category>Intel</category>
     
     
        <category>Internet</category>
     
     
        <category>Mobile</category>
     
     
        <category>Python</category>
     
     
        <category>Ubuntu Mobile</category>
     
      <content:encoded>
        <![CDATA[
<p>This article also appears on the community <a href="https://help.ubuntu.com/community/UMEGuide/ApplicationDevelopment/GPSEnabledWebApplication">UME Guide</a><br /></p>
<h3>Background</h3>
<p>
Traditionally gps was provided on debian like systems using gpsd (apt-get install gpsd). There are however some problems using gpsd on resource constrained environments most noteably that gpsd is designed to be run at system start, and stopped when the system is shutdown (or a USB/bluetooth hotplug device started when that device is plugged in or removed). 
Therefore if a client is started before gpsd is running (for example a gps applet is started before the BT device is connected), then the only way for it to know about gpsd is for it to attempt to connect to the gpsd socket and keep trying every so often until it succeeds. This makes gpsd client programs very busy, always having to wake up to check to see if it can connect and on a system that runs on batteries having processes that can't sleep very often is a bad thing which drains away the battery. Also there is a problem with the granularity of the info that gpsd provides, as running clients get notified about everything, even if they don't care about it. GPS emits a new fix on every <a href="http://en.wikipedia.org/wiki/NMEA_0183">NMEA </a>sentence received, which for most gps devices is about 5 a second and each time the clients are all woken up even if they don't care about the data that has changed.</p>
<p>
gpsd has no way for clients to say that they are only interested in position data, or only in whether the device has a fix or not. Even if the gps unit is stationary, satellite data is constantly changing, and the clients will be woken up on every message.
Because of these problems <a href="http://blogs.gnome.org/iain/2007/11/12/like-whores-dancing-for-their-trinkets/">Iain Holmes</a> at <a href="http://o-hand.com/">o-hand</a> wrote <a href="http://folks.o-hand.com/iain/gypsy/">gypsy</a>. This is a gps multiplexing daemon which gives finer control of gps info and allows programs to call the following objects:</p>
<ul>
  <li> GypsyPosition - for getting location information</li>
  <li> GypsyCourse - for getting course information</li>
  <li> GypsyAccuracy - for getting accuracy information</li>
  <li> GypsySatellite - for getting satellite information</li></ul>
The code to interact with the gypsy daemon <a href="http://burtonini.com/bzr/gypsy-status/gypsy.py">(gypsy.py)</a> and to show its status <a href="http://burtonini.com/bzr/gypsy-status/status.py">(status.py)</a> which I 'pimped' for the Django application was written by <a href="http://burtonini.com/">Ross Burton</a> and is released LGPL and GPL respectively.<br /><br /><br />
<h3>Implementation</h3>
<p>
Set up a <a href="http://www.intel.com/technology/systems/lpia/">LPIA</a> (Low Power Intel Architecture) <a href="../mobile-linux-image-creation-made-easy">image</a> on Ubuntu Hardy.  I chose a menlow-lpia platform.Then create a <a href="../set-up-django-apache-and-postgresql-on-ubuntu-feisty/">Django project</a> called 'locate' (or something more original), however do not set up apache or postgresql. Both these applications are not suitable for an embedded device. This application will use the cherrypy standalone server (started when the system boots) and SQLite.</p>
Edit settings.py so that it looks like:
<pre>DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.<br />DATABASE_NAME = os.path.join(os.path.dirname(__file__), 'data', 'locate.db')             # Or path to database file if using sqlite3.<br />DATABASE_USER = ''             # Not used with sqlite3.<br />DATABASE_PASSWORD = ''         # Not used with sqlite3.<br /></pre>
The
<pre>DATABASE_NAME = os.path.join(os.path.dirname(__file__), 'data', 'locate.db')</pre>
is a trick which enables the SQLite filesystem database to be stored in the project inside the folder called data. This is an advantage when using revision control systems such as subversion. A similar trick works for the site media...create a folder called media in the project root and then in settings.py put:
<pre>import os,sys<br />path = os.path.dirname(sys.argv[0])<br />full_path = os.path.abspath(os.path.join(path, '../media'))</pre>
Then set a STATIC_ROOT variable equal to full_path
<pre>STATIC_ROOT = full_path</pre>
Finally, in urls.py import the django settings like
<pre>from django.conf import settings</pre>
and set the static.serve to
<pre> (r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True}),<br /></pre>
Also create a folder in the project root called server and inside this folder check out a copy of the standalone server:
<pre>wget http://svn.cherrypy.org/trunk/cherrypy/wsgiserver/__init__.py -O wsgiserver.py<br /></pre>
and create a file called run.py with this in it:
<pre>import wsgiserver<br />#This can be from cherrypy import wsgiserver if you're not running it standalone.<br />import os<br />import django.core.handlers.wsgi<br /><br />if __name__ == "__main__":<br />    os.environ['DJANGO_SETTINGS_MODULE'] = 'locate.settings'<br />    server = wsgiserver.CherryPyWSGIServer(<br />        ('127.0.0.1', 8000),<br />        django.core.handlers.wsgi.WSGIHandler(),<br />        server_name='Lowkate',<br />        numthreads = 20,<br />    )<br />    try:<br />        server.start()<br />    except KeyboardInterrupt:<br />        server.stop()</pre>
The locate project should be running when the device desktop comes up so we need to start the server.Edit
<pre>/usr/bin/ume-xephyr-start</pre>
and add:
<pre>echo "Starting Locate"<br />export PYTHONPATH="/home/ume/Web/django_projects/locate/:$PYTHONPATH"<br />export PYTHONPATH="/home/ume/Web/django_projects/:$PYTHONPATH"<br />export DJANGO_SETTINGS_MODULE=locate.settings<br />python /home/ume/Web/django_projects/locate/server/run.py&amp;</pre>
the command
<pre>python /home/ume/Web/django_projects/locate/server/run.py&amp;</pre>
executes the python file run.py and starts the server as a background process which allows other processes (e.g. the Xephyr UI) to continue executing.
The locate project should now look like:
<pre>root@ian-laptop:/home/ian/Dev/Ume/menlow-lpia/targets/target1/fs/home/ume/Web/django_projects/locate# ls <br />data media server __init__.py  manage.py  settings.py  urls.py</pre>
which is a completely self-contained project environment  

<br /><br />
<h3>Test the Gypsy to GPS Connection</h3>
<br />Install inside the target the <a href="../../downloads/debian/gypsy-lpia/gypsy_0.5-1_lpia.deb">gypsy lpia deb</a> and <a href="../../downloads/debian/gypsy-lpia/libgypsy0_0.5-1_lpia.deb">library</a> . 

The bluetooth GPS device I used was the <a href="http://www.nokiahowto.com/link?cid=EDITORIAL_184774">Nokia Wireless GPS Module LD-3W</a> and to communicate with it we need to find out its address. Make sure bluetooth is enabled
<pre>sudo apt-get install bluetooth bluez-utils  bluez-gnome gnome-bluetooth libbluetooth2 libbtctl4 libgnomebt0 nautilus-sendto</pre>
and run:
<pre>ian@lawrence:~$ hcitool scan<br />Scanning ...	<br />00:19:B7:8C:A7:F7 IansPhone<br />00:02:76:C5:58:B2 Nokia LD-3W<br /><br /></pre>
<p>This returns the address of the GPS device - 00:02:76:C5:58:B2 There is a nice GUI for this <a href="http://blueman.tuxfamily.org/">here</a><br /></p>
<p>Add this address into gypsy.py</p>
<pre>59    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)<br />60<br />61    gps = GPS("00:02:76:C5:58:B2")<br />62    gps.Start()</pre>
and then inside a target terminal:<br />
<pre>export DISPLAY=:2<br />python status.py</pre>
The status of the GPS is displayed along with a small map of the user location pulled from a mapping API <img src="../../downloads/debian/gypsy-status/gypsy.png" /><br /><br />
<h3>D-BUS and HTTP Requests</h3>
<p>It is not possible to query DBUS without starting some sort of a loop - such as the call to</p>
<pre>DBusGMainLoop</pre>
in status.py. This will not happen in a web application and so some alternative solution is necessary.
<p></p>
<a href="http://www.xmlrpc.com/">XML-RPC</a> Requests are a way of: <br /><br />"allowing software running on disparate operating systems, running in different environments to make procedure calls over the Internet.
It's remote procedure calling using HTTP as the transport and XML as the encoding."
<br /><br />Django has an XML-RPC server already available thanks to the work of <a href="http://grahambinns.com/blog/categories/django/">Graham Binns </a> and Brendan Adams so <a href="http://code.google.com/p/django-xmlrpc/">install this</a> and then make a method in settings.py like:
<pre>XMLRPC_METHODS = (<br />    # List methods to be exposed in the form (, ,)<br />    ('locate.django_xmlrpc.views.handle_xmlrpc', 'handle_xmlrpc',),<br />    ('locate.django_xmlrpc.views.handle_gypsy', 'handle_gypsy',),<br />)<br /></pre>
and in django_xmlrc/views.py create a method signature like:
<pre>@xmlrpc_func(returns='string', args=['string', 'int', 'int', 'int',])<br />def handle_gypsy(timestamp, latitude, longitude, altitude):<br />    """Take the values we need from the the gypsy XML object and store them in a database (or file system) """<br />    data = Raw(time=timestamp, lat=latitude, long=longitude, alt=altitude)<br />    data.save()<br />    # This returns the values passed in (useful for debugging)<br />    return "The timestamp is %s, the latitude is %i, the longitude is %i, and the altitude is %i." % (timestamp, latitude, longitude, altitude)</pre>
The XML-RPC client needs to pass the GPS XML object to "handle_gypsy" as shown here<br /><br /><img src="../../downloads/debian/gypsy-status/xml.png" /><br />(also create a models.py to store the data)

<br />In gypsy.py add
<pre> 2 import xmlrpclib<br /></pre>
and
<pre> 63     gps.Start()<br /> 64 <br /> 65     server = xmlrpclib.ServerProxy('http://127.0.0.1:8000/xmlrpc/')<br /> 66 <br /> 67     def position_changed(fields, timestamp, latitude, longitude, altitude):<br /> 68         server.handle_gypsy(timestamp, latitude, longitude, altitude)<br /></pre>
which passes the GPS data into our Django web application.

All that remains to do is query our database for the last GPS position. Create an application called geoapp
with a views.py like
<pre>  1 # Create your views here.<br />  2       <br />  3 from django.http import HttpResponse<br />  4 from locate.django_xmlrpc.models import Raw<br />  5 from django.shortcuts import render_to_response<br />  6      <br />  7     <br />  8 <br />  9 def get_position(request):<br /> 10      latest_GPS = Raw.objects.all().order_by('-id')[:1]<br /> 11 <br /> 12      return render_to_response('location_list.html', {'latest_GPS': latest_GPS})<br /> 13</pre>
and a template of
<pre>{% if latest_GPS %}<br />   {% for co in latest_GPS %}  <br />     I am located at &lt;a href="http://geohash.org/?q={{co.lat}},{{co.long}}"&gt;this&lt;/a&gt; URL.<br />   {% endfor %}<br />{% else %}<br />    No coordinates<br />{% endif %}</pre>
This uses geohash.org which is a latitude/longitude geocode system invented by Gustavo Niemeyer when writing the web service at geohash.org, and put into the public domain.<br />It offers short URLs to uniquely identify positions on the Earth, so that referencing them in emails, forums, and websites is more convenient.<br /><br />Here is <a href="http://geohash.org/6xmq3gxthq55">where I was</a> when writing this article<br /><br />.
<img src="../../downloads/debian/gypsy-status/geohash.png" /><br /><br />Here is 
<a href="../../downloads/debian/gypsy-status/locate.tar.gz">the complete application</a>

<br /><br />There are many things to work on in this application. A nice maemo user applet instead of hacking the gypsy code to pass the XML would be one significant improvement as would some limit on the amount of data being passed into the database. <br />Also this 'blue sky' idea below seems interesting!<br /><br />
<h3>Further Research and Ideas</h3>
Interaction with the onboard camera. <br />For example, user takes photo of an unknown object (like a building or landmark) and return good results about it from a search API 
   <br /><a href="http://petitinvention.wordpress.com/2008/02/10/future-of-internet-search-mobile-version/">The Future of Internet Search Mobile Version</a>

   <br /><br />How To Do This: 
   <br />We know the user location and now we need the software to work out what an object is ....we need to capture gstreamer output from camera and pass it to 
   <a href="http://www.artoolworks.com/community/osgart/">augmented reality software</a> for visual object extraction and then overlay API search info back onto the image<br /><br /><br />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Mobile RSS feed reader updated</title>
                      <link>http://ianlawrence.info/random-stuff/mobile-rss-feed-reader-updated</link>
                      <description>The latest  version is now available for download</description>
                      <author>vern</author>
                      <pubDate>Sat, 09 Feb 2008 15:36:56 -0600</pubDate>
                      
     
        <category>C</category>
     
     
        <category>Communities</category>
     
     
        <category>Frothing</category>
     
     
        <category>Liferea</category>
     
     
        <category>Mobile</category>
     
     
        <category>Packaging</category>
     
      <content:encoded>
        <![CDATA[I had a few days during Carnaval holidays to <br />update <a href="http://code.google.com/p/frothing/">Frothing </a>to the latest and greatest <br />version (1.4.10) of Liferea. <br />There are a bunch of new translations added as <br />well as many bug fixes so this is a recommended <br />upgrade.<br /><br />This work was made easy because of a dpatch I <br />received from <a href="http://behindmotu.wordpress.com/2007/09/10/steve-kowalik/">Steve Kowalik.</a> Thanks to this I got <br />to party a bit too..so big props going his way. <br /><b><br /></b>
<p class="callout"><b>Free software development rocks.</b></p>
<br />The tarball is available from:<br /><br /><a href="http://code.google.com/p/frothing/downloads/list">http://code.google.com/p/frothing/downloads/list</a><br /><br />If you already have a device running ubuntu <br />mobile you can get a deb from the Launchpad <br />PPA. Add this line to your sources.list<br /><br />
<pre>deb http://ppa.launchpad.net/ubuntu-mobile/ubuntu hardy main</pre>
<br />and do an:<br /> <br />
<pre>apt-get update<br />apt-get install liferea</pre>
<br />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Using Autotest for Mobile testing</title>
                      <link>http://ianlawrence.info/random-stuff/using-autotest-for-mobile-testing</link>
                      <description>Autotest lets you manage jobs, client hosts and look at test results. 
Here is one way to set it up on Ubuntu Gutsy. Later on some mobile tests will be added
</description>
                      <author>vern</author>
                      <pubDate>Wed, 16 Jan 2008 12:19:07 -0600</pubDate>
                      
     
        <category>Mobile</category>
     
     
        <category>Testing</category>
     
      <content:encoded>
        <![CDATA[
<pre>root@ian-laptop:/usr/local# svn checkout http://test.kernel.org/svn/autotest/trunk autotest<br />Checked out revision 1111.</pre>
<br />

Look at what was checked out:
<pre>root@ian-laptop:/usr/local# cd autotest/<br />root@ian-laptop:/usr/local/autotest# ls<br />client        conmux  Documentation  mirror  results    server      tko<br />CODING_STYLE  DCO     LICENSE        queue   scheduler  server.old  ui<br /></pre>
<br />

Install the database:
<pre>root@ian-laptop:/usr/local/autotest# apt-get install mysql-server-5.0 python-mysqldb python-gd gnuplot<br />(on ubuntu this will prompt for a root password for mysql)</pre>
<br />

Now log into the main database as root:
<pre>$ mysql -u root -p<br /><br />mysql&gt; create database tko;<br />mysql&gt; grant all privileges on tko.* TO 'autotest_tko'@'localhost' identified by 'a_password';<br />(change a_password if required)<br />mysql&gt; grant SELECT on tko.* TO 'nobody'@'localhost';<br />mysql&gt; grant SELECT on tko.* TO 'nobody'@'%';<br />mysql&gt; quit</pre>
<br />

Now move into the tko directory:
<pre>ian@ian-laptop:/usr/local/autotest$ cd tko/<br /></pre>
Create the database schema inside the "tko" database:<br />
<pre>$ mysql -u autotest_tko -pa_password tko &lt; create_db</pre>
Autotest uses two accounts to access the database - a priviledged account that's read/write and an unpriviledged one that's read/only. For parse to
work,  you need to tell it how to log in - create a .priv_login file <br />
<pre>root@ian-laptop:/usr/local/autotest/tko$ vi .priv_login<br /></pre>
<br />
with two lines:
<br />
<pre>autotest_tko<br />a_password<br /></pre>
<br />

<b>NOW CHMOD THIS FILE SO ONLY YOU CAN READ IT!</b><br />
<pre>root@ian-laptop:/usr/local/autotest/tko$ chmod 600 .priv_login</pre>
<br />

Next run some tests (the command below runs all tests so it takes some time) so we can put some results in the database<br />
<pre>ian@ian-laptop:/usr/local/autotest/tko$ cd ..<br />root@ian-laptop:/usr/local/autotest# client/bin/autotest client/samples/all_tests <br /></pre>
<br />

parse the results into the database:<br />
<pre>root@ian-laptop:/usr/local/autotest/tko# ./parse /usr/local/autotest/client/results/default<br /></pre>
<br />

this gave an error of:<br />
<pre>/usr/local/autotest/tko/parse.py:113: DeprecationWarning: raising a string exception is deprecated<br />  raise "Could not figure out machine name"<br />Traceback (most recent call last):<br />  File "./parse", line 153, in <br />    do_parse(jobname, path)<br />  File "./parse", line 103, in do_parse<br />    job = parse.job(path)<br />  File "/usr/local/autotest/tko/parse.py", line 91, in __init__<br />    self.get_machine()<br />  File "/usr/local/autotest/tko/parse.py", line 113, in get_machine<br />    raise "Could not figure out machine name"<br />Could not figure out machine name</pre>
<br />

On ubuntu I needed to add this on line 114 of parse.py:<br />
<pre># for ubuntu machines<br /> try:<br />     if os.path.isfile("/etc/hostname"):<br />         hostname = "/etc/hostname"<br />     self.machine = open(hostname, 'r').readline().rstrip()<br />     return<br /></pre>
<br />
so the complete get_machine() function looks like:<br />
<pre>100     def get_machine(self):<br />101         try:<br />102             hostname = os.path.join(self.dir, "sysinfo/hostname")<br />103             self.machine = open(hostname, 'r').readline().rstrip()<br />104             return<br />105         except:<br />106             pass<br />107         try:<br />108             uname = os.path.join(self.dir, "sysinfo/uname_-a")<br />109             self.machine = open(uname, 'r').readline().split()[1]<br />110             return<br />111         except:<br />112             pass<br />113         # for ubuntu machines<br />114         try:<br />115             if os.path.isfile("/etc/hostname"):<br />116                 hostname = "/etc/hostname"<br />117             self.machine = open(hostname, 'r').readline().rstrip()<br />118             return<br />119         except:<br />120             pass<br />121         raise "Could not figure out machine name"<br /></pre>
<br />
this parses as:<br />
<pre>=====================================================<br />/usr/local/autotest/client/results/default/dbench<br />===================================================== <br /><br />STATUS:                 GOOD    dbench  dbench  timestamp=1199817550    localtime=Jan 08 14:39:10       completed successfully<br />GROPE_STATUS: ['GOOD', 'dbench', 'dbench', 'timestamp=1199817550\tlocaltime=Jan 08 14:39:10\tcompleted successfully']<br />set group_subdir: dbench<br />incorrect indent level 2 != 0, ignoring<br />+ Parsing /usr/local/autotest/client/results/default/dbench<br />* jobname, kernel version: dbench <br />COMMITING<br /></pre>
<h3>Setting up Apache</h3>
<br />

Make a symbolic link in /var/www to the autotest tko directory:<br />
<pre>root@ian-laptop:/var/www# ln -s /usr/local/autotest/tko mobile-tests</pre>
<br />

In /etc/apache2/httpd.conf add the line:<br />
<pre>AddHandler cgi-script .cgi<br /></pre>
<br />

then the Directory information:<br />
<pre>&lt;Directory /var/www/mobile-tests&gt;<br /> Options +ExecCGI<br />&lt;/Directory&gt;<br /></pre>
<br />

then go to:<br />
http://localhost/mobile-tests/<br /><br />and you will see the results of the tests displayed in the browser<br /><img class="image-left" src="../images/autotest-backend" alt="Autotest Backend" /><br />
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Setting up a personal debian repository</title>
                      <link>http://ianlawrence.info/random-stuff/setting-up-a-personal-debian-repository</link>
                      <description>A Debian repository is a set of Debian packages organized in a special directory tree which also contains a few additional files containing indexes and checksums of the packages.</description>
                      <author>vern</author>
                      <pubDate>Sun, 09 Dec 2007 04:40:00 -0600</pubDate>
                      
     
        <category>Debian</category>
     
     
        <category>Documentation</category>
     
     
        <category>Repository</category>
     
      <content:encoded>
        <![CDATA[
<h3>Background</h3>
<br />If a user adds your repository to her /etc/apt/sources.list file, she can easily view and install all the packages available in it.

<br />If your repository is listed in sources.list, apt-get will fetch the Packages.gz index if the binary packages are listed (with the deb keyword) and Sources.gz if the sources are listed (with the deb-src keyword).<br /><br />Packages.gz contains the name, version, size, the short and the long description, and the dependencies of each package<br />Sources.gz contains the name, version and the build dependencies (the packages needed to build) of each package<br /><br />Repositories can offer different packages for each supported distribution and for each of the supported architectures; apt will automatically fetch the right one for a user's machine, without her even having to know about all the different architectures. <br />It also allows grouping of your packages into components, just as Debian's packages are divided into main, non-free, contrib and so on. 

<br />Distributing the packages in many different directories can however become unmanageable. <br />It is also a waste of space and bandwidth, as there are many packages (for example documentation packages) which are the same for all architectures.
In such cases, a possible solution is a pool. A pool is an additional directory under the repository root containing all packages (the binaries for all architectures, distributions, and components, and all the sources).

<br /><br />
<h3>Set up</h3>
<br /><a href="http://mirrorer.alioth.debian.org/">Reprepro </a>makes it very easy to set up APT repositories that use a common /pool directory to store all the package files.<br /><br />Repositories will go under /var/packages/ and it will be set up for the Ubuntu Gutsy distribution.<br />The directory /var/packages/ubuntu/ is going to be the base of the Ubuntu repository.
<pre>root@host:/var# mkdir packages;cd packages<br />root@host:/var/packages# mkdir ubuntu;cd ubuntu<br />root@host:/var/packages/ubuntu# mkdir conf;cd conf<br />root@host:/var/packages/ubuntu/conf# vi distributions</pre>
inside this file put:
<pre>Origin: Ians<br />Label: Ians Personal Debs<br />Codename: gutsy<br />Architectures: i386 amd64 source lpia<br />Components: main<br />Description: Ians Personal Debian Repository<br />SignWith: yes<br />DebOverride: override.gutsy<br />DscOverride: override.gutsy<br /></pre>
The Origin, Label and Description field can be filled with whatever you want. <br />The Codename is the specific distribution/version that this block of settings applies to. In this case it's gutsy. <br />The Architectures can be any of the 11 debian builds for and the Components can be of your choosing such as main non-free contrib and so on.
<br />SignWith indicates that you want to create a Release.gpg file, creating a signed APT repository. 
<br />The DebOverride and DscOverride fields tell reprepro what files to use for the override rules. Override rules can be used to override .deb and .dsc configuration fields. 

Now create an options file:
<pre>root@host:/var/packages/ubuntu/conf# vi options</pre>
inside this file put:
<pre>verbose<br />ask-passphrase<br />basedir .<br /></pre>
(ask-passphrase is used if you created a signed repo)
<pre>root@host:/var/packages/ubuntu/conf# cd ..<br />root@host:/var/packages/ubuntu/# mkdir override;cd override<br />root@host:/var/packages/ubuntu/override# touch gutsy.override<br /></pre>
this creates the override file if we need to use it later.

<br /><br />
<h3>Adding a deb</h3>
<pre>root@host:/var/packages/ubuntu# $ reprepro includedeb</pre>
so for my repo I did:
<pre>root@host:/var/packages/ubuntu# $ reprepro includedeb gutsy /home/debs/liferea_1.4.4-0ubuntu4_i386.deb<br /></pre>
(notice the full path to the deb itself)
More info about adding/removing debs and general repo 'good practice' is <a href="http://alioth.debian.org/plugins/scmcvs/cvsweb.php/~checkout~/mirrorer/docs/short-howto?rev=HEAD;content-type=text%2Fplain;cvsroot=mirrorer">here </a><br /><br />
<h3>Setting up Apache</h3>
<br />I am running mod_python so I control which urls are served with python or apache using apache's httpd.conf. First of all, make an Alias to the repository
<pre>root@host:/var/packages/ubuntu# cd /etc/apache2/sites-enabled/<br />root@host:/etc/apache2/sites-enabled# vi 000-default</pre>
this file should look like (the part below and including Alias /packages/ "/var/packages/" ) :
<pre>NameVirtualHost *<br />&lt;VirtualHost *&gt;<br />	ServerAdmin webmaster@localhost<br />	<br />	DocumentRoot /var/www/<br />	&lt;Directory /&gt;<br />		Options FollowSymLinks<br />		AllowOverride None<br />	&lt;/Directory&gt;<br />	&lt;Directory /var/www/&gt;<br />		Options Indexes FollowSymLinks MultiViews<br />		AllowOverride None<br />		Order allow,deny<br />		allow from all<br />		# This directive allows us to have apache2's default start page<br />                # in /apache2-default/, but still have / go to the right place<br />                #RedirectMatch ^/$ /apache2-default/<br />	&lt;/Directory&gt;<br /><br />	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />	&lt;Directory "/usr/lib/cgi-bin"&gt;<br />		AllowOverride None<br />		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />		Order allow,deny<br />		Allow from all<br />	&lt;/Directory&gt;<br /><br />	ErrorLog /var/log/apache2/error.log<br /><br />	# Possible values include: debug, info, notice, warn, error, crit,<br />	# alert, emerg.<br />	LogLevel warn<br /><br />	CustomLog /var/log/apache2/access.log combined<br />	ServerSignature On<br /><br />    Alias /doc/ "/usr/share/doc/"<br />    &lt;Directory "/usr/share/doc/"&gt;<br />        Options Indexes MultiViews FollowSymLinks<br />        AllowOverride None<br />        Order deny,allow<br />        Deny from all<br />        Allow from 127.0.0.0/255.0.0.0 ::1/128<br />    &lt;/Directory&gt;<br />    Alias /packages/ "/var/packages/"<br />    &lt;Directory "/var/packages"&gt;<br />        Options Indexes FollowSymLinks MultiViews<br />        DirectoryIndex index.html<br />        AllowOverride Options<br />        Order allow,deny<br />        allow from all<br />     &lt;/Directory&gt;<br />     &lt;Directory "/var/packages/*/conf"&gt;<br />        Order allow,deny<br />        Deny from all<br />        Satisfy all<br />     &lt;/Directory&gt;<br />     &lt;Directory "/var/packages/*/db"&gt;<br />        Order allow,deny<br />        Deny from all<br />        Satisfy all<br />      &lt;/Directory&gt;        <br />&lt;/VirtualHost&gt;<br /></pre>
then add a SetHandler in httpd.conf to let apache handle the repo and not mod_python
<pre>root@host:/etc/apache2/sites-enabled# cd ..<br />root@host:/etc/apache2# vi httpd.conf<br /><br /><br />&lt;location "/packages"&gt;<br />    SetHandler None<br />&lt;/location&gt;</pre>
and restart apache (/etc/init.d/apache2 restart) <br /><br />The repository is browsable at:
http://&lt;somehost.com&gt;/packages/

<br /><br />To check out your debs using apt you need to add:
<pre>deb http://&lt;somehost.com&gt;/packages/ubuntu gutsy main<br />deb-src http://&lt;somehost.com&gt;/packages/ubuntu gutsy main</pre>
to /etc/apt/sources.list and do an apt-get update




]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title> MOTU Q&amp;A session</title>
                      <link>http://ianlawrence.info/random-stuff/motu-q-a-session</link>
                      <description>Welcome to a Masters of the Universe classroom session</description>
                      <author>vern</author>
                      <pubDate>Fri, 30 Nov 2007 09:17:23 -0600</pubDate>
                      
     
        <category>Documentation</category>
     
     
        <category>MOTU</category>
     
     
        <category>Packaging</category>
     
      <content:encoded>
        <![CDATA[
<h3><a href="http://wiki.ubuntu.com/MOTU/GettingStarted">Getting Started</a></h3>
<br /><br />
<p>The key thing about packages in ubuntu and debian is that we both deal with the source <br />package and what users install are binary packages.</p>
<p>We only do source changes and only do source uploads to the build daemons, which <br />(hopefully, if we do everything alright) turn our source packages into binary packages.</p>
<br />
<h3>Getting a random source package to play with<br /></h3>
<pre> apt-get source xicc<br /></pre>
<br />
look at the output of
<pre>less xicc-0.2/debian/control</pre>
gives<br /><br />
<pre>Source: xicc<br />Section: x11<br />Priority: optional<br />Maintainer: Ross Burton <br />Build-Depends: debhelper (&gt;=4.1.16), cdbs, libxt-dev, libglib2.0-dev<br />Standards-Version: 3.6.2<br /><br />Package: xicc<br />Architecture: any<br />Depends: ${shlibs:Depends}, ${misc:Depends}<br />Description: set the ICC colour profile for an X display<br /> This utility lets you set an ICC colour profile for an X display, so that<br /> applications can use it to display colour calibrated images.  Applications have<br /> to specifically look for this atom but several applications such as Gimp and<br /> Eye Of Gnome already do.</pre>
<br />
There are two sections:
<br />the first deals with the source package and specifies things like build-depends (the packages that are needed to build the package)<br /> the second section deals with binary packages - in this case it's simple: one source package called xicc, one binary package called xicc.<br />Notice one field called 'Architecture:' it says <b>'any' </b>which means: please build this source package on any architecture in the data center which includes i386, amd64, powerpc, lpia, hppa and so on.<br /><br /> this is only necessary for packages that use architecture dependant code, like C code or C++ code.<br /> in the case of python package (which just contains python code that is interpreted), you'd change 'any' to 'all' which means it's only built on one build daemon, but will be installable on all architectures, because it's the same binary package anywhere.<br /><br />For Ubuntu Mobile enter <b>lpia</b> in this field.<br /><br />
<pre> ${shlibs:Depends}</pre>
is a variable that will be substituted with all the library packages the binary files in the binary package link to.<br />For example, <br /><br />
<pre>apt-cache show xicc</pre>
<br />lists the following:  <br /><br />
<pre> libc6 (&gt;= 2.3.4-1), libglib2.0-0 (&gt;= 2.8.0), libice6, libsm6, libx11-6</pre>
<br />because that's the libaries the binary in the package links to.<br /><br />
<p class="callout">In depth analysis of  'the libraries the binary in the package links to'</p>
<pre>        aptitude download xicc<br />        dpkg -x xicc_0.2-2_i386.deb test<br />        ldd test/usr/bin/xicc</pre>
<p class="callout">lists all the binaries that the that the built xicc binary links to</p>
<pre>{misc:Depends}</pre>
<br />will be expanded by the packaging tools that run during the build process for example dh_gconf (in the debhelper package) will notice if you have gconf schema files in the package and automatically add a postinst script that will rebuild the gconf database after the installation on a machine.
also, it will add gconf as a dependency to ${misc:Depends}<br /><br />Another variable often used (but not in the example above) is <br />
<pre>${source:Version}<br /></pre>
For this check out pidgin:<br />
<pre>apt-cache showsrc pidgin | head -n 3</pre>
pidgin is split up into 10 binary packages
 so if somebody installs pidgin, you want to make sure that the installed version of pidgin-data is the same
 else you can't rely on all the images and sound files being at the right place and so on<br />This is why in pidgin's Depends you write something like<br />
<pre>Depends: pidgin-data (= ${Source:Version}), ...<br /></pre>
<br />which will be automatically replaced with the current source version of that upload <br /><br />
<h3>More Resources</h3>
<a href="http://wiki.ubuntu.com/PackagingGuide/PatchSystems">Patching Workshop</a><br /><a href="http://wiki.ubuntu.com/PackagingGuide/Basic">Basic Packaging</a><br /><a href="http://wiki.ubuntu.com/UbuntuDevelopment/Merging">Merging</a><br /><br />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>My Personal Package Archive on Launchpad </title>
                      <link>http://ianlawrence.info/random-stuff/my-personal-package-archive-on-launchpad</link>
                      <description>Build and publish binary Ubuntu packages simply by uploading an Ubuntu source package to Launchpad.</description>
                      <author>vern</author>
                      <pubDate>Tue, 27 Nov 2007 12:30:40 -0600</pubDate>
                      
     
        <category>Maemo</category>
     
     
        <category>Mobile Guide</category>
     
     
        <category>PPA</category>
     
     
        <category>Ubuntu Mobile</category>
     
      <content:encoded>
        <![CDATA[
<p>A PPA gives you:</p>
<ul><li>
<p> An APT repository of up to 1 gigabyte</p>
</li><li>
<p> Binary packages built for x86 and AMD64 architectures against Ubuntu.</p>
</li><li>
<p> A web front-end where Launchpad users can browse and search for your packages.</p>
</li></ul>
<br />I uploaded the <a href="https://edge.launchpad.net/~ianlawrence/+archive">mobileguide </a>for hardy and it seemed to build OK.<br /><br />I hope that the <a href="https://wiki.ubuntu.com/MOTU">MOTU</a> guys think the deb is OK ;)<br /><br />I have also submitted it for <a href="https://wiki.ubuntu.com/MOTU/Packages/REVU">REVU </a>(a web-based tool to give people who have worked on packages a chance
to "put their packages out there" for other people to look at and
comment on) so fingers crossed it is accepted!<br /><br />There has been some discussion on the <a href="https://lists.maemo.org/mailman//listinfo/maemo-developers">maemo-dev lists</a> recently about implementing a similar system  for armel and this would be great I think. I have just packaged the liferea 1.4.4 sources with a hildon.dpatch which I am testing at the moment so anyway to have this automatically build for both armel and lpia would be *awesome*<br /><br />Interesting times ahead in mobile if it all comes off.<br /> ]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Frothing-0.1 on Maemo</title>
                      <link>http://ianlawrence.info/random-stuff/frothing-0-1-on-maemo</link>
                      <description>The Liferea port is now running on armel for Nokia Internet Tablets</description>
                      <author>vern</author>
                      <pubDate>Fri, 23 Nov 2007 14:03:42 -0600</pubDate>
                      
     
        <category>Frothing</category>
     
     
        <category>Liferea</category>
     
      <content:encoded>
        <![CDATA[
<p>Thanks to some great work from Chris Malley, frothing now runs on 
armel Nokia Tablet devices as well as Intel lpia architectures.</p>
<br />
<p>It was a little jumping through hoops because libgtkhtml2-0 and libgtkhtml2-0-dev 
are not available (yet?) in the
maemo repositories so he need to apt-get the source from debian/ubuntu
and build it inside scratchbox with</p>
<pre> --disable-accessibility</pre>
<p>Also he added:</p>
<pre>AC_CHECK_LIB(gthread-2.0, g_thread_init)</pre>
<p>into configure.ac and did a <br /></p>
<pre>aclocal/autoconf/autoheader/automake</pre>
<p><br /><br /><br />For more info check out the <a href="https://edge.launchpad.net/frothing/">project home page</a><br /></p>
<p><br /></p>
<img src="../../downloads/UME/maemo_frothing.png" />]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>FOSK Certificate Development at Linux Professional Institute</title>
                      <link>http://ianlawrence.info/random-stuff/fosk-certificate-development-at-linux-professional-institute</link>
                      <description>I was recently invited to become a SME (Subject Matter Expert) for the development of the FOSK (Free &amp; Open Source Knowledge) certificate for those working in civil society.</description>
                      <author>vern</author>
                      <pubDate>Thu, 22 Nov 2007 11:56:14 -0600</pubDate>
                      
     
        <category>Certification</category>
     
     
        <category>Mobile</category>
     
      <content:encoded>
        <![CDATA[
<p>
The <a class="twikiCurrentTopicLink twikiLink" href="https://group.lpi.org/publicwiki/bin/view/Examdev/FOSK">FOSK</a>
Certification will be a single low stakes entry level exam to test the
FOSS knowledge and competency level of technical and non technical
staff who are responsible for the day to day computer needs of Not for
Profit organizations. This professional may work as a technical person,
a circuit rider, account management or technical sales, executive
positions or any other role that is responsible for recommending and/or
choosing FOSS solutions for an organization.</p>
<br />
<p>I have been working on Open Source Software for mobile phones and <a href="http://moblin.org/">MID</a> / <a href="http://maemo.org">Tablet </a>devices.</p>
<br />
<p>So far I have identified the following areas:</p>
<h3><a href="http://www.ethanzuckerman.com/">Background</a></h3>
<br />
<p>
If you ask a U.S.-based activist the most important technical
development of the past five years, they’ll likely tell you about the
rise of citizen media, the use of blogs and Web community sites to
disseminate information, organize events, and raise money. Bloggers
helped make Howard Dean a contender for the democratic nomination for
president in 2004, and many of the people involved with his online
campaign have gone on to develop increasingly complicated software,
helping support efforts towards Congressional transparency as well as
political organizing. Because blogs were such a visible manifestation
of political discourse, they’ve been extensively studied and reported
on, which leads to a sense of the importance of these media for the
campaign’s impact.</p>
<p>Ask an activist from the developing world the same question and
you’ll get a different answer: the most important activist technology
of the last five years is the mobile phone. The reasons for this are
simple: for most of the world, mobile phone penetration vastly exceeds
Internet usage. (In China in 2005, there were 350 million mobile phone
users, and 100 million Internet users. In sub-Saharan Africa in 2004,
there were 52 million mobile phone users and approximately 5 to 8
million Internet users.) While analysts in the North talk about users
receiving information on three screens — the computer, the television,
and the mobile — users in the South are usually looking at two screens,
and users in rural areas of the South are looking at one: a mobile
phone that might be shared by all the residents of a village.</p>
<p>Market estimates suggest that there are over 2 billion mobile
phone users in the world today, heading towards 3.3 billion in 2010.
The parts of the world where mobile use is growing the most quickly —
the Middle East, sub-Saharan Africa and South, and Southeast Asia — are
markets where the mobile isn’t a replacement for existing landline
technology, but is allowing people to have a personal communications
channel for the first time. 97 percent of people in Tanzania reported
that they could have access to a mobile phone — their own, a friend’s,
or one they could rent — as compared to 28 percent who could access a
landline. (A map of mobile phone coverage in Uganda from MTN gives you
a sense for how thoroughly some nations have become connected via
wireless technology.)</p>
<p>The only technology that compares to the mobile phone in terms
of pervasiveness and accessibility in the developing world is the
radio. Indeed, considered together, radios and mobile phones can serve
as a broad-distribution, participatory media network with some of the
same citizen-media dynamics of the Internet, but accessible to a much
wider, and non-literate audience. Interactive Radio for Justice, a
participatory radio show in the Ituri region of the DR Congo uses SMS
to let listeners ask questions about justice and human rights to a
panel of Congolese and U.N. officials, who answer the questions over
the air.</p>
<p>The questioners to Interactive Radio for Justice are anonymous.
The producers ask callers not to identify themselves for fear that some
pointed questions — “Are soldiers allowed to stay at my house and eat
my food without paying for it?” — may lead to retribution. In general,
the anonymity of mobile phones is one of the key reasons they’ve been
so useful to activists. In the United States, we consider most mobiles
to be highly traceable — generally, mobile users have a phone number
associated with a permanent address and a credit card. But mobile
phones in most developing nations are sold on a pay-as-you-go basis.
Some countries require registration of a phone’s SIM card using a
validated ID, but most don’t, either for the SIM or for “top-up” cards.
As a result, it’s not difficult for an activist to have a single phone
with multiple SIMs, one which is closely correlated with her identity
and one which might be used to send messages to organize a protest or
promote a cause.</p>
<p>Anonymity makes these protests unusually difficult for police
or other authorities to block. “Smart mobs” of activists, brought to
demonstrations by text messages, have led to political change in the
Philippines and the Ukraine. In 2001, SMS messages about political
corruption helped turn the tide against Joseph Estrada, and led to
SMS-organized street protests and Estrada’s eventual ouster. (Filipino
activists have organized subsequent text-based protests, many focused
on lobbying for mobile phone user’s rights. The organization TXTPower
started as a consumer rights’ organization and has now become active in
broader political protest.) SMS messages in Ukraine helped mobilize
tens of thousands of young demonstrators in the streets of Kiev in late
2004 to protest election fraud and demand a revote.</p>
<p>In both cases, calls to take to the streets spread organically
— virally — with recipients forwarding the messages to multiple
friends. Blocking the ability of a single phone to send messages would
likely do little to stop the spread of the message. (Activists have
discussed the wisdom of using SMS gateways, Web-based services which
can send SMS messages to hundreds or thousands of phones. An argument
against using gateways is the fact that they are single points of
failure that could be blocked by a government anxious to stop the
spread of a smart mob message.)</p>
<p>To stop virally spreading messages, concerned governments might
order SMS networks shut down. Some Belarussian activists reported
shutdowns of the SMS network in March 2006 to prevent activists in
Minsk from making contact outside the capital and encouraging
Belarusians in the countryside to come into the city. Similar
accusations come from Ethiopian activists, who report that SMS was
blocked during election protests in June 2005. Concerned about
political text messages, the government of Cambodia declared a two-day
“tranquility” period before governing council elections, shutting off
SMS messaging and prompting accusations that the blockage was an
unconstitutional limitation of speech. <br /></p>
<p>Observers from the National
Democratic Institute report that the Albanian government attempted to
block SMS throughout their network for a week before recent elections. <br /></p>
<p class="callout">[UPDATE:]The NDI recently wrote to me to say they *do not* believe the Albanian government blocked SMS
before the elections there. One of the mobile providers had intermittent
blockages, possibly due to their spam blocking policies, which they noticed and
addressed during their tests the week before the election.</p>
<p><br /></p>
<p>
Iran may have blocked SMSs sent from Internet gateways as a way of
preventing “defamation” of candidates prior to elections in late 2006.</p>
<p>The Shanghai police have tried another technique for
controlling SMS-spread demonstrations — they used SMS messages to warn
potential protesters away from anti-Japan street protests. (The
technique was a mixed success — the message from Shanghai police was so
ambiguously worded that some recipients took it as encouragement to
protest.) Belarusian authorities attempted something similar during the
October Square protests, sending SMS messages warning potential march
participants about their health and safety if they appeared at marches,
stating that “provocateurs are planning bloodshed.”</p>
<p>In smart-mob scenarios, mobile phones function as an impromptu
broadcast network — if activists had access to radio stations with
sufficient footprint, they could achieve similar goals by broadcasting
information about rallies over the airwaves. Other activist uses of
mobiles take advantage of the ability of mobile owners to create
content as well as forwarding it. Activists with the pro-democracy
Kefaya movement use mobile phones and their cameras to document
demonstrations and other news events, including a government crackdown
on Sudanese protesters in Cairo — they call, text, or use MMS to send
messages to the administrator of the Kefaya blog, which compiles
reports into blog posts much as a newsroom turns field reports into
finished articles.</p>
<p>A dispersed group with mobile phones — especially mobile phones
equipped with cameras — becomes a powerful force for “sousveillance.“
Coined by Dr. Steve Mann, “sousveillance” refers to the monitoring of
authority figures by grassroots groups, using the technologies and
techniques of surveillance. The use of mobile phones to monitor the
2000 presidential election in Ghana is a good example of sousveillance
— voters who were prevented from voting used mobile phones to report
their experience to call-in shows on local radio stations. The stations
broadcast the reports, prompting police to respond to the accusations
of voter intimidation. Had voters called the police directly, it’s
possible that authorities might not have responded — by making reports
public through the radio, voters eliminated the possibility of police
announcing that there had been no reports of voter intimidation.
Similar techniques have been used in Sierra Leone, Senegal, and even in
the United States — American voters used mobile phone cameras and
Websites to record reports of voting irregularities during the 2006
congressional elections.</p>
<p>Sousveillance has a way of trapping authority figures, even
when they’re the ones holding the cameras. Egyptian blogger and
activist Mohammed Sharkawy was beaten and sodomized while in police
custody — his tormentors filmed the incident and threatened to
humiliate him by posting the video on the Internet. The video, posted
at sites like YouTube
has now become a document demonstrating the brutality of Egyptian
police, leading to criticism by the U.S. State Department of Egypt’s
human rights record. In a future where most citizens carry cameras with
them at all times and have the ability to spread them phone to phone,
or by posting them to a Web site, there’s tremendous potential for
sousveillance to serve as a check to people in power. (Needless to say,
there are hundreds of more worrisome scenarios made possible by the
same technology, including noxious phenomena like “happy slapping“.)</p>
<p>Mobiles are powerful because they’re pervasive, personal, and
capable of authoring content. An intriguing new dimension emerges as
they become systems of payment as well. Kenyan mobile company Safaricom
has introduced a new system allowing mobile phone users to send money
to other users of the network — it’s called M-PESA and has moved from
pilot to full-scale implementation rapidly. Once Vodaphone, Safaricom’s
international partner in the project, makes it possible for people
outside of Kenya to deposit money into the network, it’s likely that
M-PESA will become a major tool for remittance as well as for cashless
payment. Activists armed with M-PESA-type phones could do more than
organize a dispersed protest — they could fundraise, making it possible
for groups of activists to fund the travel of an activist to a protest
or the cost of leaflets. Similar projects, like Wizzit in South Africa,
suggest that mobile banking is likely to become widespread in countries
with a large “unbanked” population.</p>
<p>These mobile payment systems have a high degree of
centralization and identification — M-PESA users have to register with
Safaricom with a government ID. But other emerging payment via mobile
systems look more like hawala, the informal money transfer system used
through much of the Middle East and South Asia. Nokia anthropologist
Jan Chipchase tells a story about Ugandan mobile phone users and a
system called “sente”: A caller purchases mobile phone airtime cards in
a major city, then calls his home village — he reads the recharge codes
to the person in town who owns a mobile phone, giving her the credits
to use. She enters the credits into her phone (validating the
transaction), then gives a large percentage of the value of the credits
to the person of the caller’s choice, usually a member of his family.
Systems like this allow for virtually untraceable money transfer,
unless phone card vendors are forced to check identification before
selling phone cards.</p>
<p>Finally, it’s worth remembering that the powers unleashed by
the mobile phone can affect all sides of a political situation.
Protests organized by SMS helped unseat Joseph Estrada in the
Philippines and bring President Gloria Arroyo to power. When Arroyo
found herself embroiled in a corruption scandal involving tape
recordings of phone calls to voting commissioner Virgilio Garcillano,
one of the tools activists used to spread information was a ringtone.
The ringtone featured a snippet of dialog between Arroyo and Garcillano
and rapidly became one of the world’s most downloaded ringtones and
spawning over a dozen remixed versions. The personal nature of mobile
phones makes them the perfect venue for protest, even if the protest is
as innocuous as having your phone chirp “Hello Garcia?” in the
President’s voice every time you get an SMS. What the mobile giveth, it
can taketh away.</p>
<h3>Resources</h3>
<br />
<p><a href="http://mobileactive.org/background-why-cell-phones-civic-action">
Mobile Phones For Civic Action </a></p>
<br />
<p><a href="http://tuxmobil.org/phones_survey_nokia.html">
Linux compatibility, synchronization and configuration guides for mobile (cellular) phones </a></p>
<br /><a href="http://mobileactive.org/potential-cell-phones-co">
The potential of cell phones to combat AIDS: Interview with Zinhle Thabethe and Krista Dong, iTeach South Africa
</a><br /><br /><br />
<h3>Default Applications on Ubuntu Mobile</h3>
<br />
<table class="twikiTable">
<tbody>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<th colspan="2">  <strong> App Category </strong></th>
<th colspan="2">  <strong> App Name </strong></th>
<th colspan="2">  <strong> URL </strong></th>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> eBook Reader</td>
<td colspan="2"> FBReader</td>
<td colspan="2"> <a href="http://www.fbreader.org/" rel="nofollow" target="_top">http://www.fbreader.org/</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Camera Application</td>
<td colspan="2"> Cheese</td>
<td colspan="2"> <a href="http://www.gnome.org/projects/cheese/" rel="nofollow" target="_top">http://www.gnome.org/projects/cheese/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Email Client</td>
<td colspan="2"> Claws</td>
<td colspan="2"> <a href="http://www.claws-mail.org/index.php" rel="nofollow" target="_top">http://www.claws-mail.org/index.php</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> PIM</td>
<td colspan="2"> Pimlico</td>
<td colspan="2"> <a href="http://www.pimlico-project.org/" rel="nofollow" target="_top">http://www.pimlico-project.org/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Dictionary</td>
<td colspan="2"> Stardict</td>
<td colspan="2"> <a href="http://stardict.sourceforge.net/" rel="nofollow" target="_top">http://stardict.sourceforge.net/</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Video Conferencing</td>
<td colspan="2"> Ekiga</td>
<td colspan="2"> <a href="http://ekiga.org/" rel="nofollow" target="_top">http://ekiga.org/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Browser</td>
<td colspan="2"> Mid-browser (Mozilla/Firefox based)</td>
<td colspan="2"> <a href="https://wiki.ubuntu.com/MobileAndEmbedded/Browser" rel="nofollow" target="_top">https://wiki.ubuntu.com/MobileAndEmbedded/Browser</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Remote Desktop Client</td>
<td colspan="2"> Rdesktop</td>
<td colspan="2"> <a href="http://www.rdesktop.org/" rel="nofollow" target="_top">http://www.rdesktop.org/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Media Player</td>
<td colspan="2"> Helix Based</td>
<td colspan="2"> <a href="https://wiki.ubuntu.com/MobileAndEmbedded/MediaPlayer" rel="nofollow" target="_top">https://wiki.ubuntu.com/MobileAndEmbedded/MediaPlayer</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> IM/Chat</td>
<td colspan="2"> Moblin Chat</td>
<td colspan="2"> <a href="https://wiki.ubuntu.com/MobileAndEmbedded/Chat" rel="nofollow" target="_top">https://wiki.ubuntu.com/MobileAndEmbedded/Chat</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Office Doc Viewer</td>
<td colspan="2"> Open Office</td>
<td colspan="2"> <a href="http://www.openoffice.org/" rel="nofollow" target="_top">http://www.openoffice.org</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> RSS Reader</td>
<td colspan="2"> Liferea</td>
<td colspan="2"> <a href="http://liferea.sourceforge.net/" rel="nofollow" target="_top">http://liferea.sourceforge.net/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Clock</td>
<td colspan="2"> Applet</td>
<td colspan="2"> <a href="https://wiki.ubuntu.com/MobileAndEmbedded/Utilities" rel="nofollow" target="_top">https://wiki.ubuntu.com/MobileAndEmbedded/Utilities</a></td>
</tr>
<tr class="twikiTableEven">
<td class="twikiFirstCol">  <br /></td>
<td colspan="2"> Calculator</td>
<td colspan="2"> Gcalculator</td>
<td colspan="2"> <a href="http://www.gnome.org/" rel="nofollow" target="_top">http://www.gnome.org/</a></td>
</tr>
<tr class="twikiTableOdd">
<td class="twikiFirstCol twikiLast">  <br /></td>
<td class="twikiLast" colspan="2"> Casual Games</td>
<td class="twikiLast" colspan="4"> Foobillard, Neverball and Neverputt, Frozen bubble and gnudoku</td>
</tr>
</tbody>
</table>
<br />
<h5> Linux Applications for Nokia Phones</h5>
<br />
<p>
<strong>Gnu Box</strong> is a small software for your cell phone with
which you can create a new Internet Connection (internet access point,
connection profile, whatever you call it) on the phone. If you use this
connection, the phone does not dial or connect to GPRS, but uses
bluetooth (or the USB cradle) to connect to your PC. Thus you will be
able to surf the web, download software/data/email/whatever you like
without paying any fee to your operator.</p>
<p></p>
<p>
<strong>Python for Series 60</strong> allows developers to execute
Python commands and run Python scripts and applications in devices
based on Series 60 Platform. In addition, developers can execute Python
commands and scripts in the emulators of Series 60 Developer Platform
SDK's. Development starts with an interactive console in a Series 60
compatible device where Python commands can be executed. Alternatively,
a developer can write Python scripts, install them to a device
executing scripts and applications from the Python Environment."
Light Blue Python Bluetooth API for Series 60</p>
<p>
<strong>Light Blue</strong> is a cross-platform Python Bluetooth API
for Mac OS X, GNU/Linux, and Python For Series 60. It provides easy
programmatic access to device and service discovery, RFCOMM sockets,
sending and receiving files over OBEX, service advertising, and local
device information.</p>
<p></p>
<p>
<strong>Nokia 5510 Linux Audio Manager</strong> allows user to manage
MP3 files stored on Nokia 5510 mobile phone. It was written in Python
with use of GTK+2 and Glade2 modules. The main platform for 5510lam is
Linux.</p>
<p></p>
<p>
<strong>V Cal One</strong> converts v Calendar version 2 data to a
limited subset of vCal version 1. V Cal One can convert a calendar
saved from korganizer to a format suitable for uploading to a Nokia
6820 cell phone.</p>
<p></p>
<p>
<strong>Nokryptia</strong> converts MP3's to LSE files</p>
<p></p>
<p>
<strong>Sis</strong> open is a tool to list and extract the content of
SIS files. SIS files are installation files used in Symbian-based
smartphones like many S60 Nokia phones. Sisopen is an ANSI-C program,
mainly targeted at Linux and other Unix-like systems. It can be
compiled on almost every system with a C compiler and zlib. Sisopen
fully understand the SIS file format and is able to show conditionals,
installation-time options, and much information about the SIS file, not
just the file names.</p>
<br />
<h5> Maemo</h5>
<br />
<p>
Maemo provides an open source development platform for Nokia Internet
Tablets and other Linux-based devices. It is built from components
widely used in open desktop and mobile systems.</p>
<p>
The maemo SDK contains the tools needed to create and port integrated
applications, replicating the Internet Tablet environment in your PC.
The Hildon Application Framework is a good entry point to understand
this platform.</p>
<p>
Familiarity with GTK+/GNOME technologies and the Debian tools helps</p>
<br />
<p class="callout">This is still a work in progress and so any advice/help/ideas would be great</p>
<p><br /></p>
<br />
<p></p>
<br /><br /><br />
<p><br /></p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>A port of Liferea for mobile linux handheld devices</title>
                      <link>http://ianlawrence.info/random-stuff/a-port-of-liferea-for-mobile-linux-handheld-devices</link>
                      <description>Frothing (Feed Reading On The Hoof) is a news aggregator for online news feeds. There are many other news readers available, but some are not available for mobile Linux devices or require many extra libraries to be installed. Frothing tries to fill this gap by creating a fast, easy to use, easy to install news aggregator for mobile Linux handheld devices</description>
                      <author>vern</author>
                      <pubDate>Fri, 16 Nov 2007 13:14:59 -0600</pubDate>
                      
     
        <category>C</category>
     
     
        <category>Maemo</category>
     
     
        <category>Ubuntu Mobile</category>
     
      <content:encoded>
        <![CDATA[
<p>To install Frothing you need to compile it inside<br />a <a href="http://live.gnome.org/Hildon" rel="nofollow">Hildon</a> compatible desktop environment. <br /></p>
<p>To create such an environment have a look <br />at <a href="http://moblin.org/howto_create-image.php" rel="nofollow">the Moblin</a> site or <a href="http://maemo.org/" rel="nofollow">the Maemo </a>site.</p>
<p>Frothing
was originally created for the Ubuntu <br />Mobile Guide as an example of how
to port an <br />application written in C to the Ubuntu Mobile <br />Edition. <br /></p>
<br />
<p><br /></p>
<p><img class="image-left" src="../images/frothing/image_preview" alt="Frothing" /><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>This
guide is available online <a href="http://umeguide.net/C/porting-C-apps.html" rel="nofollow">here</a> and is good <br />to read for background information. <br /></p>
<br />
<h2>Compiling from Source</h2>
<br /><br />
<p><i>Either check out the source from svn or <br /></i></p>
<p><i>grab the tarball to compile</i></p>
<p><i><br /></i></p>
<p>The source can be checked out from the <br />repositories by:</p>
<pre>svn checkout http://frothing.googlecode.com/svn/trunk/ frothing</pre>
<p>	 The tarball can be downloaded from <br />the <a href="http://code.google.com/p/frothing/downloads/list" rel="nofollow">project page</a> and extracted by:</p>
<blockquote>tar zxvf frothing-0.1.tar.gz</blockquote>
<p>After unpacking/checking out the code, run the standard autotools commands inside your target:</p>
<pre>./configure --enable-hildon<br />make<br />make install</pre>
<p><br /></p>
<h2>Dependencies</h2>
<br /><br />
<p>On Ubuntu the dependencies can be satisfied by: <br /></p>
<pre>apt-get install build-essential libgtkhtml2-0 libgtkhtml2-dev libxml-perl libxslt1-dev<br />libglade2-0 libglade2-dev libsqlite3-0 libsqlite3-dev<br />libhildondesktop-dev xulrunner</pre>
<br /><br />
<p>This project is also registered on <a href="https://edge.launchpad.net/frothing/">Launchpad</a><br /></p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        
        
            
                  <item>
                      <title>Django Sprint</title>
                      <link>http://ianlawrence.info/random-stuff/django-sprint</link>
                      <description>Django Sprint is an online event organized by the Django Community and by the developers of Django itself</description>
                      <author>vern</author>
                      <pubDate>Fri, 09 Nov 2007 08:55:04 -0600</pubDate>
                      
     
        <category>Django</category>
     
     
        <category>Sprint</category>
     
      <content:encoded>
        <![CDATA[
<p>The main objective of the event is to get the</p>
<p>community and the developers together to</p>
<p>discuss the roadmap, correct bugs and dream<br /></p>
<p>about new functionality. If you never <br /></p>
<p>collaborated with Django, or with any other open</p>
<p>source project for that matter, and you feel</p>
<p>like doing so now is your chance!</p>
<br />
<p><img class="image-left" src="../images/django" alt="django" /><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
To take part just add your name to the<a href="http://code.djangoproject.com/wiki/Sprint1Dec2007" target="_blank"> Wiki</a>.<br /><br />
<p class="callout">Lets' go!!</p>
<br />
<p class="discreet">Pick something to work on and do it.</p>
<p class="discreet"><br />All sorts of tasks are available,
from</p>
<p class="discreet"><br />hard-core hacking to improving documentation</p>
<p class="discreet"><br />to fixing small bugs.</p>
<p><br /></p>
]]>
      </content:encoded>
     

                  </item>

            
	   	
        


    </channel>

</rss>

