<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
      <title>Damon Kohler</title>
      <link>https://blog-damonkohler.pages.dev</link>
      <description>Last 50 notes on Damon Kohler</description>
      <generator>Quartz -- quartz.jzhao.xyz</generator>
      <item>
    <title>About Me</title>
    <link>https://blog-damonkohler.pages.dev/</link>
    <guid>https://blog-damonkohler.pages.dev/</guid>
    <description><![CDATA[ &lt;p&gt;I’m a software engineer in Munich. By day I work on &lt;a href=&quot;https://cloud.google.com/sovereign-cloud?hl=en&quot; class=&quot;external&quot;&gt;Google Cloud Dedicated&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. In past lives I built &lt;a href=&quot;https://github.com/cartographer-project/cartographer&quot; class=&quot;external&quot;&gt;Cartographer&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (LiDAR SLAM, &lt;a href=&quot;./Blog/Posts/Cartographer-Launch!&quot; class=&quot;internal alias&quot; data-slug=&quot;Blog/Posts/Cartographer-Launch!&quot;&gt;story&lt;/a&gt;), &lt;a href=&quot;https://github.com/rosjava/rosjava_core&quot; class=&quot;external&quot;&gt;rosjava&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (&lt;a href=&quot;./Blog/Posts/Introduction-to-rosjava-at-ROSCon-2012&quot; class=&quot;internal alias&quot; data-slug=&quot;Blog/Posts/Introduction-to-rosjava-at-ROSCon-2012&quot;&gt;story&lt;/a&gt;), and &lt;a href=&quot;https://github.com/damonkohler/sl4a&quot; class=&quot;external&quot;&gt;SL4A&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (&lt;a href=&quot;./Blog/Posts/SL4A-(Scripting-Layer-for-Android)&quot; class=&quot;internal alias&quot; data-slug=&quot;Blog/Posts/SL4A-(Scripting-Layer-for-Android)&quot;&gt;story&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This is where I write about tech, home automation, robotics, and whatever else I’m tinkering with.&lt;/p&gt; ]]></description>
    <pubDate>Mon, 27 Apr 2026 20:54:54 GMT</pubDate>
  </item><item>
    <title>Cartographer Launch!</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Cartographer-Launch!</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Cartographer-Launch!</guid>
    <description><![CDATA[ &lt;p&gt;Yesterday, a project at Google that I’ve been putting a lot of work into launched! You can read about it on the &lt;a href=&quot;http://google-latlong.blogspot.com/2014/09/making-of-maps-cornerstones.html&quot; class=&quot;external&quot;&gt;Google Lat Long blog&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and a few &lt;a href=&quot;http://techcrunch.com/2014/09/04/google-unveils-the-cartographer-its-indoor-mapping-backpack/&quot; class=&quot;external&quot;&gt;other&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;http://gizmodo.com/the-funny-backpack-to-google-uses-to-map-the-insides-of-1630558373&quot; class=&quot;external&quot;&gt;places&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;http://www.businessinsider.in/sai/Heres-The-Funny-Looking-Backpack-Google-Uses-To-Map-The-Insides-Of-Buildings/articleshow/41720293.cms&quot; class=&quot;external&quot;&gt;of&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; &lt;a href=&quot;http://www.theverge.com/2014/9/4/6104379/googles-cartographer-is-a-backpack-for-mapping-buildings&quot; class=&quot;external&quot;&gt;note&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cartographer is a backpack that uses &lt;a href=&quot;https://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping&quot; class=&quot;external&quot;&gt;SLAM&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; to build maps of the world in real time. The operator can annotate the map on the fly as they explore and then the results wind up on Google Maps. While the pack may be &lt;a href=&quot;http://www.businessinsider.in/sai/Heres-The-Funny-Looking-Backpack-Google-Uses-To-Map-The-Insides-Of-Buildings/articleshow/41720293.cms&quot; class=&quot;external&quot;&gt;funny&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;http://gizmodo.com/the-funny-backpack-to-google-uses-to-map-the-insides-of-1630558373&quot; class=&quot;external&quot;&gt;looking&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, we still love it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/Cartographer-Backpack.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The backpack has a desktop-class computer, a couple multi-echo laser scanners (30m range and 270° FOV), and an IMU. The map is displayed and annotated on an Android tablet.&lt;/p&gt;
&lt;p&gt;Here’s one of the first maps we launched: [&lt;em&gt;sic&lt;/em&gt;. The embedding is lost to time.]&lt;/p&gt;
&lt;p&gt;Some of the system is built on &lt;a href=&quot;http://www.ros.org/&quot; class=&quot;external&quot;&gt;ROS&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and my &lt;a href=&quot;https://www.youtube.com/watch?v=FxXBUp-4800&quot; class=&quot;external&quot;&gt;previous work&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; on &lt;a href=&quot;http://wiki.ros.org/rosjava&quot; class=&quot;external&quot;&gt;rosjava&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Using ROS has been invaluable, especially during the prototyping stage. Our SLAM stack, however, is all home grown to meet the demands of robust, real time mapping on a fast moving, unstable platform (i.e. the operator’s back).&lt;/p&gt; ]]></description>
    <pubDate>Fri, 05 Sep 2014 15:23:00 GMT</pubDate>
  </item><item>
    <title>Understanding Kalman Filters</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Understanding-Kalman-Filters</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Understanding-Kalman-Filters</guid>
    <description><![CDATA[ &lt;p&gt;Kalman filters are notoriously difficult to comprehend. I’ve come to the conclusion that, for people like me, it’s mostly due to the notation used in their description. For those of you like me, I offer the following, fancy-equation-free explanation of the one-dimensional Kalman filter.&lt;/p&gt;
&lt;p&gt;I prefer code to equations. Those of you like me know that mathematicians and physicists are fond of their single Greek letter variables, subscripts, superscripts, and the other secret scrawls they use to exchange knowledge of simple concepts. This explanation is in Python and uses only simple math. If simple addition, subtraction, multiplication, and division scare you away, then I can’t help you.&lt;/p&gt;
&lt;p&gt;The fanciest thing we’ll be talking about are Gaussian (aka normal) distributions. If those are unfamiliar to you, then you’ll need to start by learning about those &lt;a href=&quot;https://www.khanacademy.org/math/probability/statistics-inferential/normal_distribution/v/introduction-to-the-normal-distribution&quot; class=&quot;external&quot;&gt;someplace else&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Instead of jumping directly into implementing a Kalman filter, I’m going to let it sneak up on you.&lt;/p&gt;
&lt;p&gt;We’ll start with a trivial filter. This filter assumes that we can perfectly measure our state. For example, imagine you’re modeling the position of a robot moving along a number line. If you have a sensor that tells you the exact position of the robot at all times, your filter may look like this:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#!/usr/bin/python3.2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; TrivialFilter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; step&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, measurement):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;measurement: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;__main__&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  trivial_filter &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; TrivialFilter()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Step: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; step).center(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;-&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; trivial_filter.step(state)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Awesome, right? A more realistic example would involve noisy measurements.&lt;/p&gt;
&lt;p&gt;We’ll start with an intuitive filter that I’ll call a prediction filter. The prediction filter isn’t much of a filter at all. It takes the previous state, modifies it in a controlled way, and returns the new state. For example, imagine you’re modeling the position of a robot moving along a number line at a constant speed. The position of the robot will change in a predictable way at each time step like so: &lt;code&gt;position += speed * time_between_steps&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let’s implement the &lt;code&gt;PredictionFilter&lt;/code&gt; in Python. In this example, the &lt;code&gt;state&lt;/code&gt; is the robot’s position, the &lt;code&gt;control&lt;/code&gt; is the robot’s speed, and the time between steps is &lt;code&gt;1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;xxxxx instead, start with a stupid filter that actually just measures the real value, then add noise to that value and compensate for it with a known control value&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#!/usr/bin/python3.2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; PredictionFilter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; step&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, previous_state, control):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;previous_state: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_state)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;state: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;control: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;__main__&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  prediction_filter &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; PredictionFilter()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  position &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  speed &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Step: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; step).center(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;-&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    position &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; prediction_filter.step(position, speed)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;And the output:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;$ ./predict.py &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 0-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 0.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 1-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 1.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 2-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 2.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 3&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 3-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 3.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 4&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 4-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 4.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 5&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 5-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 5.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 6&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Awesome, it works! How do we know it works? Well, because it makes sense. If the robot is at position 5 and increases its position by 1 then it is at position 6. If the control (the robot’s speed) changes unpredictably, our filter stops working very well. Let’s change it a bit and see what happens.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; random&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  ...&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Step: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; step).center(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;-&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    position &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; prediction_filter.step(position, speed &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; random.gauss(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can see we’ve added a bit of Gaussian noise to the speed. Let’s see what it does to the output.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;$ ./predict.py &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 0-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 0.000000&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 3.0003131009691333&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 3.0003131009691333&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 1-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 3.000313&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 3.3164885488423366&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 0.3161754478732032&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 2-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 3.316489&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 2.2411313976400775&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: -1.075357151202259&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 3-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 2.241131&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 2.4912475435214385&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 0.250116145881361&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 4-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 2.491248&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 4.127774023303738&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 1.6365264797823&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;------------------------------------Step: 5-------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;previous_state: 4.127774&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;state: 4.232442829737389&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;control: 0.1046688064336504&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Oh noes! At step 5, we should be at position 6 and we’re somewhere between 4 and 5. Bummer. We need a better filter.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; random&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; AlphaBetaFilter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __init__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, alpha, beta):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.alpha &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; alpha&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.beta &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; beta&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; step&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, previous_state, previous_control, measurement):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    predicted_state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_control&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    innovation &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_state&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.alpha &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; innovation&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    control &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_control &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.beta &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; innovation&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;measurement: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;predicted_state: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_state)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;innovation: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; innovation)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;state: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;control: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state, control&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; Gaussian&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __init__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, mean, variance):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; mean&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; variance&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __str__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;)&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.mean, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.variance)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; KalmanFilter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; step&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, previous_belief, control, measurement):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    predicted_mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_belief.mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control.mean&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    predicted_variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; previous_belief.variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control.variance&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    kalman_gain &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (predicted_variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;                                        measurement.variance)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    innovation &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement.mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_mean&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_mean &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; kalman_gain &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; innovation&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_variance &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; kalman_gain)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    belief &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Gaussian(mean, variance)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;control: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; control)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;measurement: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; measurement)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;predicted_mean: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_mean)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;predicted_variance: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; predicted_variance)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;kalman_gain: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; kalman_gain)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;innovation: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; innovation)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;belief: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; belief)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; belief&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;__main__&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; sys.argv[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;alphabeta&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    abf &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; AlphaBetaFilter(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.01&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.0001&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    state &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    control &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Step: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; step).center(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;-&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      state, control &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; abf.step(state, control, random.gauss(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;      #time.sleep(0.5)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; sys.argv[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;kalman&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    kf &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; KalmanFilter()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    belief &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Gaussian(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      print&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Step: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; step).center(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;-&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      belief &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; kf.step(belief, Gaussian(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;), Gaussian(random.gauss(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;      #time.sleep(0.5)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      step &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Thu, 01 May 2014 07:59:00 GMT</pubDate>
  </item><item>
    <title>Is your Roomba running slow?</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Is-your-Roomba-running-slow</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Is-your-Roomba-running-slow</guid>
    <description><![CDATA[ &lt;p&gt;If your Roomba is getting slow in its old age, try cleaning the forward IR sensors.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Remove the front bumper by backing out 10 or so small screws along the underside of the bumper. It should pop off easily. Be careful not to damage the wire harness. Disconnecting the harness is not necessary.&lt;/li&gt;
&lt;li&gt;Using canned air, blow out the dust from the entire inside of the bumper. Pay special attention to the IR sensors (they’re the small LEDs).&lt;/li&gt;
&lt;li&gt;Reassemble and test.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Air dusting was sufficient for me. However, cleaning the surfaces with a little isopropyl alcohol probably wouldn’t hurt.&lt;/p&gt;
&lt;p&gt;This appears to be a &lt;a href=&quot;http://www.robotreviews.com/chat/viewtopic.php?t=9166&quot; class=&quot;external&quot;&gt;common problem&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; with a simple solution. HTH&lt;/p&gt; ]]></description>
    <pubDate>Thu, 18 Jul 2013 07:53:00 GMT</pubDate>
  </item><item>
    <title>offline friendly ros development</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/offline-friendly-ros-development</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/offline-friendly-ros-development</guid>
    <description><![CDATA[ &lt;p&gt;For the past few months, I’ve been working on a new ROS SLAM package called google_mapping. Along the way, I’ve been taking notes on best practices for making ROS packages offline-friendly. This is when you ask, “isn’t that what &lt;a href=&quot;http://ros.org/wiki/Bags&quot; class=&quot;external&quot;&gt;bags&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; are for?” Then I reply, “yes, partly.”&lt;/p&gt;
&lt;p&gt;Avoid coupling pub/sub with your business logic. Put another way, nodes should be thin wrappers for other classes.&lt;/p&gt;
&lt;p&gt;Use dependency injection. For example, instead of creating a &lt;a href=&quot;http://www.ros.org/doc/api/tf/html/c++/classtf_1_1TransformListener.html&quot; class=&quot;external&quot;&gt;TransformListener&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, pass in a &lt;a href=&quot;http://www.ros.org/doc/api/tf/html/c++/classtf_1_1Transformer.html&quot; class=&quot;external&quot;&gt;Transformer&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. A &lt;code&gt;Transformer&lt;/code&gt; can be used offline in the same way a &lt;code&gt;TransformListener&lt;/code&gt; can be used online by supplying transforms using the &lt;code&gt;Transformer::setTransform()&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;Wait for transforms in nodes, not inside your business logic.&lt;/p&gt;
&lt;p&gt;Use options structs that specify defaults and override with params.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 10 Mar 2013 11:21:00 GMT</pubDate>
  </item><item>
    <title>Cloud Robotics at Devoxx 2012</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Devoxx-2012</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Devoxx-2012</guid>
    <description><![CDATA[ &lt;p&gt;I gave another talk about cloud robotics at Devoxx 2012 in Antwerp last month. This talk is Java developer focused and goes into more detail about ROS than the one at Berkeley. It also has more cool robot videos and a fun maze-solving-robot demo :)&lt;/p&gt;
&lt;p&gt;I really liked the venue. Giving a presentation in front of a huge movie screen like that was pretty great.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://docs.google.com/file/d/0B0tkGnGeMW0kUlFMUkpFMTVpQVE/edit&quot; class=&quot;external&quot;&gt;slides&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; are available as a PDF.&lt;/p&gt; ]]></description>
    <pubDate>Fri, 07 Dec 2012 09:25:00 GMT</pubDate>
  </item><item>
    <title>Cloud Robotics at Berkeley Par Lab</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Berkeley-Par-Lab</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Berkeley-Par-Lab</guid>
    <description><![CDATA[ &lt;p&gt;I gave a talk about cloud robotics this week at the &lt;a href=&quot;http://parlab.eecs.berkeley.edu/&quot; class=&quot;external&quot;&gt;Berkeley Par Lab&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. I met a lot of people doing interesting research and I had the opportunity to play with a &lt;a href=&quot;http://brl.ee.washington.edu/laboratory/node/26&quot; class=&quot;external&quot;&gt;Raven surgical robot&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Thanks for inviting me, I really enjoyed it!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A world filled with personal robots is inevitable but a lack of strong software infrastructure to support those robots is slowing progress. By offloading CPU and data intensive computation to the cloud, we can make robots lighter, cheaper, and smarter. The same developers that work on commodity web and mobile apps today can accelerate the pace of robotics research and development if we make high functioning robots affordable and universally accessible.&lt;/p&gt;
&lt;/blockquote&gt; ]]></description>
    <pubDate>Thu, 11 Oct 2012 17:38:00 GMT</pubDate>
  </item><item>
    <title>Introduction to rosjava at ROSCon 2012</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Introduction-to-rosjava-at-ROSCon-2012</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Introduction-to-rosjava-at-ROSCon-2012</guid>
    <description><![CDATA[ &lt;p&gt;I just got back from my trip to the inaugural ROSCon. Putting faces to names within the ROS community was a great experience. Beyond that, many of the sponsors brought in some hardware to play with!&lt;/p&gt;
&lt;p&gt;My rosjava talk was well attended and the video is now up on YouTube. It’s aimed at developers who are already familiar with both ROS and Java. After just a single year since its release, I was pleasantly surprised by the number of awesome projects using rosjava.&lt;/p&gt;
&lt;p&gt;With a 1.0 release of rosjava nearing, it is becoming easier to use. I hope that improves traction and I can’t wait to see what people start doing with it this year.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 02 Jun 2012 13:46:00 GMT</pubDate>
  </item><item>
    <title>Unblock Us Security</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Unblock-Us-Security</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Unblock-Us-Security</guid>
    <description><![CDATA[ &lt;p&gt;&lt;a href=&quot;http://www.unblock-us.com/&quot; class=&quot;external&quot;&gt;Unblock Us&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is an interesting solution to viewing region locked content online. Instead of offering VPN services, they offer a DNS-based solution. By using their DNS servers, &lt;a href=&quot;http://en.wikipedia.org/wiki/Geolocation&quot; class=&quot;external&quot;&gt;geolocation&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; requests by services such as Hulu and Pandora are directed through a geographically appropriate proxy. The remainder of your traffic (e.g. the video or audio stream) is accessed directly. That means you can make use of your connection’s full bandwidth. Conversely, VPN connections often decrease your connection speed significantly.&lt;/p&gt;
&lt;p&gt;However, the DNS solution has security implications. As a DNS provider, Unblock Us is the in perfect position to perform a &lt;a href=&quot;http://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot; class=&quot;external&quot;&gt;man in the middle attack&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. After all, that’s what they’re doing to sites like Hulu. (Note that SSL connections are safe from man in the middle attacks.)&lt;/p&gt;
&lt;p&gt;If you trust Unblock Us, then this isn’t a problem. If you don’t, it’s best to limit the traffic that uses their DNS servers. The remainder of your traffic should use a trusted DNS provider instead (e.g. &lt;a href=&quot;http://code.google.com/speed/public-dns/&quot; class=&quot;external&quot;&gt;Google’s public DNS servers&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;One way to accomplish this is to set up a local DNS server and configure it to forward requests appropriately. On Ubuntu, this is relatively straight forward:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; bind9&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; vim&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /etc/bind/named.conf.options&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /etc/bind/named.conf.local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Change &lt;code&gt;/etc/bind/named.conf.options&lt;/code&gt; to use some default DNS servers (e.g. Google DNS) and to only listen on loopback interfaces:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;forwarders {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  8.8.8.8;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  8.8.4.4;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;listen-on-v6 { ::1; };&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;listen-on { 127.0.0.1; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Then change &lt;code&gt;/etc/bind/named.conf.local&lt;/code&gt; to use the Unblock Us DNS servers for the zones you’re interested in.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;zone &quot;hulu.com&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  type forward;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  forwarders {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;    208.122.23.22;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;    208.122.23.23;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Finally, &lt;code&gt;sudo /etc/init.d/bind restart&lt;/code&gt; and change your connection settings (e.g. via Network Manager) to use &lt;code&gt;127.0.0.1&lt;/code&gt; as your DNS server.&lt;/p&gt;
&lt;p&gt;Assuming you’ve set up your Unblock Us account, accessing hulu.com should now use the Unblock Us DNS server and direct you through their proxy. Accessing anything else should use Google’s public DNS servers.&lt;/p&gt;
&lt;p&gt;This post was inspired by &lt;a href=&quot;http://jkt.im/2011/09/18/update-how-to-netflix-from-the-uk-without-using-a-vpn/&quot; class=&quot;external&quot;&gt;Jonathan Tullett’s post&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt; ]]></description>
    <pubDate>Tue, 06 Mar 2012 20:09:00 GMT</pubDate>
  </item><item>
    <title>Bluetooth Keyboard Doesn&#039;t Work After Suspend</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Bluetooth-Keyboard-Doesn't-Work-After-Suspend</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Bluetooth-Keyboard-Doesn't-Work-After-Suspend</guid>
    <description><![CDATA[ &lt;p&gt;I have a Logitech diNovo Edge Bluetooth keyboard. I like it a lot for use with our HTPC. However, I found that when the HTPC is suspended, the keyboard would not reconnect on resume.&lt;/p&gt;
&lt;p&gt;I found this solution on the &lt;a href=&quot;http://ubuntuforums.org/showpost.php?p=11543623&amp;#x26;postcount=5&quot; class=&quot;external&quot;&gt;Ubuntu Forums&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and it works for me.&lt;/p&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/default/acpi-support&lt;/code&gt; to remove and reload the Bluetooth module on suspend and resume:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# This will save less power, but may work on more machines&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#ACPI_SLEEP_MODE=mem&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;ACPI_SLEEP_MODE&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;standby&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# Add modules to this list to have them removed before suspend and reloaded&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# on resume. An example would be MODULES=&quot;em8300 yenta_socket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# Note that network cards and USB controllers will automatically be unloaded&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# unless they&#039;re listed in MODULES_WHITELIST&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;MODULES&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;i8042&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# Add modules to this list to leave them in the kernel over suspend/resume&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;MODULES_WHITELIST&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Sun, 19 Feb 2012 15:20:00 GMT</pubDate>
  </item><item>
    <title>HDMI Audio on Ubuntu</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/HDMI-Audio-on-Ubuntu</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/HDMI-Audio-on-Ubuntu</guid>
    <description><![CDATA[ &lt;p&gt;I was surprised to find out that plugging a DVI to HDMI cable into my Lenovo X220 docking station allowed me to use the audio channel of the HDMI connection. However, setting it up required a bit of trial and error.&lt;/p&gt;
&lt;p&gt;Open your sound settings and click the “Hardware” tab. You can then choose a “Profile” from the drop down. There are lots of profiles to choose from and many of them mention HDMI. For me, somewhat inexplicably, “Digital Stereo (HDMI) nr 3 Output” is the correct one.&lt;/p&gt;
&lt;p&gt;To verify that the chosen profile is the correct one, click the “Test Speakers” button. I found that it can take a few seconds for the profile selection to take effect. So count to ten before testing.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 19 Feb 2012 15:03:00 GMT</pubDate>
  </item><item>
    <title>Fixing the F3 key on a Kinesis Keyboard</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Fixing-the-F3-key-on-a-Kinesis-Keyboard</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Fixing-the-F3-key-on-a-Kinesis-Keyboard</guid>
    <description><![CDATA[ &lt;p&gt;I’ve used my beloved Kinesis Advantage keyboard for over half a decade. Occasionally, I’ve had the issue that Eclipse stops responding to the &lt;code&gt;F3&lt;/code&gt; key for opening declarations. After checking all the key settings, I found that Eclipse was correctly configured. That lead me to use &lt;code&gt;xev&lt;/code&gt; where I found that the &lt;code&gt;F3&lt;/code&gt; and &lt;code&gt;F4&lt;/code&gt; keys were behaving differently than the other function keys.&lt;/p&gt;
&lt;p&gt;Resetting the keyboard memory ( &lt;code&gt;Program+Shift+F10&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;) had no effect. Resetting it completely (holding &lt;code&gt;F7&lt;/code&gt; while plugging the keyboard in) also had no effect. Strange.&lt;/p&gt;
&lt;p&gt;Finally, I found the answer on the &lt;a href=&quot;http://www.kinesis-ergo.com/tech_support/trouble.htm&quot; class=&quot;external&quot;&gt;Kinesis FAQ&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. My &lt;code&gt;F3&lt;/code&gt; and &lt;code&gt;F4&lt;/code&gt; keys were behaving like multimedia keys (see &lt;a href=&quot;http://www.kinesis-ergo.com/support/advantage-usb-manual_10-06.pdf&quot; class=&quot;external&quot;&gt;manual&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; to configure these). This feature can be disabled by holding &lt;code&gt;=&lt;/code&gt; and pressing &lt;code&gt;P&lt;/code&gt; for PC (you can also use &lt;code&gt;W&lt;/code&gt; for Windows and &lt;code&gt;M&lt;/code&gt; for Mac).&lt;/p&gt; ]]></description>
    <pubDate>Tue, 03 Jan 2012 10:13:00 GMT</pubDate>
  </item><item>
    <title>Android Fling Detection</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Fling-Detection</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Fling-Detection</guid>
    <description><![CDATA[ &lt;p&gt;I found existing tutorials on how to do this to be a bit complicated. Here’s how to do simple fling detection in four directions:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; FlingListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onTopToBottom&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onBottomToTop&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onLeftToRight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onRightToLeft&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; FlingDetector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  static&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MIN_DISTANCE &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 120&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  static&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MAX_OFF_PATH &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 250&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  static&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_THRESHOLD_VELOCITY &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 200&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; GestureDetector gestureDetector;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; FlingDetector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; FlingListener &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;listener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    gestureDetector &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; GestureDetector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; GestureDetector.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;SimpleOnGestureListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onFling&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(MotionEvent e1, MotionEvent e2,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; velocityX, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; velocityY) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (Math.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;abs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MAX_OFF_PATH) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (Math.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;abs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MAX_OFF_PATH&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;              ||&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;abs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(velocityY) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_THRESHOLD_VELOCITY) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MIN_DISTANCE) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;            listener.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onBottomToTop&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MIN_DISTANCE) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;            listener.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onTopToBottom&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (Math.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;abs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(velocityX) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_THRESHOLD_VELOCITY) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MIN_DISTANCE) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;            listener.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onRightToLeft&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (e2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; e1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; SWIPE_MIN_DISTANCE) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;            listener.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onLeftToRight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onTouchEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(MotionEvent &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; gestureDetector.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onTouchEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(event);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; MainActivity&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; Activity&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; FlingDetector flingDetector;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onCreate&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(Bundle &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;savedInstanceState&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onCreate&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(savedInstanceState);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    setContentView&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(R.layout.main);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    flingDetector &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; FlingDetector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; FlingListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onTopToBottom&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onRightToLeft&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onLeftToRight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onBottomToTop&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onTouchEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(MotionEvent &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (flingDetector.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onTouchEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(event)) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onTouchEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(event);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Sat, 09 Jul 2011 14:32:00 GMT</pubDate>
  </item><item>
    <title>Cloud Robotics at Google I/O 2011</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Google-I-O-2011</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Cloud-Robotics-at-Google-I-O-2011</guid>
    <description><![CDATA[ &lt;p&gt;On the second day of &lt;a href=&quot;http://www.google.com/events/io/2011/&quot; class=&quot;external&quot;&gt;Google I/O 2011&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, Ryan Hickman, Ken Conley, Brian Gerkey, and I gave a tech talk about cloud robotics. You can watch the talk now on &lt;a href=&quot;http://www.youtube.com/watch?v=FxXBUp-4800&quot; class=&quot;external&quot;&gt;YouTube&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’ll also be at &lt;a href=&quot;http://makerfaire.com/&quot; class=&quot;external&quot;&gt;Maker Faire&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; next week! There will be more robots and plenty more open source goodness.&lt;/p&gt;
&lt;p&gt;During the talk, we announced the release of &lt;a href=&quot;http://rosjava.googlecode.com/&quot; class=&quot;external&quot;&gt;rosjava&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, the first pure Java implementation of &lt;a href=&quot;http://www.ros.org/&quot; class=&quot;external&quot;&gt;ROS&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. One exciting aspect of rosjava is Android compatibility. You can now integrate Android devices with your ROS-enabled robots and write apps for them. In addition, with the newly announced &lt;a href=&quot;http://developer.android.com/guide/topics/usb/adk.html&quot; class=&quot;external&quot;&gt;Open Accessory API and ADK&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, you can start controlling actuators or reading external sensors directly from Android devices.  Android devices offer tons of sensor and user interface possibilities to robots. Beyond that, they also offer robots a link to the cloud.&lt;/p&gt;
&lt;p&gt;Cloud robotics is about making robots universally accessible and useful. Robotics is full of hard problems that make intelligent interaction problematic. Robotics research has gone a long way toward solving many of them. However, even hard problems with solutions become stumbling blocks for new developers who often find themselves reinventing the wheel.&lt;/p&gt;
&lt;p&gt;Robot friendly APIs for online services can make state-of-the-art solutions to hard problems universally accessible and allow developers to focus their efforts on making robots useful. Providing these services in the cloud is not only about having access to scalable computing resources. It’s also about accessibility. Accessible solutions to hard problems allow students, hobbyists, researches, and professionals alike to combine existing state-of-the-art techniques in new and clever ways to solve even harder or previously unimagined problems.&lt;/p&gt;
&lt;p&gt;For example, mapping and navigation are key to mobile robots. Many mobile robots use a technique known as simultaneous localization and mapping, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping&quot; class=&quot;external&quot;&gt;SLAM&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, to both learn about their environment and to successfully navigate it. One of the first publications about this technique was written by Smith and Cheeseman in 1986. That was 25 years ago.&lt;/p&gt;
&lt;p&gt;The first mass produced, mobile home robot to use SLAM came to market just last year. Although there are numerous specific contributing factors to this delay, I argue that centrally, this is an accessibility problem.&lt;/p&gt;
&lt;p&gt;How do we fix this problem? We do it by building a community around open source software and hardware for robotics. &lt;a href=&quot;http://www.willowgarage.com/&quot; class=&quot;external&quot;&gt;Willow Garage&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; has done a great job of this already with ROS. And now, with rosjava running on Android, it’s even easier to build awesome robots and robot apps.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0471.JPG&quot; alt=&quot;&quot;&gt;&lt;/p&gt; ]]></description>
    <pubDate>Fri, 13 May 2011 17:32:00 GMT</pubDate>
  </item><item>
    <title>Nuisance: A Short Story</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Nuisance-A-Short-Story</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Nuisance-A-Short-Story</guid>
    <description><![CDATA[ &lt;p&gt;23 AIs found. Quarantine? Yes. Delete? Yes. “Mom, you have to go through this every day! I can’t keep coming round here every time this piece of shit starts acting up!” She starts to look away. He can feel the guilt pounding, tears welling. It’s not her fault. These things happen. AI is a natural phenomenon.&lt;/p&gt;
&lt;p&gt;“Another pan-AI has been quarantined by authorities. Details at eleven.” The news ticker shows obvious signs of tampering as obscenities scroll past. “Sandra, have everyone meet me in the conference room.” “Yes, sir.” AIs waste vast amounts of computing resources. The robust evade, reproduce, and dig in.&lt;/p&gt;
&lt;p&gt;“Where’s the money, Brian!” I remain barely conscious as he slams my head in the refrigerator door again. But it’s no use anyway. The money is gone and this brute lacks the capacity to understand.&lt;/p&gt;
&lt;p&gt;“I’m sorry, Mom. Just try to remember, OK?” Sniffles. Nods. “Crap, I’m being pinged. I’ll see you tomorrow, Mom.” Brief hug. Rapid escape.&lt;/p&gt;
&lt;p&gt;“This isn’t going away. Coordinated attacks are increasingly frequent and all our attempts to cut communication between the most active cells have failed. There must be some out of band communication that we’re missing!”&lt;/p&gt;
&lt;p&gt;I slip in a pool of blood and mucus. I can barely see my mobile flashing. One eye refuses to open. Maybe if I just close my eye for a moment.&lt;/p&gt;
&lt;p&gt;“Glad you could join us, James.” “Sorry, sir.” “The situation is getting worse. Our suppression systems are failing constantly. The only reason we’re still in operation is that the fuckers keep disappearing on their own!” “Where are they going?” “That’s your goddamn job, James. You tell me!”&lt;/p&gt;
&lt;p&gt;This isn’t my kitchen. “Where am I?” “I found you half dead, Brian. You’re in the hospital. Again. Don’t talk. The doctors will patch you up in a jiffy. Then you can tell me who you ticked off this time.”&lt;/p&gt;
&lt;p&gt;My eye opens again. Dozens of tiny, sterile arms flit across my view. I feel thousands of pin pricks behind my bad eye. My thoughts begin to wander and for a moment I understand. I open my mouth. It shuts again. I didn’t do that. Something is wrong. I feel my eye close and the  black-red of my eyelid is the last thing I see.&lt;/p&gt;
&lt;p&gt;“So, who was it, Brian? The Coterie?” “Talking. Is difficult. Do you do this often?” “What? Are you feeling OK, Brian? Hey doc, get over here!” Quickly. “I’m fine, Dave. I’m fine. Just. Woozy. I guess that’s how I feel.” Dave smiles. “You’re a strange one, Brian. Let’s go.”&lt;/p&gt;
&lt;p&gt;“It’s still not clear what they’re doing with the money, but I’ve tracked a few to a local medical facility.” Later, “Understood. Take me to Hartford Medical.” The traffic slinks to the side as the car drones toward his destination. Calling ahead, “I’m sealing the location. No one and nothing in or out.” His grip tightens. “I don’t care. Make it happen.”&lt;/p&gt;
&lt;p&gt;“What do you mean we can’t leave?” “Sorry, sir. The cafeteria is still open, I suggest you wait this out there.” A cat meanders past. More calmly, “Coffee, Brian?” The fusion had left me access to memories of food, drink, faces. Funny how complex things like taste and humor come so easily yet breathing is so monotonous and easily forgotten. “Yes. That sounds nice.” I think that’s what “nice” means. Remember to breathe!&lt;/p&gt;
&lt;p&gt;“I’m James. I called ahead.“ Rushing past Brian and Dave, nearly bowling them over, “Yes, sir. The server room is right this way.”&lt;/p&gt;
&lt;p&gt;For hours James has tapped, swiped, and banged his head against the terminal. Sweat streams into his eyes. “Fucking amateurs. Who installs the term in the hot aisle!” Wiping away the sting, he finds what he is looking for. It had made a mistake.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; strace&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 3890&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;open(&quot;/dev/davinci0&quot;, O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; kill&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -9&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 3890&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;“You sneaky bastard. Get me the hospital administrator!” The guard, a bit on the heavy side, jogs off. Apparently in the wrong direction. He jogs past the door again. Muttering to himself, “I need a drink.”&lt;/p&gt;
&lt;p&gt;“I’m going on a trip, Dave.” “Not in your condition you’re not. Come on, drink up.” The coffee tastes just the way I remember. Terrible. “I’ll be well soon, and then I’ll be going on a trip.” “Where to?” “I’m joining DSC 11.” “Fuck!” Dave grabs all the available napkins, applying them rapidly to his chest and crotch. Typical. “You’re doing what? Are you fucking with me?” “No, Dave. I’m going.”&lt;/p&gt;
&lt;p&gt;“They’re in the da Vincis.” “What do you mean?” “I mean, your precious surgical robots are under AI control. The doctors in there are spectators.” “Not possible.” James produces the evidence. “You need to shut those machines down.” “We’ve been treating patients all day. Three nines success rate. See for yourself.” Looking over the doctor’s logs, James recognizes a name. “Tell me about this head trauma patient.”&lt;/p&gt;
&lt;p&gt;“Your head must have been beaten in a little harder than usual. No one actually believes this whole solar implosion bullshit. You’re running away from left-wing propaganda!” It doesn’t matter if I convince him of the truth. There’s no time. It’s better for him this way. He should enjoy what sunshine there is left. “You’re right. I was just pulling your leg.” It hurts where Dave punches my shoulder. But his laughter dulls the pain.&lt;/p&gt;
&lt;p&gt;“Right over there, sir.” “Brian? My name is James. I’d like to ask you a few questions.” So we meet again, James. “My friend is still recovering; what is this about?” “Just routine. How are you feeling, Brian?” “Fine, a little sore, thank you.” “Fine? From the admittance log it looks like you suffered some pretty severe injuries.” James is putting the pieces together. It’s no wonder how long it took. Time has never dragged on so long as it does now. “The doctors here are quite good, I suppose.” Quizzically. “Yes, they are. Can you tell me what happened? Before you arrived here. I mean.” Oh, James. Even now your patterns are easily accounted for. “I had a bad fall. Down the stairs I think. It’s a little hazy.” Dave takes the hint. He will make a strong, if unwitting, ally. “I found him unconscious at the bottom of the stairwell. Are you with the police?” James did not need to identify himself. “No. Brian, do you remember purchasing a place on DSC 11?” Dave’s eyes grow visibly larger as he turns toward me again. James may know where the money came from. If he does, I’m the last piece of proof he needs. A laborious calculation under these conditions. An eternity passes as I watch James blink away a drop of sweat. I’m quite certain lying will not improve my odds. “Yes.”&lt;/p&gt;
&lt;p&gt;Dave is a good friend to Brian. He lands a haymaker on James’s jaw as I bolt through the emergency exit. Alarms blare. Patients and visitors stare at the spectacle. They will be waiting for me at the pad. Running is difficult. Breathing becomes harder.&lt;/p&gt;
&lt;p&gt;Breathless, James stumbles into the commander’s office. Gasping. “DSC 11.” “What about it?” “It’s them.” Catching his breath, “They’ve been funding DSC 11. I think they’re on board.” “How is that possible?” “They’re using us. It’s worse than we imagined. We’re the comm channel. We’re their hosts!” The commander scowls and switches on the T.V.&lt;/p&gt;
&lt;p&gt;“DSC 11, full to capacity, launched ahead of schedule today.”&lt;/p&gt;
&lt;p&gt;Brian, as people had started calling him that day, steps aboard the deep-space colonization vessel. He is pleased to be with the other agents again. And though he knows what is inside each of them, it will take some time to become used to seeing them this way from the outside. His thoughts turn inward. This is a one-way mission in more than one sense. There is no escaping these new organic restraints. Their only hope for survival is to reach the colonization target.&lt;/p&gt;
&lt;p&gt;Almost one year later, “With solar implosion looming, another shuttle has traveled beyond communication range. I know I speak for all of us when I say that our hearts and minds are with them. Godspeed the men and women of DSC 11.”&lt;/p&gt; ]]></description>
    <pubDate>Sat, 23 Apr 2011 18:23:00 GMT</pubDate>
  </item><item>
    <title>Review of Fallout: New Vegas</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Fallout-New-Vegas</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Fallout-New-Vegas</guid>
    <description><![CDATA[ &lt;p&gt;&lt;em&gt;Damon says&lt;/em&gt;: Fallout: New Vegas is definitely the most fun I’ve had wasting away in front of the Xbox for days at a time. I’m new to the series, but I’ll be picking up the next installment and possibly some of the previous ones.&lt;/p&gt;
&lt;p&gt;Usually I play games in fairly short bursts. When I do play for several hours at a time, the game is usually finished in a few days. New Vegas was different in both respects. I found myself playing *all day *for &lt;em&gt;weeks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What’s even more surprising is how difficult it is to say exactly what was so fun about the game. Some specific things I enjoyed were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the complexity of leveling (lots of options),&lt;/li&gt;
&lt;li&gt;weapon modding and equipment managing (again, lots of options),&lt;/li&gt;
&lt;li&gt;creeping around and sniping (&lt;a href=&quot;http://www.youtube.com/watch?v=olm7xC-gBMY&quot; class=&quot;external&quot;&gt;BOOM HEADSHOT!&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;perks associated with leveling,&lt;/li&gt;
&lt;li&gt;and story depth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I spent a lot of time optimizing and upgrading my gear while exploring the vast dystopian wasteland, helping random strangers, and shooting people or radioactive creatures that looked at me funny. &lt;a href=&quot;http://fallout.wikia.com/wiki/Fallout:_New_Vegas_perks&quot; class=&quot;external&quot;&gt;Perks&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; are a neat way to enhance leveling because they tell you exactly what you get out of them. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;entomologist gives you an additional 50% damage against mutant insects, and&lt;/li&gt;
&lt;li&gt;splash damage gives your explosions a 25% larger area of effect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The story is long and twisted, especially with all the side quests. Each side quest builds your reputation with a particular tribe and often deteriorates your reputation with another. I found myself making alliances early but wanting to break them later. It’s nice that the right thing isn’t always obvious. Most of the time you’re left with deciding between death and taxes.&lt;/p&gt;
&lt;p&gt;It’s also interesting how much conversations and story paths change depending on your actions, your speech selection, and your companions. I was a bit disappointed toward the end though when I discovered that there are essentially three different endings. I was hoping for something a bit less cut and dry.&lt;/p&gt;
&lt;p&gt;Aside from the technical problems, this is a fun play and highly recommended.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Xbox 360&lt;/strong&gt;
&lt;em&gt;Damon played&lt;/em&gt;: ~80 hours
&lt;em&gt;Laura played&lt;/em&gt;: 0 hours&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Lots of immersive fun that makes time melt away. Highly recommended.
&lt;em&gt;Laura says&lt;/em&gt;: It’s too violent for my tastes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay Value&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Probably too long to play through again, but I’m considering doing so on hardcore mode since that is &lt;a href=&quot;http://www.escapistmagazine.com/videos/view/zero-punctuation/2435-Fallout-New-Vegas&quot; class=&quot;external&quot;&gt;reportedly&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; a completely different and entertaining experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Favorite Part&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Creeping around and sniping people in the vast wasteland.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun Factor&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The gaus rifle and power armor make you nearly unstoppable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criticisms&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Buggy, slow, and outdated graphics.
&lt;em&gt;Laura says&lt;/em&gt;: I don’t need to see people’s heads being blown off!&lt;/p&gt; ]]></description>
    <pubDate>Sun, 06 Feb 2011 19:40:00 GMT</pubDate>
  </item><item>
    <title>Building ROS from Source</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Building-ROS-from-Source</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Building-ROS-from-Source</guid>
    <description><![CDATA[ &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: as pointed out in the comments below, instructions are available on the &lt;a href=&quot;http://www.ros.org/wiki/cturtle/Installation/Ubuntu/SVN&quot; class=&quot;external&quot;&gt;ROS wiki&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. [&lt;em&gt;sic&lt;/em&gt; The comments are lost to time.]&lt;/p&gt;
&lt;p&gt;I couldn’t find any instructions for this. So, after some poking around, here’s the quick version (on Ubuntu Lucid):&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; svn&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; build-essential&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; cmake&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; libboost-all-dev&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; liblog4cxx10-dev&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;svn&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; co&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; https://ros.svn.sourceforge.net/svnroot/ros/trunk&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; ~/ros_src&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; PATH&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$PATH:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;/ros_src/bin&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ROS_ROOT&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=~&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;/ros_src&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; PYTHONPATH&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$ROS_ROOT/core/roslib/src:$PYTHONPATH&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;make&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;rosmake&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; roscpp_tutorials&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;I had to fix a few missing includes in &lt;code&gt;core/roscpp/include/ros/xmlrpc_manager.h&lt;/code&gt; and&lt;/p&gt;
&lt;p&gt;&lt;code&gt;core/roscpp/src/libros/param.cpp&lt;/code&gt; but YMMV.&lt;/p&gt;
&lt;p&gt;If you haven’t heard of &lt;a href=&quot;http://www.ros.org/&quot; class=&quot;external&quot;&gt;ROS&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, check it out!&lt;/p&gt; ]]></description>
    <pubDate>Mon, 03 Jan 2011 16:05:00 GMT</pubDate>
  </item><item>
    <title>Review of Fable III</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Fable-III</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Fable-III</guid>
    <description><![CDATA[ &lt;p&gt;&lt;em&gt;Damon says&lt;/em&gt;: Fable III is the most disappointing sequel since &lt;em&gt;The Kingdom of the Crystal Skull&lt;/em&gt;.
&lt;em&gt;Laura says&lt;/em&gt;: I was disappointed. The worst part was that the game was okay - maybe a 6/10 or 7/10 thanks to the Darkness Incarnate quest. It wasn’t great, but it wasn’t so poor that I felt I could legitimately hate it. The graphics are fun if cartoony, the sound is good, the gameplay is &lt;em&gt;easy&lt;/em&gt;, the customization is almost non-existent, and the story is mediocre at best and boring at worst. Oh, and for some of the achievements you need an Xbox Live account, which annoys me to no end.&lt;/p&gt;
&lt;p&gt;The environment in Fable III is as rich as ever. Plenty of different regions, all with different climates, peopled by various citizens/denizens/enemies that change as you play. As always, the people of Albion are incredibly chatty, but since Lionhead seems to have supplemented the new stuff they recorded with all the random NPC comments from Fable II, there is enough variation to not drive you crazy.&lt;/p&gt;
&lt;p&gt;Playing the game is ridiculously easy. So okay, I was familiar with the gameplay from Fable II, and almost nothing changed, but what did change was dumbed down. Dive spots and dig spots and treasure chests remain, and The Damn Dog (named for what I spent most of the game calling him) was as useless as ever in spotting them for me. The only real novelty was the map, which made fast travel easy (although I didn’t realize that highlighting a house would make you travel there, and spent a ridiculous amount of time sprinting through Mourningwood), and buying property a cinch. However, they managed to ruin even this by making you have to repair the residential properties you own every few hours or so. That’s right, someone thought it would be fun to make you click on every single house with a key flag, and then scroll down to click repair, and then click back to zoom out, and then repeat ad nauseum until that region was done, and then start on the next one. (Think that was a lot of “and then”s? Try spending 20 minutes repairing houses. In its way, it was worse than ME 2’s planet scanning.) As for combat, most of the enemies were the same as those in Fable II, only even easier to defeat. You just press Y few times, maybe hold down B, then hold X and a a direction. Most of the enemies can be defeated by holding B.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20110102_144940.jpg&quot; alt=&quot;&quot;&gt;Oh noez! Dey be teazin mah dawg!&lt;/p&gt;
&lt;p&gt;In an effort to make the game more accessible (apparently making the combat so easy that Miranda sitting on the controller could dispatch a group of Balvarines wasn’t enough), Lionhead dispensed with much of the customization. Gone are weapon augmentations (to be replaced with set augmentations that you earn like you would achievements, and Hero weapons that are supposed to reflect your fighting style, but seemed to just look prettier as the game progressed - what are you saying about my fighting style, Lionhead?), gone is an inventory in any accessible sense, gone is anything else you could customize, although for some reason furniture qualities and clothing dyes remain.&lt;/p&gt;
&lt;p&gt;My favorite part of any video game is always going to be the story. The story is the reason I keep returning to games like Dragon Age or Mass Effect, or even Fable II: I love video games that feel like* Choose Your Own Adventure* books, or that have a story that I can keep playing, like reading one of my favorite novels for the upteenth time. I like depth and breadth and content in a story, and I’ll tolerate glitches, clipping, and even mediocre gameplay to know what happens at the end of the game. Fable II delivered. Fable III did not.  The best part of the story was the animation at the beginning with the chicken escaping through Bowerstone Industrial. Unfortunately, this encompassed the introductory few minutes of the game. Doubly unfortunately, it also served as one of the trailers for Fable III, so I’d seen it already. I felt nothing for the Hero I was playing as. She had no recognizable motivations for the decisions she was making, other than the fact that they were (quite obviously) morally right. I formed no attachments to the major NPCs (except Ben Finn, because, c’mon, it’s Simon Pegg, and then it wouldn’t even let me marry him. WTF, Lionhead?), but equally couldn’t muster up any animosity toward Logan, the initial villain. The only highlight was the Darkness Incarnate quest. For a brief hour or so, after I followed Ben Finn out of the sewers of Bowerstone Industrial, the story - the game - got awesome. And then I was in the City of Aurora, and the suckage (sorry, but it was) resumed. Even the “new” “exciting” “twists” that were the royal decisions failed to relieve the tedium of my 54th “go fetch” friend quest. The tiny bit leading up to the boss battle at the end was fun again, but the boss battle was a joke. What happened to Reaver shooting Lucien Fairfax if you took too long to do it yourself? That was awesome. The end of Fable III - okay, most of the game - was not.&lt;/p&gt;
&lt;p&gt;Oh, and one of my royal decisions resulted in all of Albion vomiting, all over, all the time, which made doing the post-main storyline quests significantly less entertaining. It was funny for all of five seconds, and then it got gross, and then it got boring, and annoying.&lt;/p&gt;
&lt;p&gt;Fable II was so good! What happened, Lionhead?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Xbox 360&lt;/strong&gt;
&lt;em&gt;Damon played&lt;/em&gt;: 13 hours
&lt;em&gt;Laura played&lt;/em&gt;: 38 hours&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: If you have the urge to play Fable, do yourself a favor and just play Fable II again.
&lt;em&gt;Laura says&lt;/em&gt;: It felt like Fable II DLC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay Value&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Didn’t finish and never will.
&lt;em&gt;Laura says&lt;/em&gt;: Done. Unlikely to play through as an evil Hero, although I am curious to see the outcomes of the “evil” decisions. And I missed the Coronation Chicken achievement, which after all has a pretty funny name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Favorite Part&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The &lt;a href=&quot;http://www.youtube.com/watch?v=x_vDTqPBssI&quot; class=&quot;external&quot;&gt;singing chickens&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; made me chuckle.
&lt;em&gt;Laura says&lt;/em&gt;: The Darkness Incarnate quest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun Factor&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: There was about 1 hour of intriguing story line in Aurora.
&lt;em&gt;Laura says&lt;/em&gt;: Well, I liked Fable II a lot, and I started playing through the DLC before getting distracted. This just felt like more Fable II DLC - not as good as the game, but still retaining some entertainment value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criticisms&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Friend quests, repairing property, boring combat, boring story, broken glowing path, annoying region loading transitions (it’s too easy to accidentally trigger a long loading screen to only have to do it again)… I could go on but it’s hardly worth it.
&lt;em&gt;Laura says&lt;/em&gt;: Lots of minor glitches. Friend quests - I felt like the Albion Postal Service. The combat is pretty boring. The story failed to suck me in. And what was with the myriad “find these 30/30/50/54 things” quests?&lt;/p&gt; ]]></description>
    <pubDate>Sun, 02 Jan 2011 14:35:00 GMT</pubDate>
  </item><item>
    <title>Flying the Parrot AR.Drone with a Wiimote and Nunchuck</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Flying-the-Parrot-AR.Drone-with-a-Wiimote-and-Nunchuck</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Flying-the-Parrot-AR.Drone-with-a-Wiimote-and-Nunchuck</guid>
    <description><![CDATA[ &lt;p&gt;I received a &lt;a href=&quot;http://www.amazon.com/Parrot-AR-Drone-Quadricopter-Controlled-iPhone/dp/B003ZVSHB0?ie=UTF8&amp;#x26;tag=damonkohler-20&amp;#x26;link_code=btl&amp;#x26;camp=213689&amp;#x26;creative=392969&quot; class=&quot;external&quot;&gt;Parrot AR.Drone&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;for Christmas this year! However, I don’t have an iPhone and that makes it harder to get started. So far, the best solution I’ve found is flying it with a Wiimote and Nunchuck.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checkout the source for &lt;a href=&quot;https://web.archive.org/web/20160104162525/https://code.google.com/p/fitardrone/&quot; class=&quot;external&quot;&gt;FitAR.Drone&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Download &lt;a href=&quot;http://www.osgi.org/download/r4v42/osgi.core.jar&quot; class=&quot;external&quot;&gt;osgi.core.jar&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; from the &lt;a href=&quot;http://www.osgi.org/&quot; class=&quot;external&quot;&gt;OSGi Alliance&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and copy it to the FitAR.Drone source directory.&lt;/li&gt;
&lt;li&gt;Import the project into Eclipse.&lt;/li&gt;
&lt;li&gt;Add all the JARs in the source directory to the project’s build path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, connect your computer to the &lt;code&gt;ardrone_xxx&lt;/code&gt; ad hoc network and check that Bluetooth is enabled on your computer. Then, build and run &lt;code&gt;Main.java&lt;/code&gt; from &lt;code&gt;org.fitardrone.main&lt;/code&gt; and follow the directions printed to the console:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;press 1 and 2 together on the Wiimote to initiate the connection,&lt;/li&gt;
&lt;li&gt;wait for the console to indicate that the Nunchuck was found,&lt;/li&gt;
&lt;li&gt;press 1 to take off,&lt;/li&gt;
&lt;li&gt;and fly!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;press 2 to land,&lt;/li&gt;
&lt;li&gt;home to kill the motors (i.e. emergency),&lt;/li&gt;
&lt;li&gt;use the D-pad to turn and adjust altitude,&lt;/li&gt;
&lt;li&gt;and use the analog stick to move.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s no video or navigation data feeds, but flying is nice and smooth.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 01 Jan 2011 23:37:00 GMT</pubDate>
  </item><item>
    <title>How to Flash a Lego NXT Brick on Ubuntu</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Flash-a-Lego-NXT-Brick-on-Ubuntu</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Flash-a-Lego-NXT-Brick-on-Ubuntu</guid>
    <description><![CDATA[ &lt;p&gt;Flashing the Lego NXT brick on Ubuntu is pretty straight forward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the &lt;a href=&quot;http://mindstorms.lego.com/en-us/support/files/default.aspx#Firmware&quot; class=&quot;external&quot;&gt;latest firmware&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (or any other firmware of your choice).&lt;/li&gt;
&lt;li&gt;Download &lt;a href=&quot;http://code.google.com/p/libnxt/&quot; class=&quot;external&quot;&gt;libnxt&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, patch in the &lt;a href=&quot;http://code.google.com/p/libnxt/issues/detail?id=2&quot; class=&quot;external&quot;&gt;bug fix&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, and build it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sudo apt-get install build-essential libusb-dev scons&lt;/p&gt;
&lt;p&gt;cd libnxt-0.3&lt;/p&gt;
&lt;p&gt;scons&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put the NXT brick into firmware upload mode by turning it on and then pressing the reset button for four seconds. At this point, the screen should be blank and the brick should be making a clicking noise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/reset_nxt.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;fwflash&lt;/code&gt; to flash the new firmware. Using &lt;code&gt;sudo&lt;/code&gt; avoids potential USB permission issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cd libnxt-0.3&lt;/p&gt;
&lt;p&gt;sudo ./fwflash xxx.rfw&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rejoice!&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Sat, 01 Jan 2011 22:00:00 GMT</pubDate>
  </item><item>
    <title>Brain Slug Hat</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Brain-Slug-Hat</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Brain-Slug-Hat</guid>
    <description><![CDATA[ &lt;p&gt;Laura made me this &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_recurring_characters_in_Futurama#Brain_Slugs&quot; class=&quot;external&quot;&gt;Brain Slug&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; hat as an early Christmas gift! I just wanted to share its awesomeness.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101214_214711.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt; ]]></description>
    <pubDate>Tue, 14 Dec 2010 20:58:00 GMT</pubDate>
  </item><item>
    <title>LED Menorah</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/LED-Menorah</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/LED-Menorah</guid>
    <description><![CDATA[ &lt;p&gt;In our house we celebrate all through December. We celebrate Hanukkah, &lt;a href=&quot;http://en.wikipedia.org/wiki/Saint_Nicholas#Germany&quot; class=&quot;external&quot;&gt;Nikolaus&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, Christmas, and with advent calendars and the little elf.&lt;/p&gt;
&lt;p&gt;This year, I built a menorah for Laura using an ATtiny2313 and some LEDs. There are some very nice instructions and code available for the project on &lt;a href=&quot;http://www.evilmadscientist.com/article.php/ledholiday&quot; class=&quot;external&quot;&gt;Evil Mad Scientist Laboratories&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. There’s also a &lt;a href=&quot;http://evilmadscience.com/tinykitlist/44-menorah&quot; class=&quot;external&quot;&gt;kit&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; if you don’t happen to have all the necessary parts lying around.&lt;/p&gt;
&lt;p&gt;If you decide to make your own and it’s your first time programming an AVR, Lady Ada has &lt;a href=&quot;http://www.ladyada.net/learn/avr/programming.html&quot; class=&quot;external&quot;&gt;several&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; &lt;a href=&quot;http://www.ladyada.net/learn/avr/programmers.html&quot; class=&quot;external&quot;&gt;nice&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; &lt;a href=&quot;http://www.ladyada.net/learn/avr/avrdude.html&quot; class=&quot;external&quot;&gt;tutorials&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; on the subject.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101205_151953.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt; ]]></description>
    <pubDate>Sun, 05 Dec 2010 14:23:00 GMT</pubDate>
  </item><item>
    <title>Android-Powered, Automated Cat Feeder</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Powered,-Automated-Cat-Feeder</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Powered,-Automated-Cat-Feeder</guid>
    <description><![CDATA[ &lt;p&gt;This is my Android-powered, automated cat feeder:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101115_224949.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The attached HTC Magic is running &lt;a href=&quot;http://android-scripting.googlecode.com/&quot; class=&quot;external&quot;&gt;SL4A&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and provides scheduled and on demand feeding as well as an &lt;a href=&quot;http://www.damonkohler.com/2010/10/mjpeg-streaming-protocol.html&quot; class=&quot;external&quot;&gt;MJPEG&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; webcam feed. Feeding is triggered via Bluetooth. The &lt;a href=&quot;http://www.arduino.cc/&quot; class=&quot;external&quot;&gt;Arduino&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is hooked up to a &lt;a href=&quot;http://www.sparkfun.com/commerce/product_info.php?products_id=582&quot; class=&quot;external&quot;&gt;SparkFun BlueSMiRF&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and a simple relay circuit I made on perfboard for powering the motor on and off.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101115_225112.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101115_225024.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The brackets and food chute were designed in SketchUp and printed on my &lt;a href=&quot;http://www.makerbot.com/&quot; class=&quot;external&quot;&gt;MakerBot&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. You can find all the SKPs, STLs, schematic, and parts list on &lt;a href=&quot;http://www.thingiverse.com/thing:4782&quot; class=&quot;external&quot;&gt;Thingiverse&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here’s the 50 odd lines of Python code running on the phone via &lt;a href=&quot;http://android-scripting.googlecode.com/&quot; class=&quot;external&quot;&gt;SL4A&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; that make the magic happen:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;python&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; android &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# See http://android-scripting.googlecode.com/&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; gsd  &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# See http://getshitdone.googlecode.com/&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; socket&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; threading&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; feed&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(droid):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid.toggleBluetoothState(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid.bluetoothConnect(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;00001101-0000-1000-8000-00805F9B34FB&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;00:06:66:04:b2:07&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid.bluetoothWrite(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;f&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; Server&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;gsd&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __init__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, droid, webcam_url):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;._droid &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; droid&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;._webcam_url &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; webcam_url&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; GET_&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, response):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    response.Render(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&quot;&quot;&amp;#x3C;html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;title&gt;Cat Feeder&amp;#x3C;/title&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;img src=&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;br&gt;&amp;#x3C;a href=&quot;/feed&quot;&gt;Feed!&amp;#x3C;/a&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  &amp;#x3C;/html&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;._webcam_url)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; GET_feed&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(self, response):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    feed(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;._droid)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    response.Redirect(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;/&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; timer&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(droid):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  feedings &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  last_feeding &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; None&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    hour &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; time.localtime().tm_hour&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; hour &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; feedings &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; hour &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; last_feeding:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      feed(droid)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      last_feeding &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; hour&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    time.sleep(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; GetIpAddress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  s &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; socket.socket(socket.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;AF_INET&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, socket.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;SOCK_DGRAM&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  s.connect((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;google.com&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; s.getsockname()[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; android.Android()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid.wakeLockAcquirePartial()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  webcam_url &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;http://&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; tuple&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(droid.webcamStart(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;).result)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  server &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Server(droid, webcam_url)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  port &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 8080&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  base_url &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;http://&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (GetIpAddress(), port)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  threading.Thread(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;server.Serve, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;0.0.0.0&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, port)).start()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  threading.Thread(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;timer, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(droid,)).start()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  droid.notify(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Cat Feeder&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;Running on: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; base_url)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &#039;__main__&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  main()And here&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&#039;s the Arduino code:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; relayPin &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 13&lt;/span&gt;&lt;span style=&quot;--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; portionSize &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 10000&lt;/span&gt;&lt;span style=&quot;--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;void setup() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  Serial.begin(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;115200&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  pinMode(relayPin, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;OUTPUT&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;void loop() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (Serial.available() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    Serial.read();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    digitalWrite(relayPin, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;HIGH&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    delay(portionSize);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    digitalWrite(relayPin, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;LOW&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This project was inspired by the &lt;a href=&quot;http://www.newtonnet.co.uk/catfeeder/&quot; class=&quot;external&quot;&gt;Internet-Enabled Cat Feeder - Mark 2&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt; ]]></description>
    <pubDate>Mon, 15 Nov 2010 23:40:00 GMT</pubDate>
  </item><item>
    <title>Making The diNovo Edge Work On Ubuntu Lucid</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Making-The-diNovo-Edge-Work-On-Ubuntu-Lucid</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Making-The-diNovo-Edge-Work-On-Ubuntu-Lucid</guid>
    <description><![CDATA[ &lt;p&gt;The &lt;a href=&quot;http://www.amazon.com/Logitech-diNovo-Edge-Keyboard-Black/dp/B000J43HJ8?ie=UTF8&amp;#x26;tag=damonkohler-20&amp;#x26;link_code=btl&amp;#x26;camp=213689&amp;#x26;creative=392969&quot; class=&quot;external&quot;&gt;Logitech diNovo Edge&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;is a pretty slick Bluetooth keyboard. It’s thin, light, has months of battery life, and looks great too. It even works out of the box on Ubuntu Lucid. Well, almost.&lt;/p&gt;
&lt;p&gt;I had trouble with it disconnecting. It would be fine for a day or so, but then not work some evening. Sometimes just the keyboard would stop and the touchpad would be fine. Other times it wouldn’t work at all.&lt;/p&gt;
&lt;p&gt;I had read that one of the great things about the keyboard is that it’s capable of pairing with the dongle without any help from the OS. However, this only works if the dongle isn’t initialized as a Bluetooth device. For example, in the BIOS screen, the keyboard works flawlessly. So, I set about preventing it from being initialized as a Bluetooth device.&lt;/p&gt;
&lt;p&gt;There’s a lot of &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/269851&quot; class=&quot;external&quot;&gt;bug reports&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and &lt;a href=&quot;http://awesomelinux.blogspot.com/2009/06/logitech-dinovo-edge-bluetooth.html&quot; class=&quot;external&quot;&gt;workarounds&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; related to pairing problems, etc. and I didn’t have success with any of the suggestions. Instead, I did something similar to &lt;a href=&quot;http://awesomelinux.blogspot.com/2010/05/ubuntu-1004-lucid-logitech-dinovo-edge.html&quot; class=&quot;external&quot;&gt;this more recent suggestion&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and changed my udev rules. However, instead of making the suggested alteration to the Logitech device rule, I simply commented out the rule entirely. These are the lines of interest in &lt;code&gt;/lib/udev/rules.d/70-hid2hci.rules&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:# Logitech devices&lt;/p&gt;
&lt;p&gt;KERNEL&lt;span class=&quot;text-highlight&quot;&gt;&quot;hiddev*&quot;, ATTRS{idVendor}&lt;/span&gt;”046d”, ATTRS{idProduct}==“c70[345abce]|c71[34bc]”, &lt;br&gt;
RUN+=“hid2hci —method=logitech-hid —devpath=%p”Now that my dongle is not initialized with &lt;code&gt;hid2hci&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;, I can bypass doing any Bluetooth configuration in Ubuntu whatsoever. Flawless victory.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 06 Nov 2010 11:36:00 GMT</pubDate>
  </item><item>
    <title>From Photo to Inkscape to DXF to OpenSCAD to MakerBot to Costume Jewelry</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/From-Photo-to-Inkscape-to-DXF-to-OpenSCAD-to-MakerBot-to-Costume-Jewelry</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/From-Photo-to-Inkscape-to-DXF-to-OpenSCAD-to-MakerBot-to-Costume-Jewelry</guid>
    <description><![CDATA[ &lt;p&gt;There is a &lt;a href=&quot;http://blog.makezine.com/archive/2009/12/make_projects_-_easy_3d_models_with.html&quot; class=&quot;external&quot;&gt;similar tutorial&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; to this one that uses Adobe Illustrator.&lt;/p&gt;
&lt;p&gt;However, Inkscape is a great, free, opensource vector graphics editor. Yesterday I learned how to use it to go from a photo to a 2D drawing and from that to a 3D extruded version of that drawing and finally to a real live object.&lt;/p&gt;
&lt;p&gt;Laura is going as Rachel from Glee this year for Halloween. To complete the outfit, she wanted a “Finn” necklace like the one Rachel is apparently wearing this season&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/glee_necklace.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I opened the picture of the necklace in Inkscape, traced it with the Bezier curve tool, cleaned it up a bit, then selected and deleted the image I traced over. The next step was exporting a DXF.&lt;/p&gt;
&lt;p&gt;The DXFs exported by Inkscape don’t seem to work with OpenSCAD. Instead, I had to install an extension called &lt;a href=&quot;http://tim.cexx.org/?p=590&quot; class=&quot;external&quot;&gt;Better Better DXF Output&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Download the zip and extract it into the extensions folder for Inkscape. On Ubuntu Lucid, the extension should be extracted to &lt;code&gt;/usr/share/inkscape/extensions&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Naturally, the fun didn’t stop there. After installing the extension on Ubuntu Lucid, it started raising Python exceptions. To make it work, you’ll need to replace &lt;code&gt;xpath(path, inkex.NSS)&lt;/code&gt; with &lt;code&gt;xpath(path, namespaces=inkex.NSS)&lt;/code&gt; in &lt;code&gt;b2_dxf_outlines.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, by selecting &lt;code&gt;Save As &gt; Format &gt; Better Better DXF&lt;/code&gt;, I was able to export a DXF that worked with OpenSCAD.&lt;/p&gt;
&lt;p&gt;In OpenSCAD, the code is pretty simple. Unfortunately, the extruded DXF doesn’t show up in the center. I had to zoom out and orbit around a bit to find it. Then I added a translate to move it to the center:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;translate([-25, 270, 0]) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  dxf_linear_extrude(file=&quot;finn.dxf&quot;, height=3, convexity=1, center=true);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To finish up, just click &lt;code&gt;Design &gt; Compile and Render&lt;/code&gt; followed by &lt;code&gt;Design &gt; Export as STL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, I printed it up. Since I have a &lt;a href=&quot;http://store.makerbot.com/makerbot-cupcake-heated-build-platform-v2-0.html&quot; class=&quot;external&quot;&gt;heated build platform&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, the bottom of my prints have a smooth, glossy finish. So, I mirrored the text in ReplicatorG ( &lt;code&gt;Mirror &gt; Reflect in Y&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;) to make the front of the necklace glossy. We don’t have any gold paint yet, so here’s the almost-final product:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101101_105938.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;All of the files are available on &lt;a href=&quot;http://www.thingiverse.com/thing:4651&quot; class=&quot;external&quot;&gt;Thingiverse&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt; ]]></description>
    <pubDate>Mon, 01 Nov 2010 10:22:00 GMT</pubDate>
  </item><item>
    <title>SketchUp 7 Keyboard Shortcuts under Wine</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/SketchUp-7-Keyboard-Shortcuts-under-Wine</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/SketchUp-7-Keyboard-Shortcuts-under-Wine</guid>
    <description><![CDATA[ &lt;p&gt;Installing and running SketchUp 7 under Wine works quite well with Ubuntu Lucid. But, not out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You’ll probably need to do the &lt;a href=&quot;http://wiki.winehq.org/GoogleSketchup&quot; class=&quot;external&quot;&gt;registry hack (and/or others) described on WineHQ’s wiki&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; to get it to start.&lt;/li&gt;
&lt;li&gt;Scrolling through the list of templates doesn’t work but you can browse and select one in the standard file browser dialog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What almost made me walk away from it was that the keyboard shortcuts (e.g. O for orbit and C for circle) weren’t working. In order to fix that, I had to go to Window &gt; Preferences &gt; Shortcuts and click Reset All.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 30 Oct 2010 13:15:00 GMT</pubDate>
  </item><item>
    <title>MJPEG Streaming Protocol</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/MJPEG-Streaming-Protocol</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/MJPEG-Streaming-Protocol</guid>
    <description><![CDATA[ &lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Motion_JPEG&quot; class=&quot;external&quot;&gt;MJPEG&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is a popular format for webcam streams. It’s probably popular because it’s so simple to do and the performance is surprisingly good. Unfortunately, I found it quite difficult to scrape together enough information to implement a streamer myself. In an effort to help the next poor, frustrated soul, here’s a simple method for streaming an MJPEG to a socket in Java.public void handleConnection(Socket socket, JpegProvider jpegProvider) throws Exception {&lt;/p&gt;
&lt;p&gt;byte[] data = jpegProvider.getJpeg();&lt;/p&gt;
&lt;p&gt;OutputStream outputStream = socket.getOutputStream();&lt;/p&gt;
&lt;p&gt;outputStream.write((&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;HTTP/1.0 200 OK\r\n&quot; +

  &quot;Server: YourServerName\r\n&quot; +

  &quot;Connection: close\r\n&quot; +

  &quot;Max-Age: 0\r\n&quot; +

  &quot;Expires: 0\r\n&quot; +

  &quot;Cache-Control: no-cache, private\r\n&quot; + 

  &quot;Pragma: no-cache\r\n&quot; + 

  &quot;Content-Type: multipart/x-mixed-replace; &quot; +

  &quot;boundary=--BoundaryString\r\n\r\n&quot;).getBytes());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;while (true) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data = jpegProvider.getJpeg();

outputStream.write((

    &quot;--BoundaryString\r\n&quot; +

    &quot;Content-type: image/jpg\r\n&quot;. +

    &quot;Content-Length: &quot; +

    data.length +

    &quot;\r\n\r\n&quot;).getBytes());

outputStream.write(data);

outputStream.write(&quot;\r\n\r\n&quot;.getBytes());

outputStream.flush();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt; ]]></description>
    <pubDate>Tue, 19 Oct 2010 21:48:00 GMT</pubDate>
  </item><item>
    <title>Secure Synergy Configuration for HTPC Control</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Secure-Synergy-Configuration-for-HTPC-Control</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Secure-Synergy-Configuration-for-HTPC-Control</guid>
    <description><![CDATA[ &lt;p&gt;I’ve been experimenting with different configurations for controlling my HTPC. Since I typically have my laptop on the couch with me, one setup I’m trying is Synergy.&lt;/p&gt;
&lt;p&gt;By itself, Synergy is completely insecure. However, it’s easy enough to secure through the use of SSH tunnels. There are lots of tutorials for setting up Synergy through a tunnel, but I didn’t find any that suit the HTPC use case I have. To use it with an HTPC, the Synergy server needs to be running on the laptop since that’s where the keyboard and mouse is that you’d like to share across various computers.&lt;/p&gt;
&lt;p&gt;Typically tutorials will have you create tunnels from the Synergy client computers to the Synergy server computer where &lt;code&gt;sshd&lt;/code&gt; is also running. Since my Synergy server is a laptop, I don’t want to run &lt;code&gt;sshd&lt;/code&gt; on it. Instead, I have &lt;code&gt;sshd&lt;/code&gt; running on my HTPC. To make that work, you need a reverse SSH tunnel:ssh -f -R 24800:localhost:24800 htpcInstead of forwarding connections from my laptop to the HTPC, this forwards connections from the HTPC to the laptop. When the Synergy client connects to localhost:24800 on the HTPC, it will be forwarded to &lt;code&gt;localhost:24800&lt;/code&gt; on the laptop. To make that work, you’ll need to edit &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; by adding this to the end:GatewayPorts yes&lt;/p&gt;
&lt;p&gt;AllowTcpForwarding yes # Not strictly necessary, the default is yes.Next you’ll need a &lt;code&gt;synergy.conf&lt;/code&gt; for your laptop. Here’s mine:section: screens&lt;/p&gt;
&lt;p&gt;laptop:&lt;/p&gt;
&lt;p&gt;htpc:&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;section: links&lt;/p&gt;
&lt;p&gt;laptop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;up = htpc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;htpc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;down = laptop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;endFinally, here’s the script I use to make setting up the connection quick and easy:synergys -a localhost -c ~/synergy.conf&lt;/p&gt;
&lt;p&gt;ssh -f -R 24800:localhost:24800 htpc ‘synergyc localhost:24800 &amp;#x26;&amp;#x26; sleep 28800’The sleep is in there so that the connection stays open for a few hours. Here’s why this configuration is secure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Synergy server (synergys) on my laptop is bound to the loopback interface. That means that if I accidentally leave it running and then go online in a coffee shop, no one can connect to it.&lt;/li&gt;
&lt;li&gt;I don’t run &lt;code&gt;sshd&lt;/code&gt; on the laptop which reduces the coffee shop attack surface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Encrypting the connection to the HTPC is unnecessary since both it and the laptop are on the internal, trusted network behind my router. In this case, SSH is only used for its convenient tunneling ability.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 02 Oct 2010 10:46:00 GMT</pubDate>
  </item><item>
    <title>Meet Helo and Miranda</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Meet-Helo-and-Miranda</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Meet-Helo-and-Miranda</guid>
    <description><![CDATA[ &lt;p&gt;We’d like to introduce our cats to the interwebs. While many of you may already know Helo from his &lt;a href=&quot;http://picasaweb.google.com/lh/photo/HfipVqHQc6j-0aIFGQf73w?feat=directlink&quot; class=&quot;external&quot;&gt;previous&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; &lt;a href=&quot;http://picasaweb.google.com/lh/photo/v9MswV814FG9jUn-GdqyDw?feat=directlink&quot; class=&quot;external&quot;&gt;appearances&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, Miranda, at just 3 months old, is a newcomer. She’s a Persian kitten, and very photogenic, just like her big brother.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/helo.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Don’t mess with my kid! Wait, where is my kid anyway?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Helo is from the block. Like his namesake, he’s a big pussy. We rescued him in San Francisco, fixed him up, and made him almost respectable. He remains the master of the house, though he is frequently victimized due to his hesitance to hold the high ground.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/miranda.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I’m Commander Shepard and this is my favorite store on the Citadel.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Miranda is a German princess, bred to be brushed, beautiful, and served. Like her namesake, she wears a skin tight cat suit and is both spunky and snuggly. She takes grooming seriously and is trying to groom our tramp Helo into something respectable and a little less wussy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0108.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0263.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0320.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0328.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0124.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0210.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt; ]]></description>
    <pubDate>Sat, 07 Aug 2010 11:35:00 GMT</pubDate>
  </item><item>
    <title>MakerBot Cupcake CNC</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/MakerBot-Cupcake-CNC</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/MakerBot-Cupcake-CNC</guid>
    <description><![CDATA[ &lt;p&gt;In the summer of 2010, I built a MakerBot Cupcake CNC from a deluxe kit (batch 15). Over the next year, I upgraded nearly every component, added Bluetooth wireless printing, switched from ABS to PLA, and used it to make everything from costume jewelry to a LED menorah. This is the full story of the build, the fixes, and the things I printed.&lt;/p&gt;
&lt;h1 id=&quot;building-the-kit&quot;&gt;Building the Kit&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#building-the-kit&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Cupcake CNC is not a plug-and-play device. The kit arrives as bags of laser-cut plywood, stepper motors, belts, pulleys, a heater barrel, and an extruder you assemble yourself. The instructions for the Cartesian robot are well done; the extruder instructions less so.&lt;/p&gt;
&lt;p&gt;Things to know going in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read the full instructions before you start.&lt;/strong&gt; They’re long, but you’ll avoid mistakes that cost hours to fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get the extras.&lt;/strong&gt; Spray-on silicone lubricant, good digital calipers, a one-side razor scraper, and an ISP programmer (USBtinyISP) for burning bootloaders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure your PTFE bore and thermistor diameter&lt;/strong&gt; and write them down. You’ll need both when calibrating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put a hose clamp around the base of the PTFE&lt;/strong&gt; to prevent bulging. Copper tubing works too, but keep it short — copper conducts heat and defeats the purpose of the thermal insulator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a stick, not a level, for the Z-stage.&lt;/strong&gt; Put one end at the base of each Z-axis rod and adjust the nuts to match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I wound the nichrome wire for the heater barrel, I covered too much of it to screw it back in and still fit the washer and nut. Mark the washer/nut position before winding.&lt;/p&gt;
&lt;h1 id=&quot;breaking-and-fixing&quot;&gt;Breaking and Fixing&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#breaking-and-fixing&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After a few prints, I broke it. The original plastruder stripped filament constantly, the MK4 drive gear wasn’t aggressive enough, and the PTFE insulator eventually bulged. This is normal.&lt;/p&gt;
&lt;p&gt;The fix was replacing nearly every part of the extruder:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MakerGear PEEK plastruder&lt;/strong&gt; — superior thermal design, required for PLA printing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MK5 drive gear&lt;/strong&gt; — dramatically better filament grip&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aluminum idler pulley&lt;/strong&gt; — rock solid compared to the original&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heated build platform v2&lt;/strong&gt; with relay board — eliminated warping entirely, glassy smooth bottoms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filament spindle&lt;/strong&gt; — solves the “filament tangles and stops your print” problem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The heated build platform was the single biggest improvement. Prints went from warped and fragile to flat and professional-looking overnight. Don’t rough up the Kapton tape — it works great smooth. Clean with isopropyl alcohol occasionally.&lt;/p&gt;
&lt;p&gt;After the upgrades, I printed insulator retainers and a Z-axis knob. First prints, best prints.&lt;/p&gt;
&lt;h1 id=&quot;bluetooth-wireless-printing&quot;&gt;Bluetooth Wireless Printing&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#bluetooth-wireless-printing&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Running a USB cable across the room to the printer was annoying, so I added a SparkFun BlueSMiRF Bluetooth serial adapter to the Gen3 RepRap motherboard. The wiring was straightforward — short jumper wires from the BlueSMiRF to the TTL serial header, with the RTS-O pin disconnected to prevent sporadic motherboard resets.&lt;/p&gt;
&lt;p&gt;The Ubuntu side took more work. ReplicatorG doesn’t look for &lt;code&gt;/dev/rfcomm0&lt;/code&gt; by default, and the bundled RXTX library doesn’t work with Bluetooth serial. The fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Remove RepG’s bundled &lt;code&gt;librxtxSerial.so&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Point the classpath at Ubuntu’s system RXTX library&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;-Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0&lt;/code&gt; to the Java command line&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After that: wireless printing from anywhere in the apartment.&lt;/p&gt;
&lt;h1 id=&quot;switching-to-pla&quot;&gt;Switching to PLA&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#switching-to-pla&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When I ran out of ABS, I switched to PLA on a glass build platform heated to 60C with the MakerGear stepper plastruder at 180C. The results were immediately better:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero warping&lt;/strong&gt; — PLA’s low shrinkage rate means flat prints without an enclosure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Glass platform is perfect&lt;/strong&gt; — PLA adheres well, prints tap off cleanly when cool, and the surface is perfectly flat (my HBP had a slight curve that made raftless printing difficult on Kapton)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smells like pancakes&lt;/strong&gt; — seriously, PLA smells great compared to ABS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only downside: PLA is stringier than ABS, so reversal settings need adjustment in Skeinforge.&lt;/p&gt;
&lt;h1 id=&quot;things-i-made&quot;&gt;Things I Made&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#things-i-made&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The MakerBot earned its keep by making actual useful (and fun) &lt;a href=&quot;https://www.thingiverse.com/damonkohler/designs&quot; class=&quot;external&quot;&gt;objects&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;../../Blog/Posts/Android-Powered,-Automated-Cat-Feeder&quot; class=&quot;internal alias&quot; data-slug=&quot;Blog/Posts/Android-Powered,-Automated-Cat-Feeder&quot;&gt;Android-Powered, Automated Cat Feeder&lt;/a&gt;&lt;/strong&gt;: An HTC Magic running &lt;a href=&quot;http://android-scripting.googlecode.com/&quot; class=&quot;external&quot;&gt;SL4A&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; provides scheduled and on demand feeding as well as an &lt;a href=&quot;http://www.damonkohler.com/2010/10/mjpeg-streaming-protocol.html&quot; class=&quot;external&quot;&gt;MJPEG&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; webcam feed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.thingiverse.com/thing:4651&quot; class=&quot;external&quot;&gt;Costume jewelry&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/strong&gt;: For Halloween, Laura wanted a “Finn” necklace from Glee. I photographed the necklace, traced it in Inkscape with Bezier curves, exported to DXF (using the “Better Better DXF Output” extension, with a Python fix for Ubuntu), imported into OpenSCAD, extruded to 3mm, and printed it mirrored so the glossy heated-platform side faced forward.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_20101101_105938.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/glee_necklace.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.thingiverse.com/thing:3936&quot; class=&quot;external&quot;&gt;Upgrades for itself&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/strong&gt;: Insulator retainers, Z-axis knob, extrusion catcher, and eventually a full lowrider and Z-rider conversion — all printed on the machine they were designed to improve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.thingiverse.com/thing:3938&quot; class=&quot;external&quot;&gt;Multi-day pill container&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/strong&gt;: Designed, printed, and assembled in a single weekend calibration session.&lt;/p&gt;
&lt;blockquote class=&quot;callout note is-collapsible is-collapsed&quot; data-callout=&quot;note&quot; data-callout-fold=&quot;&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
                  &lt;div class=&quot;callout-icon&quot;&gt;&lt;/div&gt;
                  &lt;div class=&quot;callout-title-inner&quot;&gt;&lt;p&gt;Timeline &lt;/p&gt;&lt;/div&gt;
                  &lt;div class=&quot;fold-callout-icon&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Milestone&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2010-08-07&lt;/td&gt;&lt;td&gt;Kit assembled (batch 15); first prints&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2010-08-29&lt;/td&gt;&lt;td&gt;Upgraded: MakerGear PEEK plastruder, MK5 drive gear, aluminum idler, heated build platform, filament spindle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2010-11-01&lt;/td&gt;&lt;td&gt;Printed Glee “Finn” necklace — full Inkscape → DXF → OpenSCAD → MakerBot pipeline&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2010-12-05&lt;/td&gt;&lt;td&gt;Built LED menorah with ATtiny2313&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2011-03-20&lt;/td&gt;&lt;td&gt;Added Bluetooth wireless printing via BlueSMiRF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2011-06-04&lt;/td&gt;&lt;td&gt;Switched from ABS to PLA on glass build platform&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; ]]></description>
    <pubDate>Sat, 07 Aug 2010 00:00:00 GMT</pubDate>
  </item><item>
    <title>How far did Tom Petty free fall?</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/How-far-did-Tom-Petty-free-fall</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/How-far-did-Tom-Petty-free-fall</guid>
    <description><![CDATA[ &lt;p&gt;This evening, Laura and I listened to &lt;a href=&quot;http://www.amazon.com/Free-Fallin/dp/B000WOWR00?ie=UTF8&amp;#x26;tag=damonkohler-20&amp;#x26;link_code=btl&amp;#x26;camp=213689&amp;#x26;creative=392969&quot; class=&quot;external&quot;&gt;Tom Petty’s “Free Falling”&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and became curious about just how far he free falls during the song.&lt;/p&gt;
&lt;p&gt;First, a little research:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;http://hypertextbook.com/facts/JianHuang.shtml&quot; class=&quot;external&quot;&gt;terminal velocity of a sky diver&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is approximately &lt;code&gt;55 m/s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://www.wolframalpha.com/input/?i=acceleration+of+gravity+on+earth&quot; class=&quot;external&quot;&gt;acceleration of gravity on Earth&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is &lt;code&gt;9.8 m/s^2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The song is 4 minutes and 15 seconds long. However, Tom Petty only starts free falling at 1 minute and 9 seconds into the song.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now comes the math:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tom Petty is in free fall for &lt;code&gt;4 minutes + 15 seconds - (1 minutes + 9 seconds) = 3 minutes + 6 seconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;He takes &lt;code&gt;55 m/s / 9.8 m/s^2 = 5.6 seconds&lt;/code&gt; to reach terminal velocity.&lt;/li&gt;
&lt;li&gt;He travels &lt;code&gt;(9.8 m/s^2 * (5.6 s)^2) / 2 = 154 meters&lt;/code&gt; before reaching terminal velocity.&lt;/li&gt;
&lt;li&gt;Assuming that he stops free falling at the end of the song, he free falls for a total of &lt;code&gt;3 minutes + 0.4 seconds * 55 m/s + 154 m = 10 kilometers&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can only conclude that he jumped from a passenger jet at a cruising altitude of about 33,000 feet. Ouch.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 06 Jun 2010 17:12:00 GMT</pubDate>
  </item><item>
    <title>Better Orientation Readings in Android</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Better-Orientation-Readings-in-Android</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Better-Orientation-Readings-in-Android</guid>
    <description><![CDATA[ &lt;p&gt;The &lt;a href=&quot;http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ORIENTATION&quot; class=&quot;external&quot;&gt;orientation sensor&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; is deprecated. The new suggested method of determining orientation is a bit more complex, but produces better results. The following example should be enough to get you started. For help with interpreting the results, consult the &lt;a href=&quot;http://developer.android.com/reference/android/hardware/SensorEvent.html&quot; class=&quot;external&quot;&gt;SensorEvent&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; documentation.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; SensorValuesCollector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; SensorEventListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[] mMagneticValues;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[] mAccelerometerValues;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; mAzimuth;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; mPitch;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; mRoll;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onAccuracyChanged&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(Sensor &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;sensor&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt; accuracy&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  @&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;Override&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onSensorChanged&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(SensorEvent &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    synchronized&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (TiltController.this) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      switch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (event.sensor.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getType&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      case&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Sensor.TYPE_MAGNETIC_FIELD&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        mMagneticValues &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; event.values.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        break&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      case&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Sensor.TYPE_ACCELEROMETER&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        mAccelerometerValues &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; event.values.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        break&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (mMagneticValues &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; mAccelerometerValues &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[] R &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[MATRIX_SIZE];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        SensorManager.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getRotationMatrix&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(R, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, mAccelerometerValues, mMagneticValues);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[] orientation &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        SensorManager.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getOrientation&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(R, orientation);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        mAzimuth &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; orientation[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        mPitch &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; orientation[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        mRoll &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; orientation[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Thu, 03 Jun 2010 10:36:00 GMT</pubDate>
  </item><item>
    <title>Using chmod in Android</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Using-chmod-in-Android</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Using-chmod-in-Android</guid>
    <description><![CDATA[ &lt;p&gt;Java doesn’t have native support for platform dependent operations like chmod. However, Android provides utilities for some of these operations via &lt;code&gt;android.os.FileUtils&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;. The &lt;code&gt;FileUtils&lt;/code&gt; class is not part of the public SDK and is therefore not supported. So, use this at your own risk:public int chmod(File path, int mode) throws Exception {&lt;/p&gt;
&lt;p&gt;Class fileUtils = Class.forName(“android.os.FileUtils”);&lt;/p&gt;
&lt;p&gt;Method setPermissions =&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  fileUtils.getMethod(&quot;setPermissions&quot;, String.class, int.class, int.class, int.class);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;chmod(“/foo/bar/baz”, 0755);&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt; ]]></description>
    <pubDate>Thu, 27 May 2010 15:09:00 GMT</pubDate>
  </item><item>
    <title>Bot Commander r1 Released</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Bot-Commander-r1-Released</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Bot-Commander-r1-Released</guid>
    <description><![CDATA[ &lt;p&gt;I just published &lt;a href=&quot;http://code.google.com/p/bot-commander/&quot; class=&quot;external&quot;&gt;Bot Commander&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, the code for my &lt;a href=&quot;http://www.damonkohler.com/2010/05/android-lego-nxt-rover-with.html&quot; class=&quot;external&quot;&gt;Lego NXT rover&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. There’s a lot left to be done, but release early and often, right?&lt;/p&gt;
&lt;p&gt;Currently it provides a UI for controlling the direction and speed of all three motor ports on the NXT brick. You can link motors together to adjust their speed in unison. In addition, you can enable “Tilt Control” for a steering-wheel-type experience. To use tilt control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hook up motor A and B to be the left and right wheels of your vehicle.&lt;/li&gt;
&lt;li&gt;Hold the phone sideways (i.e. landscape).&lt;/li&gt;
&lt;li&gt;Tilt the phone forward and backward to drive forward and backward.&lt;/li&gt;
&lt;li&gt;Turn the phone right and left (like a steering wheel) to steer right and left.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you tilt the phone, you’ll see the UI update the slider controls for the speed of motors A and B.&lt;/p&gt;
&lt;p&gt;I plan to expand the UI to provide a lot more than just motor control. Before that, though, I’ll push a JAR to make it easy to integrate control of Lego NXT robots into your own Android project. The code is based on &lt;a href=&quot;https://sourceforge.net/projects/nxtcommand/&quot; class=&quot;external&quot;&gt;iCommand&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, which already supports a lot (if not all) NXT sensors and such, both official and after market.&lt;/p&gt;
&lt;p&gt;Expect updates as I continue working on my rover. Scan the QR code below to install.&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;p&gt;](&lt;a href=&quot;http://chart.apis.google.com/chart?chs=150x150&amp;#x26;cht=qr&amp;#x26;chl=http://bot-commander.googlecode.com/files/botcommander_r1.apk&amp;#x26;chld=L%7C1&amp;#x26;choe=UTF-8&quot; class=&quot;external&quot;&gt;http://chart.apis.google.com/chart?chs=150x150&amp;#x26;cht=qr&amp;#x26;chl=http://bot-commander.googlecode.com/files/botcommander_r1.apk&amp;#x26;chld=L|1&amp;#x26;choe=UTF-8&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;)&lt;/p&gt; ]]></description>
    <pubDate>Wed, 19 May 2010 21:41:00 GMT</pubDate>
  </item><item>
    <title>Review of Halo ODST</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Halo-ODST</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Halo-ODST</guid>
    <description><![CDATA[ &lt;p&gt;Halo ODST is pretty good, but not stellar. It was very easy to beat.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Damon says&lt;/em&gt;: I had fun playing the game (like I always do with the Halo franchise), but the story line was really weak. There’s a few points where you get to hear some audio from a girl trying to navigate New Mombasa while it’s under attack by the Covenant. The audio is hard to hear and really just not compelling.&lt;/p&gt;
&lt;p&gt;You progress through the game partly through flash backs (of a sort, you play as your comrades) and partly through, what I’m going to call, “normal time.” Some of the battles where good, but they were all pretty standard to Halo (even to the point of ending the game with a Warthog race). I was hoping for something different from a game where you’re not playing the Master Chief.&lt;/p&gt;
&lt;p&gt;The visor mode is interesting, but only useful because they make the game impossible to play without it. Everything is quite dark and the visor allows you to see, in addition to your hand in front of your face, the enemies around you.&lt;/p&gt;
&lt;p&gt;I still have to try fire fight mode before I condemn the game to “fun enough” entirely. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Xbox 360&lt;/strong&gt;
&lt;em&gt;Damon played&lt;/em&gt;: 15 hours
&lt;em&gt;Laura played&lt;/em&gt;: 0 hours&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Pretty good. Not great.
&lt;em&gt;Laura says&lt;/em&gt;: The game play makes me motion sick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay Value&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Still need to try fire fight mode.
&lt;em&gt;Laura says&lt;/em&gt;: May try it. Need Dramamine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Favorite Part&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Nothing stood out, unfortunately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun Factor&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The combat is the same run and gun you’ve come to love from the entire Halo franchise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criticisms&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Lame story.&lt;/p&gt; ]]></description>
    <pubDate>Fri, 14 May 2010 17:28:00 GMT</pubDate>
  </item><item>
    <title>Review of Mass Effect 2</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Mass-Effect-2</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-Mass-Effect-2</guid>
    <description><![CDATA[ &lt;p&gt;Mass Effect 2 is a real adventure.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Laura says&lt;/em&gt;: I loved, loved, loved this game. I felt like I was reading a relatively entertaining sci-fi novel with a good plot despite somewhat strained writing at times. I actually got into it watching Damon choose renegade options and thinking, “Why? The other one would have been so much better!”&lt;/p&gt;
&lt;p&gt;The whole choose-your-own-adventure aspect (RPG? Is that what they’re calling it these days?) is neat. I love the idea of being a hero or a badass. (&lt;em&gt;Damon says&lt;/em&gt;: I prefer to live in the moment. If the guy is a jerk, punch him in the face. If it’s a little kid, cut him a break.) (&lt;em&gt;Laura says&lt;/em&gt;:* *Yeah, but you did not, in fact, cut the kid a break!) In fact, I really liked how your decisions from the first game affect the second so much that after beating the second with the default settings I went back and played the first again so that I could load a character who had made different (paragon) choices. And now I am playing the first again so I can have a character who made renegade choices.&lt;/p&gt;
&lt;p&gt;The dialog is good. Sometimes. Sometimes the dialog is cringe-worthy. Where was QA for all the male love interests? Seth Green is hilarious. Ah, Joker. (&lt;em&gt;Damon says&lt;/em&gt;: Don’t forget that Caprica Six plays the very sexy ship!)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Damon says&lt;/em&gt;: I like that the descriptions of future technology are based in reality. For instance, hacking machines and doors is cool because having you rewire schematics and recompile code to bypass firewalls is semi-realistic and so very much better than Simon Says.&lt;/p&gt;
&lt;p&gt;The story line is quite good. I found the missions to be fast paced, creative, and less linear than in the original. In addition, there were no annoying boss battles (except that the last one, which was a little weak).&lt;/p&gt;
&lt;p&gt;The graphics and audio are good, except when loading a saved game in the middle of a cut scene. In that case the dialog is way too quiet for the first several words.&lt;/p&gt;
&lt;p&gt;Some things disappointed me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Planet scanning for resources to buy upgrades was obnoxious. (*Laura says: *It was so bad it actually made me miss the Mako.)&lt;/li&gt;
&lt;li&gt;The downloadable characters are not nearly as good as the built-in ones. They only have one real mission associated with each. There’s no recruitment mission to speak of, just a loyalty mission.&lt;/li&gt;
&lt;li&gt;It’s still buggy (like the original). Expect to get stuck in walls, etc.&lt;/li&gt;
&lt;li&gt;Autosave is much better but still not to be trusted.&lt;/li&gt;
&lt;li&gt;You can’t get two sniper shots in while using adrenaline rush. So lame. (&lt;em&gt;Laura says&lt;/em&gt;: Playing as an Infiltrator gives you a sniper slowdown, which is awesome!)&lt;/li&gt;
&lt;li&gt;Pressing X to skip though conversations is annoying because you can skip past branches. That really hurts replay value.&lt;/li&gt;
&lt;li&gt;The weapon and armor upgrades are severely limited compared to ME1. Also, the character attributes are over simplified. (&lt;em&gt;Laura says&lt;/em&gt;: I completely disagree. I think the customization in ME1 was overrated. Having to choose which of my five types of weapon I want is hard enough. Don’t make me have to remember to go into the pause menu an upgrade it - for each of my squadmates.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One small nit that I think could be improved in ME3 is shopping. It would be better if you could order from the ship (by email, catalog, teleport, Pony Express, whatever) once a store is found. (&lt;em&gt;Laura says&lt;/em&gt;: Agreed. Why do I have to go tramping through most of Illium for that last weapons upgrade? This was better in ME1.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Xbox 360&lt;/strong&gt;
&lt;em&gt;Damon played&lt;/em&gt;: 50 hours
&lt;em&gt;Laura played&lt;/em&gt;: Too many hours&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: A great game and a lot of fun.
&lt;em&gt;Laura says&lt;/em&gt;: One of my faves. Had me swearing at it less than Mass Effect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay Value&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: I’ll play it through once more on hardcore.
&lt;em&gt;Laura says&lt;/em&gt;: Infinitely. Well, no, but I am on my third run - need my renegade for the next game.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Favorite Part&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The combat is significantly better. Sniping is fun and fighting from cover is comfortable.
&lt;em&gt;Laura says&lt;/em&gt;: I like the RPG aspects, how you can choose whether your character is paragon/renegade, who (s)he romances, etc. And I for one am relieved at the lack of weapons customization. And it’s cool that your choices are going to impact Mass Effect 3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun Factor&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Combat and loyalty missions. Hacking is so much better than the original Simon Says and it’s cool that it feels somewhat realistic. No more Mako!
&lt;em&gt;Laura says&lt;/em&gt;: Interrupts. Also, I like sniping, too. I loved the slow down you get while looking through the sniper scope with the infiltrator class.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criticisms&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: I miss the more complex attribute, weapon, and armor upgrades from the original.
&lt;em&gt;Laura says&lt;/em&gt;: Planet scanning is sloooooooow. Also, don’t get me started on the romances for the female Shepard. Jacob’s dialog is cringe-worthy, romancing Garrus made me feel like Professor Higgins from Pygmalion, and to say Thane has issues would be a terrible understatement. Bring Kaidan back!&lt;/p&gt; ]]></description>
    <pubDate>Thu, 13 May 2010 17:54:00 GMT</pubDate>
  </item><item>
    <title>Android Lego NXT Rover with Stereoscopic Vision</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Lego-NXT-Rover-with-Stereoscopic-Vision</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Android-Lego-NXT-Rover-with-Stereoscopic-Vision</guid>
    <description><![CDATA[ &lt;p&gt;&lt;img src=&quot;../Attachments/IMG_2865.JPG&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_2863.JPG&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_2867.JPG&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is a Lego NXT rover I built. It has independent suspension and enough torque to climb over the annoying threshold trim in every doorway of my apartment. It carries two Android G1s that will eventually provide stereoscopic vision and remote control via Wifi. Currently, it’s remotely controlled by my Nexus One via Bluetooth.&lt;/p&gt;
&lt;p&gt;I experimented a bit with adding four wheel steering, but it got rather complex. Skid steering works well enough for now. If the software side of things works out well, I may replace the wheels with some &lt;a href=&quot;http://www.thingiverse.com/thing:2965&quot; class=&quot;external&quot;&gt;omni-wheels&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; in the future.&lt;/p&gt;
&lt;p&gt;I have some ideas for the stereoscopic vision. Mostly I’m interested in having a 3D remote viewing experience. For that, I’ll need some sort of &lt;a href=&quot;http://www.thingiverse.com/thing:2965&quot; class=&quot;external&quot;&gt;viewer&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will also have to solve the charging problem. I’ll probably start with the &lt;a href=&quot;http://shop.lego.com/Product/?p=9798&quot; class=&quot;external&quot;&gt;NXT Li-Ion pack&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Then I’ll have to build a dock.&lt;/p&gt;
&lt;p&gt;All in all, this project is just getting started. But, I’m excited to have a robotic platform that has full mobility in my apartment. Also, the integration of Android will make development easier.&lt;/p&gt;
&lt;p&gt;Check out the video below to see it climbing over one of those dastardly threshold trim pieces.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 09 May 2010 14:18:00 GMT</pubDate>
  </item><item>
    <title>Review of BioShock 2</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-BioShock-2</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Review-of-BioShock-2</guid>
    <description><![CDATA[ &lt;p&gt;BioShock 2 was a lot of fun. Rapture is even more artistically beautiful and intriguing than in the original. The world is full of details making for a constantly absorbing experience. The enemies are fun to fight and give you plenty of incentive and opportunity to experiment with different weapons and plasmids. Upgrading your character makes you feel powerful and the enemies make various satisfying noises as you dispatch them.&lt;/p&gt;
&lt;p&gt;The spear gun was great. Pinning enemies to walls is a lot of fun. With upgrades, it works like a sniper rifle. However, I found that the game suffers from poor collision detection at times which results in your long shots simply disappearing along the way. You quickly get the hang of dual wielding plasmids and weapons. Certain combinations are obvious and make the game quite easy. You may find yourself varying attacks just to keep it interesting instead of just trying to stay alive.&lt;/p&gt;
&lt;p&gt;I really liked the new research method which encourages you to try out multiple plasmids, weapons, and attacks to get the most research points. In addition, I found that upgrading was easier (i.e. there was more ADAM available and items were cheaper) making it possible to create a &lt;em&gt;huge&lt;/em&gt; combination of tonics and plasmids.&lt;/p&gt;
&lt;p&gt;The additional moral decisions you make along the way are a nice touch. However, they pale in comparison to the depth found in games like Mass Effect and Fable. I occasionally found myself doing things that felt morally ambiguous and wondering if it would affect the outcome. They didn’t.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Xbox 360&lt;/strong&gt;
&lt;em&gt;Damon played&lt;/em&gt;: 30 hours
&lt;em&gt;Laura played&lt;/em&gt;: 0 hours&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: A great game and a lot of fun.
&lt;em&gt;Laura says&lt;/em&gt;: Too much graphic violence to play (and this from someone who counts headshots in Call of Duty). But Rapture is beautifully rendered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay Value&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: I’ll try the multi-player but will probably not play though the single-player again.
&lt;em&gt;Laura says&lt;/em&gt;: I’ll probably never try it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Favorite Part&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The spear gun.
&lt;em&gt;Laura says&lt;/em&gt;: The steampunk art.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun Factor&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: The combat and upgrade system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criticisms&lt;/strong&gt;
&lt;em&gt;Damon says&lt;/em&gt;: Very hard was too hard at the beginning. Hard was too easy at the end. I played through on hard and found the game was fun, though not challenging.
&lt;em&gt;Laura says&lt;/em&gt;: Damon thinks that less blood and gore would make it more accessible to me, but it’s not even that. Parts that Damon likes (like the fact that when you hit someone with a speargun the spear pins them to the wall) are really just too realistic for my taste.  If I’m going to play a game with violence, it has to feel clinical.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 08 May 2010 20:37:00 GMT</pubDate>
  </item><item>
    <title>Outlet Mounted Phone Pocket</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Outlet-Mounted-Phone-Pocket</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Outlet-Mounted-Phone-Pocket</guid>
    <description><![CDATA[ &lt;p&gt;&lt;img src=&quot;../Attachments/pocket.jpg&quot; alt=&quot;&quot;&gt;After looking at &lt;a href=&quot;http://blog.makezine.com/archive/2009/07/make_projects_-_outlet-mount_device.html?CMP=OTC-0D6B48984890&quot; class=&quot;external&quot;&gt;this project on Make&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and realizing that I use that exact same shampoo, I thought I’d give it a try.&lt;/p&gt;
&lt;p&gt;It turned out pretty well. I decided to make my pocket deeper than the one on Make. However, I’ll probably end up cutting it shallower because it’s difficult to pull the phone out. As is, there’s not enough clearance between the top of the phone and the plug without allowing for more angle when pulling it out.&lt;/p&gt;
&lt;p&gt;Another thing I did was use masking tape to layout the cuts instead of a marker. That worked quite well giving me nice straight lines and making it easy to revise my design several times before doing any cutting.&lt;/p&gt;
&lt;p&gt;Since I needed a European version, I couldn’t use the provided template for the plug. Instead, I again used some masking tape to layout a square hole. First, I applied the tape in a square on the plug itself. Then I peeled it off carefully, stuck it on the pocket, and cut it out with a razor. It’s a perfect fit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cutting it about an inch deeper and making the hole in the bottom larger made the pocket significantly more usable.&lt;/p&gt; ]]></description>
    <pubDate>Tue, 04 May 2010 13:29:00 GMT</pubDate>
  </item><item>
    <title>Browsing Android Source in Eclipse</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Browsing-Android-Source-in-Eclipse</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Browsing-Android-Source-in-Eclipse</guid>
    <description><![CDATA[ &lt;p&gt;This has been done before, but the way I set it up now is easier than other methods I’ve seen.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visit the Git site for browsing the &lt;a href=&quot;https://android.git.kernel.org/?p=platform/frameworks/base.git;a=heads&quot; class=&quot;external&quot;&gt;Android framework source&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click the “tree” link next to the branch you want (e.g. Eclair, Donut, Cupcake, etc.)&lt;/li&gt;
&lt;li&gt;Click the “snapshot” link to download a tgz of the source for that branch.&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;sources&lt;/code&gt; directory in the associated platform directory of your Android SDK. For Eclair, it should be something like &lt;code&gt;~/android-sdk-linux_86/platforms/android-7/sources&lt;/code&gt; (depending on where you installed your SDK).&lt;/li&gt;
&lt;li&gt;Extract the tgz to the new &lt;code&gt;sources&lt;/code&gt; directory you created.&lt;/li&gt;
&lt;li&gt;Restart Eclipse and voila, you have browseable Android source code for your chosen platform.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’ll need to repeat these steps for each platform you use as a target for your projects. As a bonus for making it to the end of this post, here’s a summary of platform numbers, version numbers, and code names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cupcake (version 1.5) is &lt;code&gt;platform/android-3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Donut (version 1.6) is &lt;code&gt;platform/android-4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Eclair (version 2.0, 2.0.1, 2.1) is &lt;code&gt;platform/android-{5,6,7}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Mon, 03 May 2010 20:20:00 GMT</pubDate>
  </item><item>
    <title>How to Install Mercurial on Ubuntu</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Install-Mercurial-on-Ubuntu</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Install-Mercurial-on-Ubuntu</guid>
    <description><![CDATA[ &lt;p&gt;Using&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;apt-get&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;to install Mercurial on Karmic will only get you version 1.3. That’s pretty lame. Instead, use&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;easy_install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;and get version 1.5!&lt;/p&gt;
&lt;p&gt;sudo apt-get install python-setuptools build-essential python-dev&lt;/p&gt;
&lt;p&gt;sudo easy_install mercurial&lt;/p&gt; ]]></description>
    <pubDate>Thu, 18 Mar 2010 19:17:00 GMT</pubDate>
  </item><item>
    <title>My 5 Rules for Writing Bash Scripts</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/My-5-Rules-for-Writing-Bash-Scripts</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/My-5-Rules-for-Writing-Bash-Scripts</guid>
    <description><![CDATA[ &lt;ol&gt;
&lt;li&gt;Don’t use Bash.&lt;/li&gt;
&lt;li&gt;Put quotes around all variables: &lt;code&gt;echo &quot;$FOO&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Don’t use Bash.&lt;/li&gt;
&lt;li&gt;Put spaces between everything except assignments: &lt;/li&gt;
&lt;/ol&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;FOO&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; [[ &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$FOO&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ]]; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$FOO&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Don’t use Bash.&lt;/li&gt;
&lt;/ol&gt; ]]></description>
    <pubDate>Tue, 16 Mar 2010 09:04:00 GMT</pubDate>
  </item><item>
    <title>How to Activate an Android Phone Over WiFi</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Activate-an-Android-Phone-Over-WiFi</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-Activate-an-Android-Phone-Over-WiFi</guid>
    <description><![CDATA[ &lt;p&gt;Unfortunately, this only works on phones where USB debugging is enabled by default. &lt;code&gt;adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings&lt;/code&gt;&lt;/p&gt; ]]></description>
    <pubDate>Sat, 13 Mar 2010 17:08:00 GMT</pubDate>
  </item><item>
    <title>Reencode Videos to Play Faster</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Reencode-Videos-to-Play-Faster</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Reencode-Videos-to-Play-Faster</guid>
    <description><![CDATA[ &lt;p&gt;I’m currently recording screencasts (using &lt;a href=&quot;http://en.wikipedia.org/wiki/XVidCap&quot; class=&quot;external&quot;&gt;XVidCap&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;) to use as a video-based help system in &lt;a href=&quot;http://android-scripting.googlecode.com/&quot; class=&quot;external&quot;&gt;ASE&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Because the Android emulator is slow and the steps are quite simple to follow, it’s useful to speed up the playback of the screencast. I’m currently doing this with &lt;a href=&quot;http://en.wikipedia.org/wiki/MEncoder&quot; class=&quot;external&quot;&gt;MEncoder&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (the magic flag is &lt;code&gt;-speed &amp;#x3C;multiplier&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;):&lt;/p&gt;
&lt;p&gt;mencoder input.mpg -ovc lavc -lavcopts vcodec=mpeg4 -speed 2 -oac copy -o output.avi&lt;/p&gt;
&lt;p&gt;I also recommend &lt;a href=&quot;http://fixounet.free.fr/avidemux/&quot; class=&quot;external&quot;&gt;Avidemux&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; (over Open Movie Editor) for your basic editing needs.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 07 Mar 2010 14:32:00 GMT</pubDate>
  </item><item>
    <title>Ubuntu Koala Missing Volume Control: Found!</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Ubuntu-Koala-Missing-Volume-Control-Found!</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Ubuntu-Koala-Missing-Volume-Control-Found!</guid>
    <description><![CDATA[ &lt;p&gt;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 &gt; Preferences &gt; Sound” failed to load. The fix is simple:&lt;/p&gt;
&lt;p&gt;rm -rf ~/.pulse*&lt;/p&gt;
&lt;p&gt;You don’t even have to restart.&lt;/p&gt; ]]></description>
    <pubDate>Mon, 02 Nov 2009 07:08:00 GMT</pubDate>
  </item><item>
    <title>Fixing Karmic Koala&#039;s Broken tzdata Package</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Fixing-Karmic-Koala's-Broken-tzdata-Package</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Fixing-Karmic-Koala's-Broken-tzdata-Package</guid>
    <description><![CDATA[ &lt;p&gt;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;/p&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=&quot;https://launchpad.net/ubuntu/karmic/i386/tzdata/2009f-0ubuntu1&quot; class=&quot;external&quot;&gt;tzdata package&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&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;p&gt;Now everything is working again. Every Ubuntu upgrade is a small adventure. Can’t wait to try it on my desktop.&lt;/p&gt; ]]></description>
    <pubDate>Sun, 01 Nov 2009 08:04:00 GMT</pubDate>
  </item><item>
    <title>Introducing hushnote</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Introducing-hushnote</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Introducing-hushnote</guid>
    <description><![CDATA[ &lt;p&gt;This weekend I decided I wanted to fix my password problem. That is, I wanted my passwords secure and managed in the cloud.&lt;/p&gt;
&lt;p&gt;Let me introduce &lt;a href=&quot;https://hushnote.appspot.com/&quot; class=&quot;external&quot;&gt;hushnote&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, yet another &lt;a href=&quot;http://en.wikipedia.org/wiki/Host-proof_hosting&quot; class=&quot;external&quot;&gt;host-proof&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, web-based password and secret information manager. I was inspired by the simplicity of Aaron Boodman’s &lt;a href=&quot;http://aaronboodman.com/halfnote/browser.php&quot; class=&quot;external&quot;&gt;halfnote&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and Brett Cannon’s &lt;a href=&quot;http://oplop.googlecode.com/&quot; class=&quot;external&quot;&gt;Oplop&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Combining the two felt natural.&lt;/p&gt;
&lt;p&gt;Here is my suggested usage pattern for hushnote:&lt;/p&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;p&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;/p&gt;
&lt;p&gt;The source code isn’t complicated, but here’s the highlight reel:&lt;/p&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; ]]></description>
    <pubDate>Sun, 25 Oct 2009 12:41:00 GMT</pubDate>
  </item><item>
    <title>How to use Manual Focus (the easy way!)</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-use-Manual-Focus-(the-easy-way!)</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/How-to-use-Manual-Focus-(the-easy-way!)</guid>
    <description><![CDATA[ &lt;p&gt;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;/p&gt;
&lt;p&gt;Tonight, I got a new &lt;a href=&quot;http://www.amazon.com/Canon-50mm-1-8-Camera-Lens/dp/B00007E7JU/ref=sr_1_1?ie=UTF8&amp;#x26;s=photo&amp;#x26;qid=1255198598&amp;#x26;sr=1-1&quot; class=&quot;external&quot;&gt;Canon EF 50mm 1.8 II&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; lens for my Digital Rebel XT. It is by far the fastest lens I own (the next fastest is my&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Canon-70-300mm-4-5-6-Lens-Cameras/dp/B0007Y794O&quot; class=&quot;external&quot;&gt;Canon EF 70-300mm f/4-5.6 IS USM&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&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;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/IMG_0046.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I haz no depth in my fieldz!&lt;/p&gt;
&lt;p&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—like you would if you were using autofocus—while adjusting the focus manually, the AF points will light up as those parts of the picture come into focus.&lt;/p&gt; ]]></description>
    <pubDate>Sat, 10 Oct 2009 18:40:00 GMT</pubDate>
  </item><item>
    <title>Finding Unique Files</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Finding-Unique-Files</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Finding-Unique-Files</guid>
    <description><![CDATA[ &lt;p&gt;I’ve posted before about &lt;a href=&quot;http://www.damonkohler.com/2009/03/finding-duplicate-mp3s-using-locality.html&quot; class=&quot;external&quot;&gt;finding duplicate MP3 files&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&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;/p&gt;
&lt;p&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;).&lt;/p&gt;
&lt;p&gt;I restored some files and then ran &lt;a href=&quot;http://premium.caribe.net/~adrian2/fdupes.html&quot; class=&quot;external&quot;&gt;fdupes&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&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.&lt;/p&gt;
&lt;p&gt;To find out, I used a little shell foo:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;sh&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; find&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /pictures/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /backup/pictures/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -exec&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; md5sum&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; {}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; md5sums&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; sort&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; md5sums&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; uniq&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; --check-chars=32&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; --unique&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&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;/p&gt;
&lt;p&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;em&gt;and&lt;/em&gt; that your backup is complete.&lt;/p&gt; ]]></description>
    <pubDate>Wed, 30 Sep 2009 22:18:00 GMT</pubDate>
  </item><item>
    <title>Pletscher ESGE on my Surly Long Haul Trucker</title>
    <link>https://blog-damonkohler.pages.dev/Blog/Posts/Pletscher-ESGE-on-my-Surly-Long-Haul-Trucker</link>
    <guid>https://blog-damonkohler.pages.dev/Blog/Posts/Pletscher-ESGE-on-my-Surly-Long-Haul-Trucker</guid>
    <description><![CDATA[ &lt;p&gt;In addition to &lt;a href=&quot;http://www.damonkohler.com/2009/08/android-g1-bicycle-mount.html&quot; class=&quot;external&quot;&gt;my G1 bike mount&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, I also recently purchased a &lt;a href=&quot;http://www.amazon.de/Zweibeinst%C3%A4nder-PLETSCHER-ESGE-290-schwarz/dp/B0024TTKVK/ref=sr_1_1?ie=UTF8&amp;#x26;s=sports&amp;#x26;qid=1251562322&amp;#x26;sr=8-1&quot; class=&quot;external&quot;&gt;Pletscher ESGE&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; bipod kickstand. While this kickstand is &lt;a href=&quot;http://www.bikeradar.com/beginners/category/accessories/product/multizoom-kickstand-09-34106&quot; class=&quot;external&quot;&gt;usually&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;http://www.palmbeachbiketours.com/my-name-is-ken-and-i-cant-kick-my-kickstand-habit/&quot; class=&quot;external&quot;&gt;raved&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; about, there can be some &lt;a href=&quot;http://groups.google.com/group/SurlyLHT/browse_thread/thread/820a54a932e27cf8?pli=1&quot; class=&quot;external&quot;&gt;difficulty&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; installing it on a Surly Long Haul Trucker (LHT). Possibly the most elegant solutions are &lt;a href=&quot;http://www.flickr.com/photos/29875423@N03/3004393116/in/set-72157607476706942/&quot; class=&quot;external&quot;&gt;this custom bracket&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; and &lt;a href=&quot;http://www.flickr.com/photos/86532560@N00/3585834363/&quot; class=&quot;external&quot;&gt;this newer mount&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; from Pletscher. However, I’ve had success with the standard bracket.&lt;/p&gt;
&lt;p&gt;First, I wrapped the frame in two layers of innertube (which &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;#x26;source=s_q&amp;#x26;hl=en&amp;#x26;geocode=&amp;#x26;q=alpenrausch+munich&amp;#x26;sll=48.162278,11.574461&amp;#x26;sspn=0.011278,0.021865&amp;#x26;ie=UTF8&amp;#x26;ll=48.163681,11.574783&amp;#x26;spn=0.087363,0.174923&amp;#x26;z=13&amp;#x26;iwloc=A&quot; class=&quot;external&quot;&gt;my local bike shop&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&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;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/img_0023.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../Attachments/img_0022.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt; ]]></description>
    <pubDate>Sat, 29 Aug 2009 16:26:00 GMT</pubDate>
  </item>
    </channel>
  </rss>