<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUIBRno6eip7ImA9WxBWFEo.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766</id><updated>2010-02-06T17:25:57.412+01:00</updated><title>damonkohler</title><subtitle type="html">Exploits in programming, electronics, photography, and tinkering.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.damonkohler.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.damonkohler.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>154</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/damonkohler" /><feedburner:info uri="damonkohler" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkcBR3o-eip7ImA9WxBRGU0.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-1331540678726862087</id><published>2010-01-07T23:38:00.004+01:00</published><updated>2010-01-07T23:40:56.452+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-07T23:40:56.452+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Using ASE with your.flowingdata</title><content type="html">As of &lt;a href="http://android-scripting.googlecode.com/"&gt;ASE&lt;/a&gt; r16, &lt;a href="http://python-twitter.googlecode.com/"&gt;python-twitter&lt;/a&gt; is included with Python. There is a &lt;a href="http://code.google.com/p/android-scripting/issues/detail?id=174"&gt;bug&lt;/a&gt; that prevents it from working (the fix will be available in r17). But, there's a work around:&lt;ol&gt;&lt;li&gt;Open ASE shell (Menu &amp;gt; Interpreters &amp;gt; Shell)&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;mkdir /sdcard/ase/python/tmp&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;I'm using the python-twitter module to make it easy to keep track of events on &lt;a href="http://your.flowingdata.com/"&gt;your.flowingdata&lt;/a&gt; (yfd). I have the following yfd.py script:&lt;pre class="prettyprint"&gt;import android
import twitter
droid = android.Android()
t = twitter.Api(username='foo', password='bar')

def yfd(data=None):
  if data is None:
    data = droid.getInput('d yfd')['result']
  if data:
    t.PostDirectMessage('yfd', data)
  droid.exit()

if __name__ == '__main__':
  yfd()&lt;/pre&gt;Then, I have a few shortcut scripts I use for common data entries. For example, goodmorning:&lt;pre class="prettyprint"&gt;import yfd
yfd.yfd('goodmorning')&lt;/pre&gt;and goodnight:&lt;pre class="prettyprint"&gt;import yfd
yfd.yfd('goodnight')&lt;/pre&gt;On my Nexus One, I created a folder on my home screen called "yfd" that contains shortcuts to all three scripts. Just before bed, I tap "goodnight.py" and I tapp "goodmorning.py" when I wake up. If I have a data point to enter that isn't pre-defined, I tap "yfd.py" and enter my data.&lt;br /&gt;
&lt;br /&gt;
Works like a champ.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-1331540678726862087?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/9BQQyrXs7cY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/1331540678726862087/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=1331540678726862087" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1331540678726862087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1331540678726862087?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/9BQQyrXs7cY/using-ase-with-yourflowingdata.html" title="Using ASE with your.flowingdata" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2010/01/using-ase-with-yourflowingdata.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGRn8-cCp7ImA9WxBRF04.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-6507476877249819771</id><published>2010-01-06T00:45:00.003+01:00</published><updated>2010-01-06T00:47:07.158+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-06T00:47:07.158+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE r15 and r16 Released</title><content type="html">&lt;div&gt;I skipped release notes for r15, so I'm rolling them into the release notes for r16. So, what's new?&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Features:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Cupcake support is back by popular demand.&lt;/li&gt;
&lt;li&gt;Built-in API browser. In the script editor, open the menu and tap "help" to see a list of all available ASE Android APIs.&lt;/li&gt;
&lt;li&gt;python-twitter package added.&lt;/li&gt;
&lt;li&gt;Anonymous usage tracking. Want to support ASE and increase development activity? Enable usage tracking!&lt;/li&gt;
&lt;li&gt;New sendEmail API supports pre-filled form fields.&lt;/li&gt;
&lt;li&gt;More and larger font sizes available for the terminal.&lt;/li&gt;
&lt;/ul&gt;Under the covers:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Huge refactoring of the AndroidFacade and RPC classes. Without this, the built-in API browser would not exist. Thanks, Felix!&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;In the works:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Shorter time between releases.&lt;/li&gt;
&lt;li&gt;Voice-to-text support.&lt;/li&gt;
&lt;li&gt;Email attachments.&lt;/li&gt;
&lt;li&gt;More APIs.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Visit the&amp;nbsp;&lt;a href="http://android-scripting.googlecode.com/" style="color: #999999; text-decoration: none;"&gt;ASE project page&lt;/a&gt;&amp;nbsp;to download the latest APK.&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-6507476877249819771?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/muu7O3Hy8fw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/6507476877249819771/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=6507476877249819771" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6507476877249819771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6507476877249819771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/muu7O3Hy8fw/ase-r15-and-r16-released.html" title="ASE r15 and r16 Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2010/01/ase-r15-and-r16-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUICQHczeip7ImA9WxBRE0k.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-3992402844865156697</id><published>2010-01-01T11:59:00.000+01:00</published><updated>2010-01-01T11:59:21.982+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-01T11:59:21.982+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games" /><title>Productivity is evil and should be punished.</title><content type="html">&lt;a href="http://continuitygame.com/"&gt;Continuity&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-3992402844865156697?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/ddYKqWNmstY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/3992402844865156697/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=3992402844865156697" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3992402844865156697?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3992402844865156697?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/ddYKqWNmstY/productivity-is-evil-and-should-be.html" title="Productivity is evil and should be punished." /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2010/01/productivity-is-evil-and-should-be.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQ387fyp7ImA9WxNUEUk.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-6951880937081824740</id><published>2009-11-02T08:08:00.003+01:00</published><updated>2009-11-02T08:10:02.107+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T08:10:02.107+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="it" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Ubuntu Koala Missing Volume Control: Found!</title><content type="html">Another small Koala hiccup I just fixed was my missing volume control. Usually, for GNOME at least, &lt;code&gt;gnome-volume-control-applet&lt;/code&gt; is the little speaker icon in the top right that lets you adjust your volume. After upgrading, mine wasn't there. In addition, "System &amp;gt; Preferences &amp;gt; Sound" failed to load. The fix is simple:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;rm -rf ~/.pulse*&lt;/pre&gt;&lt;br /&gt;
You don't even have to restart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-6951880937081824740?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/y8YFQA-fmuw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/6951880937081824740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=6951880937081824740" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6951880937081824740?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6951880937081824740?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/y8YFQA-fmuw/koala-missing-volume-control.html" title="Ubuntu Koala Missing Volume Control: Found!" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/11/koala-missing-volume-control.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQERHg8fip7ImA9WxNUEUw.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-137364107110003618</id><published>2009-11-01T22:18:00.001+01:00</published><updated>2009-11-01T22:18:25.676+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-01T22:18:25.676+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE r14 Released</title><content type="html">&lt;div&gt;What's new?&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Features:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;JavaScript (via Rhino) support added by Brice Lambson.&lt;/li&gt;
&lt;li&gt;Donut TTS support. Eclair is also now supported. Cupcake, however, is no longer supported.&lt;/li&gt;
&lt;li&gt;Interpreter manager. Interpreters can now be installed, uninstalled, and started as interactive terminals in the new interpreter manager. Press the menu button and then tap "Interpreters."&lt;/li&gt;
&lt;li&gt;ASE Server. You can now launch a background service to host the AndroidProxy. This means you can develop for ASE off the phone more easily by simply directing your scripts to connect to your phone over the network (no USB cable required).&lt;/li&gt;
&lt;li&gt;New APIs and updated &lt;a href="http://android-scripting.googlecode.com/svn/trunk/android/AndroidScriptingEnvironment/doc/com/google/ase/AndroidProxy.html"&gt;Javadoc&lt;/a&gt;. Be sure to scroll down to where you can see the @Rpc annotations for documentation.&lt;/li&gt;
&lt;/ul&gt;Bug fixes:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Interpreter installation is more robust. Keep filing bugs!&lt;/li&gt;
&lt;li&gt;BufferedReader warnings for BeanShell removed.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Visit the &lt;a href="http://android-scripting.googlecode.com/"&gt;ASE project page&lt;/a&gt; to download the latest APK.&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-137364107110003618?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/4nzP1byHPls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/137364107110003618/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=137364107110003618" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/137364107110003618?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/137364107110003618?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/4nzP1byHPls/ase-r14-released.html" title="ASE r14 Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/11/ase-r14-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUNRHc4fSp7ImA9WxNUEEs.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-5193040458334548792</id><published>2009-11-01T09:04:00.003+01:00</published><updated>2009-11-01T10:04:55.935+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-01T10:04:55.935+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Fixing Karmic Koala's Broken tzdata Package</title><content type="html">I upgraded my laptop this morning to Ubuntu Karmic Koala. It went smoothly for the most part. At the end though I was stuck with a few packages that were considered local/obsolete in the Synaptic Package Manager; one of which was tzdata. To fix it I had to:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Reinstall libc6 via &lt;code&gt;sudo apt-get --reinstall install libc6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Download the latest &lt;a href="https://launchpad.net/ubuntu/karmic/i386/tzdata/2009f-0ubuntu1"&gt;tzdata package&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install the latest tzdata package via &lt;code&gt;sudo dpkg -i /path/to/tzdata.deb&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Now everything is working again. Every Ubuntu upgrade is a small adventure. Can't wait to try it on my desktop. &lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-5193040458334548792?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/ib517QX3PzU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/5193040458334548792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=5193040458334548792" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/5193040458334548792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/5193040458334548792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/ib517QX3PzU/fixing-koala-broken-tzdata-package.html" title="Fixing Karmic Koala's Broken tzdata Package" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/11/fixing-koala-broken-tzdata-package.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIHRXgyfyp7ImA9WxNVFEQ.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-1714665892060792237</id><published>2009-10-25T13:41:00.006+01:00</published><updated>2009-10-25T19:15:34.697+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-25T19:15:34.697+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="hushnote" /><title>Introducing hushnote</title><content type="html">This weekend I decided I wanted to fix my password problem. That is, I wanted my passwords secure and managed in the cloud.&lt;br /&gt;
&lt;br /&gt;
Let me introduce &lt;a href="https://hushnote.appspot.com/"&gt;hushnote&lt;/a&gt;, yet another &lt;a href="http://en.wikipedia.org/wiki/Host-proof_hosting"&gt;host-proof&lt;/a&gt;, web-based password and secret information manager. I was inspired by the simplicity of Aaron Boodman's &lt;a href="http://aaronboodman.com/halfnote/browser.php"&gt;halfnote&lt;/a&gt; and Brett Cannon's &lt;a href="http://oplop.googlecode.com/"&gt;Oplop&lt;/a&gt;. Combining the two felt natural.&lt;br /&gt;
&lt;br /&gt;
Here is my suggested usage pattern for hushnote:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Think up a master password and enter it into the "Oplop password" box.&lt;/li&gt;
&lt;li&gt;Think up a label (for instance, "hushnote", "foo", or "spam") for hushnote and enter it into the "Oplop label" box (which replaces the password box after entering your password). The Oplop algorithm will generate a new hushnote password for you based on the combination of your master password and hushnote label.&lt;/li&gt;
&lt;li&gt;Copy the password into the "hushnote password" box and fetch your encrypted note.&lt;/li&gt;
&lt;li&gt;Now, use the encrypted note to store your Oplop labels for other sites or any other secret information you want to keep track of.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Hushnote handles all hashing, encryption, and decryption locally in the browser. Your passwords, labels, and notes are never sent to the server unencrypted. Hushnote is served over SSL so you can be confident that it is actually hushnote you are connecting to and that it hasn't been modified in flight by any meanie-pants hackers.&lt;br /&gt;
&lt;br /&gt;
The source code isn't complicated, but here's the highlight reel:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Your hushnote password is hashed to check if it matches the password used to encrypt the content stored on the server. This is sent along with the first AJAX call to retrieve your note.&lt;/li&gt;
&lt;li&gt;Your hushnote password is then used to decrypt the content retrieved from the server.&lt;/li&gt;
&lt;li&gt;Finally, your hushnote password is used to encrypt the note. Your encrypted content and password hash are sent to the server in the second AJAX call.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-1714665892060792237?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/Gu3dQaCnBNc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/1714665892060792237/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=1714665892060792237" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1714665892060792237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1714665892060792237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/Gu3dQaCnBNc/hushnote-host-proof-password-manager.html" title="Introducing hushnote" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/10/hushnote-host-proof-password-manager.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUHRX8zeSp7ImA9WxNWEk0.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-381514582058111933</id><published>2009-10-10T20:40:00.012+02:00</published><updated>2009-10-10T21:17:14.181+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-10T21:17:14.181+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="photos" /><title>How to use Manual Focus (the easy way!)</title><content type="html">For about as long as I've owned my camera (four or five years now), I've used its automatic focus. I tried manual focus a few times and got poor results.&lt;br /&gt;
&lt;br /&gt;
Tonight, I got a new &lt;a href="http://www.amazon.com/Canon-50mm-1-8-Camera-Lens/dp/B00007E7JU/ref=sr_1_1?ie=UTF8&amp;amp;s=photo&amp;amp;qid=1255198598&amp;amp;sr=1-1"&gt;Canon EF 50mm 1.8 II&lt;/a&gt; lens for my Digital Rebel XT. It is by far the fastest lens I own (the next fastest is my&lt;br /&gt;
&lt;a href="http://www.amazon.com/Canon-70-300mm-4-5-6-Lens-Cameras/dp/B0007Y794O"&gt;Canon EF 70-300mm f/4-5.6 IS USM&lt;/a&gt;) and I love the limited depth of field I can get with it. I'm looking forward to trying it out while I'm in Italy next week.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-size: 0.75em; text-align: center; margin: 0px;"&gt;&lt;a href="http://4.bp.blogspot.com/_S_hSHjWfzvo/StDVMXzM3UI/AAAAAAAAIZg/jserhC01lJo/s1600-h/IMG_0046.jpg"&gt;&lt;img alt="" border="0" height="266" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/StDVMXzM3UI/AAAAAAAAIZg/jserhC01lJo/s400/IMG_0046.jpg" style="clear: both; margin-left: auto; margin-right: auto; margin-bottom: 0px;" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
I haz no depth in my fieldz!&lt;/div&gt;&lt;br /&gt;
My new lens inspired me to revisit manual focus. I've always found it difficult to use manual focus on my camera because I can't quite tell when the picture is actually in focus. However, I just learned a new trick that makes using manual focus easier. If you hold the shutter button halfway down&amp;#151;like you would if you were using autofocus&amp;#151;while adjusting the focus manually, the AF points will light up as those parts of the picture come into focus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-381514582058111933?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/MpWqlcuqXf8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/381514582058111933/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=381514582058111933" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/381514582058111933?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/381514582058111933?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/MpWqlcuqXf8/how-to-use-manual-focus.html" title="How to use Manual Focus (the easy way!)" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_S_hSHjWfzvo/StDVMXzM3UI/AAAAAAAAIZg/jserhC01lJo/s72-c/IMG_0046.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/10/how-to-use-manual-focus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QGR309fip7ImA9WxNXFkk.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-1728175402391397181</id><published>2009-10-01T00:18:00.008+02:00</published><updated>2009-10-04T09:28:46.366+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-04T09:28:46.366+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="backup" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><title>Finding Unique Files</title><content type="html">&lt;div&gt;I've posted before about &lt;a href="http://www.damonkohler.com/2009/03/finding-duplicate-mp3s-using-locality.html"&gt;finding duplicate MP3 files&lt;/a&gt;. The other day, I found myself needing to do the opposite; this time with pictures. Pictures are a little easier to identify (at least in my case) because an MD5 over the entire content of the image is sufficient to identify images (MP3s require only hashing the non-ID3 portion of the file). Here's what happened:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a small mishap with my photos, I needed to do a partial restore from backup (a nightly &lt;code&gt;rsync -a --delete&lt;/code&gt;). I restored some files and then ran &lt;a href="http://premium.caribe.net/~adrian2/fdupes.html"&gt;fdupes&lt;/a&gt; to remove any duplicates. However, since the mishap involved moving photos between folders, renaming some files, and deleting others, I wasn't sure if I had restored all the affected photos. To find out, I used a little shell foo:&lt;pre class="pretty-print"&gt;$ find /pictures/ /backup/pictures/ -type f -exec md5sum {} \; &gt; md5sums&lt;br /&gt;$ sort md5sums | uniq --check-chars=32 --unique&lt;/pre&gt;This results in a list of files that only exist in either the primary or backup location. I expected to find some files that I had failed to restore properly. Instead, I was surprised to find some of my pictures were not backed up! Further investigation found that my backup drive was full and that my cron emails were being deposited in the spam folder...&lt;br /&gt;&lt;br /&gt;The moral of this story is that finding unique files is just as useful as finding duplicates and that it can help you determine that both your restoration was successful &lt;i&gt;and&lt;/i&gt; that your backup is complete.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-1728175402391397181?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/tl0IMr_E11k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/1728175402391397181/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=1728175402391397181" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1728175402391397181?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1728175402391397181?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/tl0IMr_E11k/finding-unique-files.html" title="Finding Unique Files" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/10/finding-unique-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08AQ3o5fCp7ImA9WxNQFkk.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-9095835127216819551</id><published>2009-09-22T20:40:00.003+02:00</published><updated>2009-09-22T20:57:22.424+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T20:57:22.424+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE r13 Released</title><content type="html">&lt;div&gt;What's new?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Administration:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;New version scheme. To help preserve my sanity, ASE versions will now increase monotonically with releases, starting with r13. Presently, ASE is still in alpha.&lt;/li&gt;&lt;li&gt;Interpreter archives are now versioned separately from ASE. This should make pushing new releases easier (that means releasing more often!)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Features:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Soft keyboard support in the terminal.&lt;/li&gt;&lt;li&gt;Smaller APK.&lt;/li&gt;&lt;li&gt;Python install now takes less main memory.&lt;/li&gt;&lt;li&gt;Python help() works.&lt;/li&gt;&lt;li&gt;New Python test.py script. I now use this for testing ASE. It's included with the scripts archive because it also provides many example uses of the API.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Bug fixes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Locale API updated.&lt;/li&gt;&lt;li&gt;Fixed several broken RPC methods.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Visit the &lt;a href="http://android-scripting.googlecode.com/"&gt;ASE project page&lt;/a&gt; to download the latest APK.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-9095835127216819551?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/F-b83OCeGpE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/9095835127216819551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=9095835127216819551" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/9095835127216819551?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/9095835127216819551?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/F-b83OCeGpE/ase-r13-released.html" title="ASE r13 Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/09/ase-r13-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UNRHk_eip7ImA9WxNRFkw.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-2721113505103627909</id><published>2009-09-10T23:33:00.006+02:00</published><updated>2009-09-10T23:48:15.742+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-10T23:48:15.742+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="slides" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><title>ASE Presentation at GTUG Munich</title><content type="html">I just gave a presentation on &lt;a href="http://android-scripting.google.com/"&gt;Android Scripting Environment&lt;/a&gt; at the &lt;a href="http://sites.google.com/a/gtugs.org/munich/"&gt;GTUG&lt;/a&gt; meeting in Munich this evening. I've embedded the presentation slides below.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/present/embed?id=dc4xcdp_23m58xdqch" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-2721113505103627909?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/AHc8pnWIZdM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/2721113505103627909/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=2721113505103627909" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/2721113505103627909?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/2721113505103627909?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/AHc8pnWIZdM/ase-presentation-at-gtug-munich.html" title="ASE Presentation at GTUG Munich" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/09/ase-presentation-at-gtug-munich.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UCR3g5cCp7ImA9WxNWEkw.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-109876512790915073</id><published>2009-09-06T17:30:00.010+02:00</published><updated>2009-10-11T00:54:26.628+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-11T00:54:26.628+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="germany" /><category scheme="http://www.blogger.com/atom/ns#" term="bavaria" /><title>Ich habe Lederhosen</title><content type="html">Just in time for Oktoberfest, I bought some Lederhosen. Now I can look Bavarian even if I can't speak it. Pascht scho.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_S_hSHjWfzvo/SqPXsGam6mI/AAAAAAAAIT4/NAotRSNn2Sw/s1600-h/img_2397+(Modified).jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378379532646935138" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/SqPXsGam6mI/AAAAAAAAIT4/NAotRSNn2Sw/s400/img_2397+(Modified).jpg" style="display: block; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-109876512790915073?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/4Gf4LDS_RQI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/109876512790915073/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=109876512790915073" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/109876512790915073?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/109876512790915073?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/4Gf4LDS_RQI/ich-habe-lederhosen.html" title="Ich habe Lederhosen" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_S_hSHjWfzvo/SqPXsGam6mI/AAAAAAAAIT4/NAotRSNn2Sw/s72-c/img_2397+(Modified).jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/09/ich-habe-lederhosen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MRnY9fip7ImA9WxNSFUs.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-8579877446226723182</id><published>2009-08-29T18:26:00.010+02:00</published><updated>2009-08-29T19:13:07.866+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-29T19:13:07.866+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bike" /><title>Pletscher ESGE on my Surly Long Haul Trucker</title><content type="html">In addition to &lt;a href="http://www.damonkohler.com/2009/08/android-g1-bicycle-mount.html"&gt;my G1 bike mount&lt;/a&gt;, I also recently purchased a &lt;a href="http://www.amazon.de/Zweibeinst%C3%A4nder-PLETSCHER-ESGE-290-schwarz/dp/B0024TTKVK/ref=sr_1_1?ie=UTF8&amp;amp;s=sports&amp;amp;qid=1251562322&amp;amp;sr=8-1"&gt;Pletscher ESGE&lt;/a&gt; bipod kickstand. While this kickstand is &lt;a href="http://www.bikeradar.com/beginners/category/accessories/product/multizoom-kickstand-09-34106"&gt;usually&lt;/a&gt; &lt;a href="http://www.palmbeachbiketours.com/my-name-is-ken-and-i-cant-kick-my-kickstand-habit/"&gt;raved&lt;/a&gt; about, there can be some &lt;a href="http://groups.google.com/group/SurlyLHT/browse_thread/thread/820a54a932e27cf8?pli=1"&gt;difficulty&lt;/a&gt; installing it on a Surly Long Haul Trucker (LHT). Possibly the most elegant solutions are &lt;a href="http://www.flickr.com/photos/29875423@N03/3004393116/in/set-72157607476706942/"&gt;this custom bracket&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/86532560@N00/3585834363/"&gt;this newer mount&lt;/a&gt; from Pletscher. However, I've had success with the standard bracket.&lt;br /&gt;&lt;br /&gt;First, I wrapped the frame in two layers of innertube (which &lt;a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=alpenrausch+munich&amp;sll=48.162278,11.574461&amp;sspn=0.011278,0.021865&amp;ie=UTF8&amp;ll=48.163681,11.574783&amp;spn=0.087363,0.174923&amp;z=13&amp;iwloc=A"&gt;my local bike shop&lt;/a&gt; was gracious enough to give me for free from their collection of used ones) to protect the frame and finish. Then, I used a little blue Loctite on the bolt and slowly tightened it until I was able to torque the stand without the bracket twisting.&lt;br /&gt;&lt;br /&gt;&lt;table border="0" width="100%"&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_hSHjWfzvo/Splbn501nhI/AAAAAAAAITQ/dOoaov-UTkM/s1600-h/img_0023.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/Splbn501nhI/AAAAAAAAITQ/dOoaov-UTkM/s320/img_0023.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5375428371338862098" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_hSHjWfzvo/SpldJG7wsvI/AAAAAAAAITY/i8W0dNa6W2w/s1600-h/img_0022.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/SpldJG7wsvI/AAAAAAAAITY/i8W0dNa6W2w/s320/img_0022.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5375430041304871666" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-8579877446226723182?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/DZhxCmKvQOc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/8579877446226723182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=8579877446226723182" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/8579877446226723182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/8579877446226723182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/DZhxCmKvQOc/pletscher-esge-long-haul-trucker.html" title="Pletscher ESGE on my Surly Long Haul Trucker" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_S_hSHjWfzvo/Splbn501nhI/AAAAAAAAITQ/dOoaov-UTkM/s72-c/img_0023.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/08/pletscher-esge-long-haul-trucker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HRnszeyp7ImA9WxNREkg.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-7424534579654656962</id><published>2009-08-29T17:43:00.010+02:00</published><updated>2009-09-06T17:45:37.583+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-06T17:45:37.583+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bike" /><category scheme="http://www.blogger.com/atom/ns#" term="g1" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Android G1 Bicycle Mount</title><content type="html">I recently purchased this &lt;a href="http://www.amazon.de/Aya-Media-Fahrradhalterung-Motorradhalter-Halterung-Halterschale/dp/B002BIRUWU/ref=sr_1_1?ie=UTF8&amp;amp;qid=1251561035&amp;amp;sr=8-1"&gt;bike mount&lt;/a&gt; for my Android G1. Out of the box, it didn't fit and, while holding on to my G1 fairly well, didn't withstand all my attempts to shake the phone from the cradle. So, it required a few modifications:&lt;br /&gt;&lt;br /&gt;The bracket is not big enough to fit the stem. I had to extend it with some paracord and a couple zip ties:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplTD9NNt5I/AAAAAAAAIS4/s90BQVMmNtM/s1600-h/img_0015.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplTD9NNt5I/AAAAAAAAIS4/s90BQVMmNtM/s320/img_0015.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5375418957678098322" /&gt;&lt;/a&gt;&lt;br /&gt;The zip tie above keeps the paracord from slipping off the bracket (which is where the metal bar would normally lock into place). I used figure eight knots to tie the paracord to the bar.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplT7Q8rP8I/AAAAAAAAITA/7jQw0qIqzbI/s1600-h/img_0017.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplT7Q8rP8I/AAAAAAAAITA/7jQw0qIqzbI/s320/img_0017.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5375419907870244802" /&gt;&lt;/a&gt;&lt;br /&gt;After attaching the bracket, I reinforced the spring loaded phone clip with the metal clip from a pen. There's no gluing involved, I just slid the clip in under the pivot and used another small zip tie to hold it in place:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplVHw95DLI/AAAAAAAAITI/ZMcLwHf4WNg/s1600-h/img_0008+(Modified).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 213px; height: 320px;" src="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplVHw95DLI/AAAAAAAAITI/ZMcLwHf4WNg/s320/img_0008+(Modified).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5375421222135336114" /&gt;&lt;/a&gt;&lt;br /&gt;The final addition is a strip of velcro (it's green) that slides in between the display and the keyboard and attaches to itself behind the phone clip.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_S_hSHjWfzvo/SplQ7YLcLJI/AAAAAAAAISw/uiuhEInZcNQ/s1600-h/img_0019+(Modified).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_S_hSHjWfzvo/SplQ7YLcLJI/AAAAAAAAISw/uiuhEInZcNQ/s320/img_0019+(Modified).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5375416611276336274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After my modifications, this system is quite rugged. I was not able to shake, jolt, or sling the phone free from the mount. I've also taken it on a couple of trips while commuting to work and it has held up beautifully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-7424534579654656962?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/er8HNI-UT9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/7424534579654656962/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=7424534579654656962" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/7424534579654656962?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/7424534579654656962?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/er8HNI-UT9A/android-g1-bicycle-mount.html" title="Android G1 Bicycle Mount" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_S_hSHjWfzvo/SplTD9NNt5I/AAAAAAAAIS4/s90BQVMmNtM/s72-c/img_0015.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/08/android-g1-bicycle-mount.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ACSX0yeCp7ImA9WxNQFkk.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-2340462817097586325</id><published>2009-08-20T15:26:00.004+02:00</published><updated>2009-09-22T20:56:08.390+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T20:56:08.390+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE 0.11 Alpha Released</title><content type="html">This release of ASE adds support for Perl and JRuby in addition to the usual round of bug fixes.&lt;div&gt;&lt;ul&gt;&lt;li&gt;Added process management API via &lt;a href="http://code.google.com/p/android-scripting/source/browse/android/AndroidScriptingEnvironment/src/com/google/ase/AndroidProxy.java#678"&gt;getRunningPackages()&lt;/a&gt; and &lt;a href="http://code.google.com/p/android-scripting/source/browse/android/AndroidScriptingEnvironment/src/com/google/ase/AndroidProxy.java#688"&gt;forceClosePackage()&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Added support for installing part or all of interpreters to the SD card. BeanShell, JRuby, and part of Perl are installed to the SD card now.&lt;/li&gt;&lt;li&gt;Added BeanShell example script.&lt;/li&gt;&lt;li&gt;Added SQLite and GData to Python support.&lt;/li&gt;&lt;li&gt;Fixed Lua include path to allow importing user scripts.&lt;/li&gt;&lt;li&gt;Fixed Shell support to execute scripts.&lt;/li&gt;&lt;li&gt;Fixed sensor monitoring.&lt;/li&gt;&lt;li&gt;Fixed barcode scanning.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Vist the &lt;a href="http://code.google.com/p/android-scripting"&gt;ASE project page&lt;/a&gt; to download the latest APK.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-size:100%;color:#333333;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 20px;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;JRuby is very slow, especially on the initial run. It can take up to a minute for JRuby to start up for the first run and about ten seconds every time after that.&lt;/li&gt;&lt;li&gt;Python is a bit larger now with SQLite and GData support. I should be able to cut the size in half soon by installing many of the modules to the SD card.&lt;/li&gt;&lt;li&gt;Building Perl is still a little buggy and has many manual, undocumented steps. I'll be improving that soon.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-2340462817097586325?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/iifj-ebBfpA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/2340462817097586325/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=2340462817097586325" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/2340462817097586325?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/2340462817097586325?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/iifj-ebBfpA/ase-011-alpha-released.html" title="ASE 0.11 Alpha Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/08/ase-011-alpha-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIEQ3kycCp7ImA9WxJbGUU.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-3257615816738865281</id><published>2009-07-30T22:21:00.009+02:00</published><updated>2009-07-30T22:58:22.798+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-30T22:58:22.798+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="electronics" /><category scheme="http://www.blogger.com/atom/ns#" term="repair" /><category scheme="http://www.blogger.com/atom/ns#" term="wii" /><title>Is your Wii power supply broken?</title><content type="html">&lt;div&gt;I just got a brand new &lt;a href="http://www.alternate.de/html/product/LCD-TVs_bis_40_Zoll/Samsung/LE40B650/331870/?"&gt;40" LCD TV&lt;/a&gt; (which, by the way, is awesome) this morning and started testing it out. First the PC, then the Xbox 360, then the PlayStation, and finally I tried turning on my Wii and nothing happened. No lights, no sounds, nothing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I started troubleshooting:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Check the connections to the Wii; looks good.&lt;/li&gt;&lt;li&gt;Change the surge protector socket it's plugged into; no change.&lt;/li&gt;&lt;li&gt;Reset the surge protector; still nothing.&lt;/li&gt;&lt;li&gt;Measured the voltage in the socket (any excuse to use my fancy new &lt;a href="http://www1.conrad.de/scripts/wgate/zcop_b2c/%7EflNlc3Npb249UDkwV0dBVEU6Q19BR0FURTE0OjAwMDEuMDExNS45OWRkM2NmOCZ+aHR0cF9jb250ZW50X2NoYXJzZXQ9aXNvLTg4NTktMSZ+U3RhdGU9MTU2NzU4NTk5Nw==?%7Etemplate=PCAT_AREA_S_BROWSE&amp;amp;mfhelp=&amp;amp;p_selected_area=$ROOT&amp;amp;p_selected_area_fh=&amp;amp;perform_special_action=&amp;amp;glb_user_js=Y&amp;amp;shop=B2C&amp;amp;vgl_artikel_in_index=&amp;amp;product_show_id=&amp;amp;p_page_to_display=DirektSearch&amp;amp;%7Ecookies=1&amp;amp;zhmmh_lfo=&amp;amp;zhmmh_area_kz=&amp;amp;s_haupt_kategorie=&amp;amp;p_searchstring=voltcraft+vc270&amp;amp;p_searchstring_artnr=&amp;amp;p_searchstring_manufac_artnr=&amp;amp;p_search_category=alle&amp;amp;fh_directcall=&amp;amp;r3_matn=&amp;amp;insert_kz=&amp;amp;gvlon=&amp;amp;area_s_url=&amp;amp;brand=&amp;amp;amount=&amp;amp;new_item_quantity=&amp;amp;area_url=&amp;amp;direkt_aufriss_area=&amp;amp;p_countdown=&amp;amp;p_80=&amp;amp;p_80_category=&amp;amp;p_80_article=&amp;amp;p_next_template_after_login=&amp;amp;mindestbestellwert=&amp;amp;login=&amp;amp;password=&amp;amp;bpemail=&amp;amp;bpid=&amp;amp;url=&amp;amp;show_wk=&amp;amp;use_search=3&amp;amp;p_back_template=&amp;amp;template=&amp;amp;kat_save=&amp;amp;updatestr=&amp;amp;vgl_artikel_in_vgl=&amp;amp;titel=&amp;amp;darsteller=&amp;amp;regisseur=&amp;amp;anbieter=&amp;amp;genre=&amp;amp;fsk=&amp;amp;jahr=&amp;amp;jahr2=&amp;amp;dvd_error=X&amp;amp;dvd_empty_error=X&amp;amp;dvd_year_error=&amp;amp;call_dvd=&amp;amp;kna_news=&amp;amp;p_status_scenario=&amp;amp;documentselector=&amp;amp;aktiv=&amp;amp;gewinnspiel=&amp;amp;p_load_area=$ROOT&amp;amp;p_artikelbilder_mode=&amp;amp;p_sortopt=&amp;amp;page=&amp;amp;p_catalog_max_results=20"&gt;volt meter&lt;/a&gt;); a solid 110V.&lt;/li&gt;&lt;li&gt;Measured the voltage from the power supply; a solid 0V. Bingo.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;At this point I was releived to find that my Wii was most likely not dead. This evening I started looking into repairing power supplies. I found a &lt;a href="http://www.repairfaq.org/sam/smpsfaq.htm"&gt;couple&lt;/a&gt; &lt;a href="http://www.mikesarcade.com/cgi-bin/spies.cgi?action=url&amp;amp;type=info&amp;amp;page=psrepair.txt"&gt;sites&lt;/a&gt; that gave me hope, so I decided to crack it open and see what I could find. That's when I discovered that my &lt;a href="http://www.boxertool.com/"&gt;BX-100 bit set&lt;/a&gt; was missing the appropriate bit for the screws Nintendo used. Flabergasted, I found &lt;a href="http://chrismeyer.org/wordpress/tag/wii-power-supply/"&gt;Chris Meyer's site&lt;/a&gt; which suggest just using needle-nose pliers. I found that wire snips actually worked best since I could grip the dimples easily with the sharp edges. The hardest part was actually popping apart the plastic pieces (I suggest a butter knife or a metal plaster spatula/scraper).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, what's more interesting than his instructions are his results. He and I both found nothing wrong, put the brick back together, and then discovered it was magically working again. This could be a coincidence, but I think it's more likely that simply leaving the power supply unplugged for long enough allows it to reset.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With that, here is my suggestion if you find that your own Wii power supply has suddenly stopped working: before you tear it up trying to fix it, just unplug it and go outside to play instead. Maybe when you come back, it will love you again.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-3257615816738865281?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/x6X_yoVIK9U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/3257615816738865281/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=3257615816738865281" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3257615816738865281?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3257615816738865281?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/x6X_yoVIK9U/broken-wii-power-supply.html" title="Is your Wii power supply broken?" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/07/broken-wii-power-supply.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDQnY7eSp7ImA9WxJbFEw.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-295569945934581092</id><published>2009-07-23T18:37:00.011+02:00</published><updated>2009-07-24T08:52:53.801+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-24T08:52:53.801+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE 0.10 Alpha Released</title><content type="html">&lt;div&gt;This release of ASE has many enhancements and bug fixes.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Streamlined iterative script development with Save &amp;amp; Run in the script editor and Exit &amp;amp; Edit in the terminal.&lt;/li&gt;&lt;li&gt;Interpreter installation has been improved to provide better feedback (errors are now reported to the user) and better error detection.&lt;/li&gt;&lt;li&gt;It is now possible to get help for RPC methods via the help() RPC. Currently, this is best supported in Python which will nicely format the output.&lt;/li&gt;&lt;li&gt;Shell was added as an included scripting language.&lt;/li&gt;&lt;li&gt;Scripts can be embedded into and directly imported from QR codes. Use the &lt;a href="http://zxing.appspot.com/generator/"&gt;Zxing QR Code Generator&lt;/a&gt; to start sharing your scripts directly from your blog. Create a plain-text code with the name of the script on the first line and the script on the following lines. You can embed scripts up to approximately 4kb in size.&lt;/li&gt;&lt;li&gt;Added geocoder API. See the weather.py example script.&lt;/li&gt;&lt;li&gt;Added phone state monitoring to detect incoming calls.&lt;/li&gt;&lt;li&gt;Added event API. Instead of always polling for the latest value, you can have create an event loop and use the receiveEvent() RPC to get the latest event from sensors, location, and phone state. &lt;/li&gt;&lt;li&gt;Added notification API. Notifications can be generated using the notify() RPC. See the notify_weather.py example script.&lt;/li&gt;&lt;li&gt;Documentation updates on the &lt;a href="http://code.google.com/p/android-scripting"&gt;project page&lt;/a&gt; will follow soon. The impatient can check out the &lt;a href="http://code.google.com/p/android-scripting/source/browse/trunk/android/AndroidScriptingEnvironment/src/com/google/ase/AndroidProxy.java"&gt;source&lt;/a&gt; :)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Vist the &lt;a href="http://code.google.com/p/android-scripting"&gt;ASE project page&lt;/a&gt; to download the latest APK.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Updates&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I made three releases of version 0.10 alpha (0.10, 0.10-1, 0.10-2). The 0.10-1 version was just to increase the version number which I forgot to do before the original release. The 0.10-2 version fixes a couple nasty force close bugs.&lt;/li&gt;&lt;li&gt;Updated the &lt;a href="http://android-scripting.googlecode.com/svn/trunk/android/AndroidScriptingEnvironment/doc/index.html"&gt;Javadoc&lt;/a&gt;. Check out the @Rpc annotations in AndroidProxy for RPC documentation.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-295569945934581092?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/oTK0pCJ8j0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/295569945934581092/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=295569945934581092" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/295569945934581092?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/295569945934581092?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/oTK0pCJ8j0E/ase-010-alpha-released.html" title="ASE 0.10 Alpha Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/07/ase-010-alpha-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcFQncyeSp7ImA9WxJUGU8.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-4576716491464933979</id><published>2009-07-18T15:19:00.003+02:00</published><updated>2009-07-18T15:33:33.991+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-18T15:33:33.991+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="svn" /><title>Make Eclipse Ignore .svn Directories</title><content type="html">I've struggled with this for a while now. But, I think I've found all the appropriate settings now.&lt;br /&gt;&lt;br /&gt;Project &gt; Properties &gt; Java Build Path&lt;br /&gt;For each source folder, edit Excluded to include the pattern "**/.svn*"&lt;br /&gt;&lt;br /&gt;Project &gt; Properties &gt; Java Compiler &gt; Building &gt; Enable project specific settings&lt;br /&gt;Check the box.&lt;br /&gt;&lt;br /&gt;Project &gt; Properties &gt; Java Compiler &gt; Building &gt; Output folder &gt; Filtered resources&lt;br /&gt;Add ".svn/" so that it reads "*.launch, .svn/"&lt;br /&gt;&lt;br /&gt;YMMV :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-4576716491464933979?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/FpNFhxA_sUg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/4576716491464933979/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=4576716491464933979" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/4576716491464933979?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/4576716491464933979?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/FpNFhxA_sUg/make-eclipse-ignore-svn-directories.html" title="Make Eclipse Ignore .svn Directories" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/07/make-eclipse-ignore-svn-directories.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAASHo_fCp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-3200434898697213125</id><published>2009-07-07T23:29:00.003+02:00</published><updated>2009-07-07T23:39:09.444+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T23:39:09.444+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE 0.9 Alpha Released</title><content type="html">Interpreters installation is now handled entirely within ASE (no more downloading in the browser). Besides streamlining the interpreter installation process, this release is mostly about bug fixes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Changing orientation in the terminal no longer restarts the running script.&lt;/li&gt;&lt;li&gt;Terminal preferences are now applied properly.&lt;/li&gt;&lt;li&gt;Added aTrackDog support to the manifest.&lt;/li&gt;&lt;li&gt;Saving scripts now works as expected without workarounds.&lt;/li&gt;&lt;/ul&gt;Visit the &lt;a href="http://code.google.com/p/android-scripting"&gt;ASE project page&lt;/a&gt; to download the new APK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-3200434898697213125?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/IkErsk9u258" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/3200434898697213125/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=3200434898697213125" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3200434898697213125?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3200434898697213125?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/IkErsk9u258/ase-09-alpha-released.html" title="ASE 0.9 Alpha Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/07/ase-09-alpha-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFRHoyfip7ImA9WxJWFEw.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-6468074856730264039</id><published>2009-06-19T09:26:00.006+02:00</published><updated>2009-06-19T15:38:35.496+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-19T15:38:35.496+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ASE 0.8 Alpha Released</title><content type="html">I just finished releasing version 0.8 alpha. The most significant changes in this release are:&lt;ul&gt;&lt;li&gt;À la carte interpreter installation. which drops the installation size from 4.3MB to 900kB. With all interpreters installed, ASE now takes 7.9MB.&lt;/li&gt;&lt;li&gt;User scripts are now stored on the SD card and persisted across reinstallations of ASE. This should also make it easier to copy scripts to the device from a host computer or the web.&lt;/li&gt;&lt;/ul&gt;Visit the &lt;a href="http://code.google.com/p/android-scripting"&gt;ASE project page&lt;/a&gt; to download the new APK. To install interpreters, click Menu, Help, then follow the directions under the InstallingInterpreters wiki page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-6468074856730264039?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/pxVJEUdAeG0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/6468074856730264039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=6468074856730264039" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6468074856730264039?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6468074856730264039?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/pxVJEUdAeG0/ase-08-alpha-released.html" title="ASE 0.8 Alpha Released" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/06/ase-08-alpha-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMCQnwycSp7ImA9WxJXF08.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-6897448413446554091</id><published>2009-06-11T13:53:00.003+02:00</published><updated>2009-06-11T14:14:23.299+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-11T14:14:23.299+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="puzzles" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="npr" /><category scheme="http://www.blogger.com/atom/ns#" term="car talk" /><title>Solving Car Talk Puzzlers with Python</title><content type="html">If you're not familiar with &lt;a href="http://en.wikipedia.org/wiki/Car_Talk"&gt;Car Talk&lt;/a&gt;, it's a horrible talk radio show hosted by Tom and Ray Magliozzi (aka Click and Clack the Tappet brothers). Every week there is a new puzzler and every so often it's math oriented. After hearing this week's mathy puzzler, I thought it would be fun to dig into the archives (&lt;a href="http://www.cartalk.com/content/puzzler/2009.html"&gt;2009&lt;/a&gt; and &lt;a href="http://www.cartalk.com/content/puzzler/2008.html"&gt;2008&lt;/a&gt;) and try solving a few of them in Python. Here's what I came up with:&lt;pre class="prettyprint"&gt;# 2008-10-20 The Perfect Square Dance!&lt;br /&gt;import itertools, math&lt;br /&gt;&lt;br /&gt;for numbers in itertools.permutations(range(1, 19)):&lt;br /&gt;  for a, b in zip(numbers[::2], numbers[1::2]):&lt;br /&gt;    sqrt = math.sqrt(a + b)&lt;br /&gt;    if not str(sqrt).endswith('.0'):&lt;br /&gt;      break&lt;br /&gt;    if a == 1:&lt;br /&gt;      sallys_partner = b&lt;br /&gt;    elif b == 1:&lt;br /&gt;      sallys_partner = a&lt;br /&gt;  else:&lt;br /&gt;    print 'Sally danced with %d' % sallys_partner&lt;br /&gt;    break&lt;br /&gt;&lt;br /&gt;# 2008-10-27 One is the Magic Number&lt;br /&gt;print ''.join(str(n) for n in xrange(0, 1000000)).count('1')&lt;br /&gt;&lt;br /&gt;# 2008-12-08 It's Math Time!&lt;br /&gt;for ab in xrange(10, 100):&lt;br /&gt;  cab = ab ** 2&lt;br /&gt;  if str(cab)[1:] == str(ab):&lt;br /&gt;    print cab&lt;br /&gt;    break&lt;br /&gt;&lt;br /&gt;# 2009-05-26 Equate This!&lt;br /&gt;from __future__ import division  # Avoids truncation.&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;numbers = [2, 3, 4, 5]&lt;br /&gt;operations = ['*', '**', '+', '-', '/']&lt;br /&gt;&lt;br /&gt;while True:&lt;br /&gt;  random.shuffle(numbers)&lt;br /&gt;  random.shuffle(operations)&lt;br /&gt;  equation = ''&lt;br /&gt;  for i, number in enumerate(numbers):&lt;br /&gt;    equation += str(number)&lt;br /&gt;    if i &lt; len(numbers) - 1:&lt;br /&gt;      equation += operations[i]&lt;br /&gt;  result = eval(equation)&lt;br /&gt;  if result == 26:&lt;br /&gt;    print equation&lt;br /&gt;    break&lt;br /&gt;&lt;br /&gt;# 2009-06-08 Number One&lt;br /&gt;print len([n for n in xrange(0, 1000000) if '1' not in str(n)])&lt;/pre&gt;I'd like to see someone good with Ruby, Perl, or Lua do the same so we can compare solutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-6897448413446554091?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/ym7DHmP1uTo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/6897448413446554091/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=6897448413446554091" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6897448413446554091?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6897448413446554091?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/ym7DHmP1uTo/solving-car-talk-puzzlers-with-python.html" title="Solving Car Talk Puzzlers with Python" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/06/solving-car-talk-puzzlers-with-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYCQ3g-fip7ImA9WxJXFkg.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-6190796244644960240</id><published>2009-06-09T06:00:00.008+02:00</published><updated>2009-06-10T18:09:22.656+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T18:09:22.656+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="ase" /><category scheme="http://www.blogger.com/atom/ns#" term="lua" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Scripting on Android</title><content type="html">Today I released a project I've been working on for some time. You may remember a couple earlier posts where I got &lt;a href="http://www.damonkohler.com/2008/12/python-on-android.html"&gt;Python&lt;/a&gt; and &lt;a href="http://www.damonkohler.com/2008/12/lua-on-android.html"&gt;Lua&lt;/a&gt; working on Android. I've wrapped up those hacks into a nice Android application called &lt;a href="http://code.google.com/p/android-scripting"&gt;Android Scripting Environment&lt;/a&gt; (ASE).&lt;br /&gt;&lt;br /&gt;But wait, there's more! See the &lt;a href="http://google-opensource.blogspot.com/2009/06/introducing-android-scripting.html"&gt;official blog post&lt;/a&gt; on the Google Open Source Blog and the &lt;a href="http://code.google.com/p/android-scripting"&gt;project page&lt;/a&gt; for details. Further updates will be publish here with the "ase" tag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-6190796244644960240?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/irQQCVInv-I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/6190796244644960240/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=6190796244644960240" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6190796244644960240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/6190796244644960240?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/irQQCVInv-I/scripting-on-android.html" title="Scripting on Android" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/06/scripting-on-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8NRXw9fyp7ImA9WxJSGUk.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-3813824023346368130</id><published>2009-05-10T10:19:00.010+02:00</published><updated>2009-05-10T11:48:14.267+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-10T11:48:14.267+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="webcam" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="uvc" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Logitech Pan/Tilt Python C Extension</title><content type="html">I just started learning C++ in earnest about a month ago. This weekend I felt like I knew enough to start looking at Python C extensions, so I wrote one to control the pan and tilt functions of my &lt;a href="http://www.logitech.com/index.cfm/webcam_communications/webcams/devices/3480&amp;amp;cl=US,EN"&gt;Logitech Orbit&lt;/a&gt;. I used this camera previously for my &lt;a href="http://www.google.com/search?q=olpc+telepresence"&gt;OLPC telepresence&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;There's already a similar module out there, called &lt;a href="http://code.google.com/p/lpantilt/"&gt;lpantilt&lt;/a&gt;, that does this using &lt;a href="http://www.cython.org/"&gt;Cython&lt;/a&gt;. But, I wanted to take a crack at it myself and do it with straight C.&lt;pre class="prettyprint"&gt;#include &amp;lt;Python.h&amp;gt;&lt;br /&gt;#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include "linux/videodev2.h"&lt;br /&gt;#include "uvcvideo.h"&lt;br /&gt;&lt;br /&gt;static int pantilt(int pan, int tilt, int reset) {&lt;br /&gt; struct v4l2_ext_control xctrls[2];&lt;br /&gt; struct v4l2_ext_controls ctrls;&lt;br /&gt;&lt;br /&gt; if (reset) {&lt;br /&gt;   xctrls[0].id = V4L2_CID_PAN_RESET;&lt;br /&gt;   xctrls[0].value = 1;&lt;br /&gt;   xctrls[1].id = V4L2_CID_TILT_RESET;&lt;br /&gt;   xctrls[1].value = 1;&lt;br /&gt; } else {&lt;br /&gt;   xctrls[0].id = V4L2_CID_PAN_RELATIVE;&lt;br /&gt;   xctrls[0].value = pan;&lt;br /&gt;   xctrls[1].id = V4L2_CID_TILT_RELATIVE;&lt;br /&gt;   xctrls[1].value = tilt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; ctrls.count = 2;&lt;br /&gt; ctrls.controls = xctrls;&lt;br /&gt;&lt;br /&gt; int fd;&lt;br /&gt; if (-1 == (fd = open("/dev/video0", O_RDWR))) {&lt;br /&gt;   PyErr_SetString(PyExc_IOError, "Couldn't open /dev/video0.");&lt;br /&gt;   return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (-1 == ioctl(fd, VIDIOC_S_EXT_CTRLS, &amp;amp;ctrls)) {&lt;br /&gt;   PyErr_SetString(PyExc_IOError, "ioctl failed.");&lt;br /&gt;   return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (-1 == close(fd)) {&lt;br /&gt;   PyErr_SetString(PyExc_IOError, "Failed to close /dev/video0.");&lt;br /&gt;   return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static PyObject* pantilt_reset(PyObject* self, PyObject* args) {&lt;br /&gt; if (!PyArg_ParseTuple(args, "")) {&lt;br /&gt;   return NULL;&lt;br /&gt; }&lt;br /&gt; if (!pantilt(0, 0, 1)) {&lt;br /&gt;   return NULL;&lt;br /&gt; }&lt;br /&gt; Py_RETURN_NONE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static PyObject* pantilt_pantilt(PyObject* self, PyObject* args) {&lt;br /&gt; int pan;&lt;br /&gt; int tilt;&lt;br /&gt; if (!PyArg_ParseTuple(args, "ii", &amp;amp;pan, &amp;amp;tilt)) {&lt;br /&gt;   return NULL;&lt;br /&gt; }&lt;br /&gt; if (!pantilt(pan * 64, tilt * 64, 0)) {&lt;br /&gt;   return NULL;&lt;br /&gt; }&lt;br /&gt; Py_RETURN_NONE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static PyMethodDef PantiltMethods[] = {&lt;br /&gt; {"pantilt", pantilt_pantilt, METH_VARARGS, "Set relative pan and tilt of the camera."},&lt;br /&gt; {"reset", pantilt_reset, METH_VARARGS, "Reset the pan and tilt of the camera."},&lt;br /&gt; {NULL, NULL, 0, NULL}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;PyMODINIT_FUNC initpantilt(void) {&lt;br /&gt; (void) Py_InitModule("pantilt", PantiltMethods);&lt;br /&gt;}&lt;/pre&gt;And here is the associated &lt;code&gt;setup.py&lt;/code&gt; script to build it:&lt;pre class="prettyprint"&gt;from distutils.core import Extension&lt;br /&gt;from distutils.core import setup&lt;br /&gt;&lt;br /&gt;m = Extension('pantilt', sources=['pantilt.c'])&lt;br /&gt;&lt;br /&gt;setup(name='pantilt',&lt;br /&gt; version='1.0',&lt;br /&gt; description='Control pan and tilt of supported webcams.',&lt;br /&gt; ext_modules=[m])&lt;/pre&gt;To get this to build and run on Ubuntu, I had to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download and install &lt;a href="http://www.quickcamteam.net/software/libwebcam"&gt;libwebcam&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Execute &lt;code&gt;uvcdynctrl -i logitech.xml&lt;/code&gt; (&lt;code&gt;logitech.xml&lt;/code&gt; can be found in the source for libwebcam).&lt;/li&gt;&lt;li&gt;Install the &lt;code&gt;linux-source-*&lt;/code&gt; package and extract the &lt;code&gt;/usr/src/linux-source*.tar.bz2&lt;/code&gt; to disk.&lt;/li&gt;&lt;li&gt;Copy &lt;code&gt;uvcvideo.h&lt;/code&gt; in to the same directory as &lt;code&gt;pantilt.c&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Execute &lt;code&gt;python setup.py install&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;Finally, here's a sample usage of the pantilt module:&lt;pre class="prettyprint"&gt;import pantilt, time&lt;br /&gt;&lt;br /&gt;pantilt.reset()  # Reset the pan and tilt to the origin.&lt;br /&gt;time.sleep(1)&lt;br /&gt;pantilt.pantilt(10, 0)  # Increase relative pan by 10 degrees.&lt;br /&gt;pantilt.pantilt(0, 10)  # Increase relative tilt by 10 degrees.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-3813824023346368130?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/TQ6ryukv-rg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/3813824023346368130/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=3813824023346368130" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3813824023346368130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/3813824023346368130?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/TQ6ryukv-rg/logitech-pantilt-python-c-extension.html" title="Logitech Pan/Tilt Python C Extension" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/05/logitech-pantilt-python-c-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMERXc-eip7ImA9WxJSGUU.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-1135519217810047315</id><published>2009-04-27T20:55:00.005+02:00</published><updated>2009-05-10T21:06:44.952+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-10T21:06:44.952+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="wireless" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="networking" /><title>Ubuntu Jaunty Wireless and RT61PCI</title><content type="html">I upgraded to Jaunty yesterday and again had to struggle with my wireless. This time, it wasn't necessary to install a new kernel module. Instead, I just needed to remove Network Manager and set up &lt;a href="http://en.wikipedia.org/wiki/Wpa_supplicant"&gt;wpa_supplicant&lt;/a&gt;. Here's my new &lt;code&gt;/etc/network/interfaces&lt;/code&gt; that I configured for my WPA2 PSK AES TLA network.&lt;pre class="prettyprint"&gt;auto wlan0&lt;br /&gt;iface wlan0 inet dhcp&lt;br /&gt;wpa-driver wext&lt;br /&gt;wpa-conf managed&lt;br /&gt;wpa-ssid myssid&lt;br /&gt;wpa-ap-scan 1&lt;br /&gt;wpa-proto RSN&lt;br /&gt;wpa-pairwise CCMP&lt;br /&gt;wpa-group CCMP&lt;br /&gt;wpa-key-mgmt WPA-PSK&lt;br /&gt;wpa-psk mypsk&lt;br /&gt;&lt;/pre&gt;With that, all I needed to do was &lt;code&gt;sudo /etc/init.d/networking restart&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-1135519217810047315?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/oRgnha1xd-4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/1135519217810047315/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=1135519217810047315" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1135519217810047315?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/1135519217810047315?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/oRgnha1xd-4/ubuntu-jaunty-wireless-and-rt61pci.html" title="Ubuntu Jaunty Wireless and RT61PCI" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/04/ubuntu-jaunty-wireless-and-rt61pci.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AESHs8fyp7ImA9WxJTFk0.&quot;"><id>tag:blogger.com,1999:blog-3604425971259502766.post-8619881643708543472</id><published>2009-04-24T23:32:00.002+02:00</published><updated>2009-04-24T23:48:29.577+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-24T23:48:29.577+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="anonymous" /><category scheme="http://www.blogger.com/atom/ns#" term="peertopeer" /><category scheme="http://www.blogger.com/atom/ns#" term="friendtofriend" /><category scheme="http://www.blogger.com/atom/ns#" term="darknet" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>OneSwarm is what I've been waiting for!</title><content type="html">&lt;a href="http://oneswarm.cs.washington.edu/index.html"&gt;OneSwarm&lt;/a&gt; is a &lt;a href="http://en.wikipedia.org/wiki/Friend-to-friend"&gt;friend-to-friend&lt;/a&gt; (F2F) file sharing network built on BitTorrent and SSL. This is an idea I've been tossing around for awhile and now, I'm happy to say, I don't have to write it myself. Here are the main selling points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open source. Hooray!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cross platform. OneSwarm is written in Java and they have binaries for OS X, Windows, and Linux.&lt;/li&gt;&lt;li&gt;Friend-to-friend. I'm not interested in sharing with the world, just amongst my friends.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;BitTorrent based transfers. That means swarming for common files shared among your friends. My previous F2F client &lt;a href="http://en.wikipedia.org/wiki/WASTE"&gt;WASTE&lt;/a&gt; doesn't offer that.&lt;/li&gt;&lt;li&gt;Point to point SSL encryption. I feel much better about SSL than the encryption scheme used by WASTE.&lt;/li&gt;&lt;li&gt;Google Talk integration. OneSwarm piggybacks key distribution over GTalk. That really makes life easy.&lt;/li&gt;&lt;li&gt;Web interface. It lends itself to remote administration.&lt;/li&gt;&lt;/ul&gt;I've only just started using it, so I'll post again with my experiences later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3604425971259502766-8619881643708543472?l=www.damonkohler.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/damonkohler/~4/yYwlLNwi9qg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.damonkohler.com/feeds/8619881643708543472/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3604425971259502766&amp;postID=8619881643708543472" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/8619881643708543472?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3604425971259502766/posts/default/8619881643708543472?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/damonkohler/~3/yYwlLNwi9qg/oneswarm-is-what-ive-been-waiting-for.html" title="OneSwarm is what I've been waiting for!" /><author><name>Damon</name><uri>http://www.blogger.com/profile/17362087152286203901</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03757104139415985158" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.damonkohler.com/2009/04/oneswarm-is-what-ive-been-waiting-for.html</feedburner:origLink></entry></feed>
