<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1133802111281560341</id><updated>2011-12-11T15:25:17.400+01:00</updated><category term='Python'/><category term='GnuPG'/><category term='Scala'/><category term='Firefox'/><category term='Lift'/><category term='itracku'/><category term='Multimedia'/><category term='UPnP'/><category term='mesa'/><category term='english'/><category term='UMTS'/><category term='usb'/><category term='Linux'/><category term='NetCologne'/><category term='Networking'/><category term='blender'/><category term='Datenbanken'/><category term='Sicherheit'/><category term='Ubuntu'/><category term='Tutorial'/><category term='Gnome'/><category term='karmic'/><category term='T-Mobile'/><category term='Hugin'/><title type='text'>TuxPool</title><subtitle type='html'>Infos, Meldungen, Ansichten - rund um Open Source</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4523863926980606035</id><published>2011-12-11T14:50:00.001+01:00</published><updated>2011-12-11T15:25:17.406+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedia'/><title type='text'>Replay Gain on Sansa Clip+ with mp3gain</title><content type='html'>If you play MP3 songs from different sources in shuffle mode on a MP3 player, their difference in loudness become apparent and you are constantly keep adjusting the volume.&lt;br /&gt;&lt;br /&gt;In order to prevent that, &lt;b&gt;Replay Gain&lt;/b&gt; can be used. With this function the MP3 player uses loudness information in the header of a MP3 file to adjust the volume automatically.&lt;br /&gt;&lt;br /&gt;However, the loudness information is not present by default. You need software to analyse the content and store those values in the MP3 header. &lt;i&gt;Replay Gain&lt;/i&gt; does not change the underlying (music) data, thus avoiding loss in quality by decoding, processing and re-encoding.&lt;br /&gt;&lt;br /&gt;A popular utility in the Linux world to calculate these values and tagging the file is &lt;b&gt;mp3gain&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;I used it regularly, but I was still adjusting the volume on my Sansa Clip+ ...&lt;br /&gt;&lt;br /&gt;What I didn't know was, that by default &lt;i&gt;mp3gain&lt;/i&gt; stores the information in the &lt;a href="http://en.wikipedia.org/wiki/APE_tag" target="_blank"&gt;APEv2&lt;/a&gt; tag which the Sansa Clip does not read.  In order to be used by the Sansa Clip's Replay Gain function, it must be stored in the &lt;a href="http://draft.blogger.com/If%20you%20play%20MP3%20songs%20from%20different%20source%20in%20shuffle%20mode%20on%20a%20MP3%20player%20their%20differences%20in%20loudness%20become%20apparent%20and%20you%20are%20constantly%20keep%20adjusting%20the%20volume.%20%20In%20order%20to%20prevent%20that,%20%3Cb%3EReplay%20Gain%3C/b%3E%20can%20be%20used.%20This%20function%20uses%20loudness%20information%20in%20the%20header%20of%20a%20MP3%20file%20to%20adjust%20the%20volume.%20%20%20However,%20the%20loudness%20information%20is%20not%20present%20in%20the%20header%20by%20default.%20You%20need%20software%20to%20analyse%20the%20content%20and%20store%20those%20values%20in%20the%20MP3%20header.%20This%20process%20does%20not%20change%20the%20underlying%20%28music%29%20data,%20thus%20avoiding%20loss%20in%20quality%20by%20decoding,%20processing%20and%20re-encoding.%20%20A%20popular%20utility%20in%20the%20Linux%20world%20to%20calculate%20these%20values%20and%20tagging%20the%20file%20accordingly%20is%20%3Cb%3Emp3gain%3C/b%3E.%20%20I%20used%20it%20regularly,%20but%20I%20was%20still%20adjusting%20the%20volume%20on%20my%20Sansa%20Clip+%20...%20%20%3Ci%3Emp3gain%3C/i%3E%20stores%20the%20information%20in%20a%20%3Ca%20href=%22http://en.wikipedia.org/wiki/APE_tag%22%3EAPEv2%3C/a%3E%20tag%20which%20the%20Sansa%20Clip%20does%20not%20read.%20%20In%20order%20to%20be%20used%20by%20the%20Sansa%20Clip%27s%20Replay%20Gain%20function,%20it%20must%20be%20stored%20in%20the%20ID3v2%20tag." target="_blank"&gt;ID3v2&lt;/a&gt; tag.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;mp3gain&lt;/i&gt; has an option to do exactly that: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;-s i&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm now using the following command to analyse and tag my MP3 files:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mp3gain -p -s i *&lt;/div&gt;&lt;br /&gt;Where the option &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;-p&lt;/span&gt; also preserves the original file date.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4523863926980606035?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4523863926980606035/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4523863926980606035' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4523863926980606035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4523863926980606035'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2011/12/replay-gain-on-sansa-clip-with-mp3gain.html' title='Replay Gain on Sansa Clip+ with mp3gain'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-223074919379853003</id><published>2011-03-03T21:58:00.001+01:00</published><updated>2011-03-07T17:12:16.961+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lift'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Lift and AutoComplete</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;The Lift-Web-Framework allows you easy access to JQuery's AutoComplete widget. If you have used Google, you might agree that the drop down list which is populated with entries depending on your current input is a nice thing to have.&lt;/p&gt;&lt;p&gt;Here is how you integrate it into your Lift application.&lt;/p&gt;&lt;p&gt;First you have to add a dependency to your project (in this case Lift 2.2, using Scala 2.8.0):&lt;/p&gt;&lt;p&gt;If you use SBT in &lt;span style="font-family:courier new,courier;"&gt;./project/build/Project.scala&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;override def libraryDependencies = Set( &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt; ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt; "net.liftweb" % "lift-widgets_2.8.0" % “2.2” % "compile-&amp;gt;default", &lt;/span&gt;&lt;/p&gt;&lt;p&gt;In a Maven project this should translate to (in &lt;span style="font-family:courier new,courier;"&gt;pom.xls&lt;/span&gt; - not tested, I'm using SBT):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupid&amp;gt;net.liftweb&amp;lt;/groupid&amp;gt;&lt;br /&gt;  &amp;lt;artifactid&amp;gt;lift-widgets&amp;lt;/artifactid&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;2.2-scala280&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;The first step in your application is the initialisation, by adding the following code – usually into into&lt;span style="font-family:courier new,courier;"&gt; Boot.scala&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;import _root_.net.liftweb.widgets.autocomplete._&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;class Boot {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    def boot {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    …&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    AutoComplete.init&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In your template, the widget is represented like any other input field with a tag of your choice. This example uses &lt;span style="font-family:courier new,courier;"&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Here the snippet code to bind it:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt; Helpers.bind("dt", in,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   "autocomplete" -&amp;gt; AutoComplete(startValue,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;      buildQuery _,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;      value =&amp;gt; processResult(value)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   ),&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;where:&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;startValue&lt;/span&gt; is a string for the initial value of the AutoComplete text field.&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;buildQuery&lt;/span&gt; is a function to populate the drop down list.&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;processResult&lt;/span&gt; is a function called when the form is submitted, containing the value of the widget (or not, see bug report below).&lt;/p&gt;&lt;p&gt;Here is a simple example of &lt;i&gt;processResult&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;def processResult(s : String) = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   println("%s".format(s))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The interesting part is the &lt;i&gt;buildQuery&lt;/i&gt; function. It has the following signature:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;def buildQuery(current: String, limit: Int): Seq[String] = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;where&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;current&lt;/span&gt;  is the string typed into the autoComplete text field.&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;limit&lt;/span&gt; is an integer to limit the number of Strings returned by the function&lt;/p&gt;&lt;p&gt;A valid but not very useful implementation would be (from &lt;a target="_blank" href="http://demo.liftweb.net/ajax"&gt;http://demo.liftweb.net/ajax&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;def buildQuery(current: String, limit: Int): Seq[String] = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;    (1 to limit).map(n =&amp;gt; current+""+n)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Most application however will query a database. Lets assume that &lt;span style="font-family:courier new,courier;"&gt;Mydatabase&lt;/span&gt; has a field called &lt;span style="font-family:courier new,courier;"&gt;name&lt;/span&gt; (e.g. with the names of employees). A query might look like this:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt; def buildQuery(current: String, limit: Int): Seq[String] = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   Mydatabase.findAll(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;       Like(Mydatabase.name,(current + "%")),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;       OrderBy(Mydatabase.name,Ascending),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;       MaxRows(limit)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;   ).map( _.name.is)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will &lt;span style="font-family:courier new,courier;"&gt;findAll name&lt;/span&gt;s in &lt;span style="font-family:courier new,courier;"&gt;Mydatabase&lt;/span&gt; which start with the &lt;span style="font-family:courier new,courier;"&gt;current&lt;/span&gt;ly entered string, sorts them, and &lt;span style="font-family:courier new,courier;"&gt;limit&lt;/span&gt; the number of results.&lt;/p&gt;&lt;p&gt;That's all you need.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;Bug or a feature?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The current implementation of the AutoComplete functionality (Lift 2.2) only allows the selection from a drop down list as a valid input.  This sounds reasonable, but it also prevents you from clearing the input after you have made a selection.  This can lead to the following situation:&lt;/p&gt;&lt;p&gt;At a shopping site, the user selects an article via an autocomplete field.  Then he changes his mind and clears the input field using the delete key.  When he clicks on the submit button the previous selected article is sent to the server, even if the screen shows an empty text field.&lt;/p&gt;&lt;p&gt;With the &lt;a target="_blank" href="http://groups.google.com/group/liftweb/browse_thread/thread/bbd45a54792f1a1a/e5fefb17816efc3e?lnk=raot" title="help"&gt;help&lt;/a&gt; of Sergey Andreev, I have developed a small &lt;a target="_blank" href="https://www.assembla.com/spaces/liftweb/documents/download/do2WDIrs4r4lmSeJe5cbLA" title="patch"&gt;patch&lt;/a&gt; which has also been published in Lift &lt;a target="_blank" href="https://www.assembla.com/spaces/liftweb/tickets/892-autocomplete%28%29-should-have-option-to-allow-user-to-enter-their-own-value" title="ticket 892"&gt;ticket 892&lt;/a&gt;. Even though it is only 8 lines long, it is unlikely to make it into Lift due to Intellectual Property policy consideration by DPP.&lt;/p&gt;&lt;p&gt;The patched version is available on &lt;a target="_blank" href="https://github.com/MrMistr/autocomplete" title="GitHub"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you copy it into your project, you might want to change the package name (first and last three lines) and replace&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;import _root_.net.liftweb.widgets.autocomplete._&lt;/span&gt;&lt;/p&gt;&lt;p&gt;with your package name.&lt;/p&gt;&lt;p&gt;Keep in mind that the returned result may contain strings (including an empty string) that might be invalid.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-223074919379853003?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/223074919379853003/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=223074919379853003' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/223074919379853003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/223074919379853003'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2011/03/lift-and-autocomplete.html' title='Lift and AutoComplete'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4501821825356116947</id><published>2010-12-15T01:46:00.001+01:00</published><updated>2010-12-15T01:47:07.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itracku'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>itrackutil 0.1.3 available</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;After a recent update in Ubuntu 10.10 and 10.04 &lt;a target='_blank' href='http://itrackutil.sourceforge.net/download.html'&gt;itrackutil.py&lt;/a&gt; exits with the the error message “USBError: Resource Busy” before the user is able to download GPS data from the device.&lt;br/&gt;This version fixes the problem.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Developer information:&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;A previously unrelated kernel module (cdc_acm) suddenly started to grab the USB device. &lt;a target='_blank' href='http://www.linux-usb.org/USB-guide/x332.html'&gt; cdc_acm&lt;/a&gt;  which usually supports USB modems now creates the device &lt;font face='Courier New'&gt;/dev/ttyACM0&lt;/font&gt; as soon as the GPS mouse is plugged in. &lt;br/&gt;&lt;br/&gt;If you read &lt;font face='Courier New'&gt;/dev/ttyACM0&lt;/font&gt; you get the real-time GPS data in NEMA format.  This is an unusual use case. The normal data connection is over Bluetooth.&lt;br/&gt;&lt;br/&gt;However, the creation of this device file blocks all other USB access to the GPS mouse; in this case the direct USB communication which itrackutil.py uses to access the data stored within the unit's memory.&lt;br/&gt;&lt;br/&gt;Fortunately there is an USB API call for this situation: &lt;font face='Courier New'&gt;detachKernelDriver&lt;/font&gt;. &lt;br/&gt;This function does, what it says it does.  You have to call it after opening the device. Root privileges are not necessary.&lt;br/&gt;&lt;br/&gt;The call will fail, if there is no kernel driver to detach. You have to catch this exceptions:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;... determine device, interface, and configuration ...&lt;br/&gt;&lt;br/&gt;try:&lt;br/&gt;    handle = device.open()&lt;br/&gt;    handle.detachKernelDriver(interface)&lt;br/&gt;except usb.USBError, err:&lt;br/&gt;    if str(err).find('could not detach kernel driver from interface') &amp;gt;= 0:&lt;br/&gt;        pass&lt;br/&gt;    else:&lt;br/&gt;        raise usb.USBError,err       # any other USB error&lt;br/&gt;&lt;br/&gt;handle.setConfiguration(configuration)&lt;br/&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;The companion API call &lt;font face='Courier New'&gt;attachKernelDriver&lt;/font&gt; is not available via PyUSB 0.1. But this is only a minor problem, because as soon as you unplug the unit and reconnect it, a new USB device file is created (with the kernel driver attached).&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4501821825356116947?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4501821825356116947/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4501821825356116947' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4501821825356116947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4501821825356116947'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/12/itrackutil-013-available.html' title='itrackutil 0.1.3 available'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5393810893789816359</id><published>2010-11-13T20:37:00.001+01:00</published><updated>2010-12-16T16:59:46.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedia'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>WinTV-HVR-1900 under Ubuntu 10.04 and 10.10</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img width='242' height='215' style='max-width: 800px;' src='http://lh5.ggpht.com/_wCX5P_aGQzo/TN7onzHXgVI/AAAAAAAAAHo/cvbpYHu3FeM/%5BUNSET%5D.jpg?imgmax=800'/&gt;&lt;br/&gt;&lt;br/&gt;A few weeks ago I bought a Hauppauge WinTV-HVR-1900 (USB id &lt;font face='Courier New'&gt;2040:7300&lt;/font&gt;) which I wanted to use with a (32 bit) Ubuntu 10.04 and 10.10 system. &lt;br/&gt; &lt;br/&gt;Quick installation summary: &lt;br/&gt;&lt;ul&gt;&lt;li&gt;Does it work out of the box: No &lt;/li&gt;&lt;li&gt;Does it work at all: Yes &lt;/li&gt;&lt;li&gt;If you are able to update to Ubuntu 10.10, do it. &lt;/li&gt;&lt;/ul&gt;This post only describes how to get the basic functionality working (i.e. display/record a signal on the composite video input). &lt;br/&gt; &lt;br/&gt;The HVR 1900 is a small box which is connected via a USB2 port (USB1 is not supported for bandwidth reasons). There are inputs for composite video (e.g. VCR or set-top box) an antenna input and a S-VHS input. The device comes with a UK power supply (with a UK mains plug) and a bulky mains plug adapter for continental Europe. &lt;br/&gt; &lt;br/&gt;In order to get the digitizer running, this device needs firmware.  Ubuntu comes with a selection of firmware images for various Hauppauge systems, but none was suitable for this device. &lt;br/&gt; &lt;br/&gt;The firmware is included on the Windows driver disk you get with the device, but which files do you need?  Fortunately there is a perl script &lt;a target='_blank' href='http://www.isely.net/downloads/fwextract.pl'&gt;available&lt;/a&gt; that scans the CD and extracts the files you need based on a bunch of MD5 sums stored in that script.  Perl is installed by default on a Ubuntu system, so slide in the CD, open a terminal and enter &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;perl fwextract.pl /media/XXXXXXXXXX &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;(where XXXXX is the CD title) &lt;br/&gt; &lt;br/&gt;In my case the following files were found: &lt;br/&gt;&lt;ul&gt;&lt;li&gt;v4l-cx2341x-enc.fw &lt;/li&gt;&lt;li&gt;v4l-cx25840.fw &lt;/li&gt;&lt;li&gt;v4l-pvrusb2-29xxx-01.fw &lt;/li&gt;&lt;li&gt;v4l-pvrusb2-73xxx-01.fw &lt;/li&gt;&lt;/ul&gt; &lt;br/&gt;For the next steps you need root privileges: &lt;br/&gt; &lt;br/&gt;&lt;ul&gt;&lt;li&gt;Change the ownership of those files to root (for security reasons)&lt;br/&gt;&lt;font face='Courier New'&gt;sudo chown root:root *fw &lt;/font&gt;&lt;/li&gt;&lt;li&gt;Copy the extracted files to&lt;font face='Courier New'&gt; /lib/firmware&lt;/font&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;sudo cp *fw /lib/firmware &lt;/font&gt;&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt; If you're running Ubuntu 10.10, that's all you have to do. &lt;br/&gt; &lt;br/&gt;Keep an eye on the system log when you now plug the digitizer into the USB port. &lt;br/&gt;&lt;font face='Courier New'&gt;tail -f /var/log/syslog &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;Among other messages, it should confirm that the firmware was uploaded successfully. &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;... &lt;br/&gt;cx25840 5-0044: firmware: requesting v4l-cx25840.fw &lt;br/&gt;cx25840 5-0044: loaded v4l-cx25840.fw firmware (16382 bytes) &lt;br/&gt;... &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;Utilities for controlling the device from the command line can be found in the package &lt;font face='Courier New'&gt;ivtv-utils&lt;/font&gt; (from the Ubuntu repo). &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;v4l2-ctl --set-input 1 &lt;/font&gt;&lt;br/&gt; switches to the composite video input &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;v4l2-ctl --set-ctrl=brightness=128,hue=0,contrast=68,volume=54000 &lt;/font&gt;&lt;br/&gt; sets basic parameters for the digitizer. &lt;br/&gt; &lt;br/&gt;Call &lt;font face='Courier New'&gt;v4l2-ctl&lt;/font&gt; without parameters for more help, and you will definitively want to try the switch &lt;font face='Courier New'&gt;-L &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;Recording is as simple as: &lt;br/&gt;&lt;font face='Courier New'&gt;cp /dev/video0 video.mp2 &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;This works most of the time.  Approx. 5% of the recordings contain a distorted audio stream. This distortion is present for the whole length of the recording and usually ends the next time the device&lt;font face='Courier New'&gt; /dev/video0&lt;/font&gt; is opened.  &lt;br/&gt; &lt;br/&gt;If the audio is ok at the beginning, it stays that way.  This looks like an initialization problem when the device is opened.  I haven't found a fix, yet. &lt;br/&gt;  &lt;br/&gt;Now to the more difficult part:&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Getting the device to work under Ubuntu 10.04. &lt;/b&gt;&lt;br/&gt; &lt;br/&gt;As mentioned before, many Hauppauge devices need firmware, which is uploaded to the unit when you plug it into the USB port.  Older hardware only needed 8192 bytes of firmware.  The firmware for this device however is 16382 bytes long (see the above firmware upload message from the log).  The device driver controlling the HVR-1900 (pvrusb2) that comes with kernel 2.6.32 and earlier is only capable of transferring 8192 bytes. And Ubuntu 4.10 LTS uses... 2.6.32. &lt;br/&gt; &lt;br/&gt;Newer versions of the pvrusb2 driver can also upload the larger firmware.  For older kernels (like the one used in Ubuntu 4.10), you have to compile the updated driver yourself. &lt;br/&gt; &lt;br/&gt;Compiling a kernel is usually a simple task, because the kernel source code already contains all dependencies. But this time, there were complications. &lt;br/&gt; &lt;br/&gt;You need: &lt;br/&gt;&lt;ul&gt;&lt;li&gt; the kernel source &lt;/li&gt;&lt;li&gt; the tools to &lt;a target='_blank' href='https://help.ubuntu.com/community/Kernel/Compile%20'&gt;compile the kernel&lt;/a&gt;&lt;br/&gt;&lt;/li&gt;&lt;li&gt; and the source of the updated driver &lt;/li&gt;&lt;/ul&gt;The easiest way to get the Ubuntu Linux source is by installing a package named "linux-source". It will store the source code as an archive in &lt;font face='Courier New'&gt;/usr/src/linux-source-2.6.32.tar.bz2  &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;You have to unpack it - make sure that you have plenty of disk space available: &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;cd /usr/src &lt;br/&gt;tar xvfj linux-source-2.6.32.tar.bz2 &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;Then run the following commands &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;cd linux-source-2.6.32 &lt;br/&gt;make oldconfig &lt;br/&gt;make prepare &lt;br/&gt; &lt;/font&gt;&lt;br/&gt;This will "regenerate" the &lt;font face='Courier New'&gt;.config&lt;/font&gt; file used by your distribution's kernel.  This file is needed during the kernel compilation. &lt;br/&gt; &lt;br/&gt;Now we have to download the source code of the current pvrusb2 driver which can be found &lt;a target='_blank' href='http://www.isely.net/pvrusb2/download.html'&gt;here&lt;/a&gt;. Unpack it and copy the content of the directory driver to &lt;font face='Courier New'&gt;/usr/src/linux-source-2.6.32/drivers/media/video/pvrusb2/&lt;/font&gt; overriding the current files with the same name. &lt;br/&gt; &lt;br/&gt;(Please note: the pvrusb2 documentation is describing a different approach, that did not work for me (modprobe rejected the module)) &lt;br/&gt;  &lt;br/&gt;The next step &lt;b&gt;would&lt;/b&gt; be: &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;make modules &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;But due to a totally unrelated &lt;a target='_blank' href='https://bugs.launchpad.net/ubuntu/+source/linux/+bug/505420'&gt;bug&lt;/a&gt;  the compilation will fail, while trying to compile the "omnibook" files. &lt;br/&gt; &lt;br/&gt;Download the patch for this bug from &lt;a target='_blank' href='http://launchpadlibrarian.net/37672643/patch'&gt;here&lt;/a&gt; and apply it &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;cd /usr/src &lt;br/&gt;patch -p0 _name_of_the_path_file_ &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;Now it's time to compile the modules: &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;cd /usr/src/linux-source-2.6.32 &lt;br/&gt;make modules &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;This step is very time consuming. If you have a multi core processor use the &lt;font face='Courier New'&gt;-j#&lt;/font&gt; option (where # is the number of cores you have). &lt;br/&gt; &lt;br/&gt;Copy the new module from &lt;br/&gt;&lt;font face='Courier New'&gt;/usr/src/linux-source-2.6.32/drivers/media/video/pvrusb2/pvrusb2.ko &lt;/font&gt;&lt;br/&gt;to &lt;br/&gt;&lt;font face='Courier New'&gt;/lib/modules/`uname -r`/kernel/drivers/media/video/pvrusb2/pvrusb2.ko &lt;/font&gt;&lt;br/&gt; &lt;br/&gt;(where &lt;font face='Courier New'&gt;`uname -r`&lt;/font&gt; (backticks!) will be replaced by the name of your current kernel) &lt;br/&gt; &lt;br/&gt;Keep in mind that you have to repeat that process after each kernel update. &lt;br/&gt; &lt;br/&gt;After the next reboot the new module should be active. If you can't wait, unload the old one and load the new module manually: &lt;br/&gt; &lt;br/&gt;&lt;font face='Courier New'&gt;rmmod pvrusb2 &lt;br/&gt;modprobe pvrusb2 &lt;br/&gt; &lt;/font&gt;&lt;br/&gt;Again, check&lt;font face='Courier New'&gt; /var/log/syslog&lt;/font&gt; for any problems. &lt;br/&gt; &lt;br/&gt;Links: &lt;br/&gt;&lt;ul&gt;&lt;li&gt;http://www.isely.net/pvrusb2 &lt;/li&gt;&lt;li&gt;http://www.isely.net/pipermail/pvrusb2/ &lt;/li&gt;&lt;li&gt;https://help.ubuntu.com/community/Kernel/Compile&lt;/li&gt;&lt;li&gt;http://www.isely.net/downloads/fwextract.pl&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5393810893789816359?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5393810893789816359/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5393810893789816359' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5393810893789816359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5393810893789816359'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/11/wintv-hvr-1900-under-ubuntu-410-and.html' title='WinTV-HVR-1900 under Ubuntu 10.04 and 10.10'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_wCX5P_aGQzo/TN7onzHXgVI/AAAAAAAAAHo/cvbpYHu3FeM/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5067835062282710962</id><published>2010-10-20T21:42:00.002+02:00</published><updated>2010-11-13T20:22:35.517+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>ColorCube on a 64 bit machine</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div style='clear: left; float: left; margin-bottom: 1em; margin-right: 1em;'&gt;&lt;img width='239' height='179' style='max-width: 800px;' src='http://lh4.ggpht.com/_wCX5P_aGQzo/TL9HFZGvF6I/AAAAAAAAAHg/CERZ9kitf0Q/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;/div&gt;&lt;br/&gt;After a recent &lt;a target='_blank' href='http://www.blendernation.com/2010/10/12/interview-with-quentin-bolsee-lead-developer-of-the-game-colorcube/'&gt;interview&lt;/a&gt; with Quentin Bolsee, the lead developer of the game &lt;a target='_blank' href='http://www.colorcubestudio.com%20/'&gt;ColorCube&lt;/a&gt;, I  downloaded the demo version of his game.  ColorCube is a simple nice puzzle game that can keep you occupied for hours.&lt;br/&gt;&lt;br/&gt;But I had to find out that the program did not start on my main machine. &lt;br/&gt;&lt;br/&gt;The command &lt;br/&gt;&lt;br/&gt;&lt;span style='font-family: Courier New;'&gt;ldd Launcher&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;quickly revealed that it a 32 bit application, and various libraries were missing on my 64 bit system.&lt;br/&gt;&lt;br/&gt;The package &lt;span style='font-family: Courier New;'&gt;ia32-libs&lt;/span&gt; which provide 32 libraries for 64 bit systems does understandably not contain all libraries that may be installed on a 32 bit system.  A simple work-around is to copy these files from a 32 bit set-up (&lt;span style='font-family: Courier New;'&gt;/usr/lib&lt;/span&gt;) to the 64 bit system (&lt;span style='font-family: Courier New;'&gt;/usr/lib32&lt;/span&gt;).&lt;br/&gt;&lt;br/&gt;Don't forget to set the file owner to root on the target system., and keep in mind that those libraries will not be updated.&lt;br/&gt;&lt;br/&gt;In order go get ColorCube running, I needed to copy the following libraries:&lt;br/&gt;&lt;br/&gt;&lt;span style='font-family: Courier New;'&gt;libHalf.so.6 &lt;br/&gt;libIlmImf.so.6 &lt;br/&gt;libIlmThread.so.6 &lt;br/&gt;libspeex.so.1 &lt;br/&gt;libtheora.so.0 &lt;br/&gt;libIex.so.6 &lt;br/&gt;libImath.so.6 &lt;br/&gt;libraw1394.so.11 &lt;br/&gt;libusb-1.0.so.0 &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Happy gaming...&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5067835062282710962?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5067835062282710962/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5067835062282710962' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5067835062282710962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5067835062282710962'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/10/colorcube-on-64-bit-machine.html' title='ColorCube on a 64 bit machine'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_wCX5P_aGQzo/TL9HFZGvF6I/AAAAAAAAAHg/CERZ9kitf0Q/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6951945356129682872</id><published>2010-08-11T00:49:00.003+02:00</published><updated>2010-08-11T11:46:41.591+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lift'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Lift + Scala, Installation + First contact</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I have installed Lift and Scala on a Linux computer running the current &lt;a href="http://www.ubuntu.com/desktop/get-ubuntu/download" target="_blank"&gt;Ubuntu&lt;/a&gt; version 10.04.  Depending on your distribution, the commands may be different.&lt;br /&gt;&lt;br /&gt;What you need is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;maven2 - a Java software project management and comprehension tool&lt;/li&gt;&lt;li&gt;jetty - a Java servlet engine&lt;/li&gt;&lt;li&gt;Java&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Note that this is not the only possible configuration. There are other project management tools like &lt;a href="http://code.google.com/p/simple-build-tool/" target="_blank"&gt;SBT&lt;/a&gt; and other servlet engines, e.g. &lt;a href="http://tomcat.apache.org/" target="_blank"&gt;Tomcat&lt;/a&gt;. However, the documentation I've seen mostly describes maven and jetty.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation of Scala&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Please note: The following step will install Scala.  It also lets you run Scala commands interactively from the command line.  This is a very good learning tool, especially for beginners.&lt;br /&gt;&lt;br /&gt;This is a modified version of the instructions &lt;a href="http://www.assembla.com/wiki/show/lsug-dojo/Ubuntu_setup" target="_blank"&gt;given&lt;/a&gt; by the London Scala User Group Dojo:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Warning: Do not use Scala from the Ubuntu (10.04) repositories.  The repo contains an older 2.7 variant - we want 2.8!&lt;/li&gt;&lt;li&gt;Create a folder that will hold one or more versions of Scala:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo mkdir /opt/scala&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Change that folders ownership to your username:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo chown -R username.username /opt/scala &lt;/span&gt;&lt;/li&gt;&lt;li&gt;From &lt;a href="http://www.scala-lang.org/downloads" target="_blank"&gt;http://www.scala-lang.org/downloads&lt;/a&gt; download Scala final for Unix, Mac OS X, Cygwin.  This is a gziped tar archive file.&lt;/li&gt;&lt;li&gt;Open the dowloaded file (Archive manager - file-roller) and extract to &lt;span style="font-family: monospace;"&gt;/opt/scala/ &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Create a sybolic link (future proof the install):&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;ln -s /opt/scala/scala-2.8.0.final /opt/scala/current &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Define environment variable SCALA_HOME by editing ~/.bashrc and adding the line:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;export SCALA_HOME=/opt/scala/current &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Add the Scala executables to your path by editing ~/.bashrc and adding the line:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;export PATH=$PATH:$SCALA_HOME/bin &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Open a new terminal or load the changes in your ~/.bashrc file using the command:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;source ~/.bashrc &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Test scala is working using the following command:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;scala -version or scalac -version &lt;/span&gt;&lt;br /&gt;You should see the following as output:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;Scala code runner version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL&lt;br /&gt;Scala compiler version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The version of Scala used for compiling the web app is stored in the maven repos and is at the moment (Juli 2010) at version 2.8.0.RC7.  It will be downloaded and executed during the build process.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation of Java&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ubuntu comes with OpenJDK as standard.  You might want to download the official Java from Sun... I mean Oracle:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enable the partner repositories in Synaptic (or uncomment them in &lt;span style="font-family: monospace;"&gt;/etc/apt/sources.list&lt;/span&gt;) and reload the indices:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo apt-get update&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Download Java&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo apt-get install sun-java6-jdk sun-java6-plugin&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Switch to the Oracle version:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo update-alternatives --config java&lt;br /&gt;sudo update-alternatives --config javac&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Installation of maven2 and jetty&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;sudo apt-get install maven2 jetty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Your first lift application:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Go into an empty directory an issue the following maven2 command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mvn archetype:generate \&lt;br /&gt;-DarchetypeGroupId=net.liftweb \&lt;br /&gt;-DarchetypeArtifactId=lift-archetype-blank \&lt;br /&gt;-DarchetypeVersion=2.0-scala280-SNAPSHOT \&lt;br /&gt;-DarchetypeRepository=http://scala-tools.org/repo-snapshots \&lt;br /&gt;-DremoteRepositories=http://scala-tools.org/repo-snapshots \&lt;br /&gt;-DgroupId=com.example  \&lt;br /&gt;-DartifactId=lift.test \&lt;br /&gt;-Dversion=0.1 \&lt;br /&gt;-DscalaVersion=2.8.0.RC7 &lt;/pre&gt;&lt;br /&gt;An archetype is a project template.  lift-archetype-blank is a simple example Lift application, which is downloaded from http://scala-tools.org/repo-snapshots. You can browse this repository at &lt;a href="http://scala-tools.org/repo-snapshots/net/liftweb" target="_blank"&gt;http://scala-tools.org/repo-snapshots/net/liftweb&lt;/a&gt;&lt;br /&gt;If you use http://scala-tools.org/repo-releases instead you get older more stable builds.  repo-snapshots contains the nightly builds.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;span style="font-family: monospace;"&gt;artifactId&lt;/span&gt; (lift.test) is the name of the top level directory for this project (your choice). &lt;/li&gt;&lt;li&gt;The &lt;span style="font-family: monospace;"&gt;groupId&lt;/span&gt; is mapped (Java style: com.example becomes com/example) to the ./src/main/scala directory (also your choice).&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;version&lt;/span&gt; refers to the version of YOUR software.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;scalaVersion&lt;/span&gt; of Scala in the maven repo. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;After the download the project tree looks like this&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wCX5P_aGQzo/TGHPG7Jh18I/AAAAAAAAAHU/8vUt3IacAPQ/s1600/project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/TGHPG7Jh18I/AAAAAAAAAHU/8vUt3IacAPQ/s640/project.png" width="356" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This might look scary at first.  But there are only 10 files.&lt;br /&gt;&lt;pre&gt;./pom.xml&lt;br /&gt;./src/main/scala/bootstrap/liftweb/Boot.scala&lt;br /&gt;./src/main/scala/com/example/snippet/HelloWorld.scala&lt;br /&gt;./src/main/webapp/index.html&lt;br /&gt;./src/main/webapp/templates-hidden/default.html&lt;br /&gt;&lt;br /&gt;./src/main/webapp/WEB-INF/web.xml&lt;br /&gt;./src/packageLinkDefs.properties&lt;br /&gt;./src/test/scala/com/example/AppTest.scala&lt;br /&gt;./src/test/scala/LiftConsole.scala&lt;br /&gt;./src/test/scala/RunWebApp.scala &lt;/pre&gt;&lt;br /&gt;I'm not sure yet about the last group.  My guess is they are used for unit testing and packaging of the WAR files for later deployment.&lt;br /&gt;&lt;br /&gt;As for the first group:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;pom.xml:&lt;/span&gt; &lt;br /&gt;This is the maven configuration file.&lt;br /&gt;It contains (among others) the URL of the repositories and the dependencies which have to be resolved during the build process.  You will rarely edit this file.  However, if you need modules that are not within the “standard” scope (e.g. a connector to MySQL servers), you have to edit this file in order to get them drawn into your project.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;Boot.scala &lt;/span&gt;(in ./src/main/scala/bootstrap/liftweb/):&lt;br /&gt;This file contains code that is run once when the application is started.&lt;br /&gt;It is used to set-up menus, database connections, etc.  You will have to edit this Scala code frequently when you want to use and configure these features. &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;index.html &lt;/span&gt;(in ./src/main/webapp/):&lt;br /&gt;The default template&lt;br /&gt;This is the template that is evaluated when you access it via the application server without any special file name (e.g. http://localhost:8080/). You will most likely create other templates.&lt;br /&gt;This particular template refers back to&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;default.html&lt;/span&gt; (in ./src/main/webapp/templates-hidden/default.html).&lt;br /&gt;This is also a template, but one that you will rarely change.  It defines the “frame” in which your application runs, i.e. header, footer, menu bar, the html HEAD section (page title, meta tags, CSS definitions, etc.). &lt;br /&gt;Not all   of its content is static.  This file may contain Lift tags, most commonly the ones for displaying the menu, to change the page title, and to display feedback to the user (error messages, notices, warnings).&lt;br /&gt;You may create and use more of these “frame” templates, but in most cases you only need one.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: monospace;"&gt;HelloWorld.scala&lt;/span&gt; (in ./src/main/scala/com/example/snippet/):&lt;br /&gt;a so called snippet.&lt;br /&gt;These files contain the Scala code which fills the  in the templates (e.g. &lt;span style="font-family: monospace;"&gt;index.html&lt;/span&gt;).  This is where most of your coding will happen. You will create more than one snippet file. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Some folders are currently empty:&lt;br /&gt;model, view, comet (in ./src/main/scala/com/example/).&lt;br /&gt;&lt;br /&gt;In the example code I have seen so far, Scala code that defines persistent data structures (e.g. for a database) is stored here.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bringing your application to life&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to start the application change into the top directory (lift.web) and type&lt;br /&gt;&lt;pre&gt;mvn jetty:run&lt;/pre&gt;&lt;br /&gt;After maven has finished downloading all dependencies and building the application, you can access  the web application in your browser via http://localhost:8080 &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6951945356129682872?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6951945356129682872/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6951945356129682872' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6951945356129682872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6951945356129682872'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/08/lifting-scala-installation-first.html' title='Lift + Scala, Installation + First contact'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wCX5P_aGQzo/TGHPG7Jh18I/AAAAAAAAAHU/8vUt3IacAPQ/s72-c/project.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-2888655601638932111</id><published>2010-08-09T23:56:00.001+02:00</published><updated>2010-08-10T23:00:29.128+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Lift'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Lift + Scala, Introduction</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;A recent show of &lt;a href='http://twit.tv/floss125' target='_blank'&gt;Floss Weekly &lt;/a&gt;made me curious about Lift, a web framework using Scala.  &lt;br /&gt;&lt;br /&gt;“Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way.” so they promise  on the Scala &lt;a href='http://www.scala-lang.org' target='_blank'&gt;website&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The &lt;a href='http://liftweb.net/' target='_blank'&gt;Lift&lt;/a&gt; project leader praises his product as “a concise language, frame work with security features, very performant...” &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A first glance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Lift, like any framework that you haven't written yourself, will take some time getting familiar with, and Scala, well, it's just another computer language... or so I thought. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lift&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Perhaps the most important feature of Lift is its template system.  These templates are strictly XML based text files without any programming logic.  Tags within the template link to functions in your Scala code that generates some output.  This output (also XML) then replaces the tag.  After a few more processing steps the result is returned to the enquiring web browser, your page gets rendered, end of story.  Yes, there are lots of support features within the framework – like html form generation, database connectivity, page access control – but this is the basic principle of Lift.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scala&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The designers of Scala cherry-picked the best features and concepts from other programming languages, some object-oriented stuff but they also borrowed heavily from functional programming. Its mantra: “everything is an object” and “if it's worth saying, say it with a function”.&lt;br /&gt;&lt;br /&gt;Scala's smart compiler can in most cases infer types of variables, so you don't have to declare it manually.  The language has lots of these simplyfications, dramatical reducing boiler plate code.  However, you have to be familiar with these in order to be able to revert the expression back to its more verbose form, otherwise you will scratch your head when you encounter the “Scala smiley”:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt; ( _ + _ ) &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Some language constructs help you avoiding Null pointer dereferences, or to catch all possible cases in a matching construct.  And being a statically typed language  the Scala compiler will be very stubborn if your types don't match.&lt;br /&gt;&lt;br /&gt;You can write very elegant code – even though I wouldn't call deeply nested function calls simple to read, at least not yet.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Treacherous simplicity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Letting the compiler infer types looks like a good idea.  On second sight, it also means that you need a good memory or at least a helpful IDE.&lt;br /&gt;&lt;br /&gt;Simplifying &lt;br /&gt;&lt;pre&gt;   val a: Int = 1&lt;/pre&gt;&lt;br /&gt;to &lt;br /&gt;&lt;pre&gt;   val a = 1&lt;/pre&gt;&lt;br /&gt;is simple and easy to understand. (The literal 1 is an integer, i.e. “a” must be integer as well). But:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;val a = function_i_wrote_ealier_and_dont_remember_the_return_type()&lt;br /&gt;val b = another_cool_function_from_the_web_framework(User =&amp;gt; go look)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;does work just as well. And now you either know the types or you have to look it up.&lt;br /&gt;&lt;br /&gt;The possibility to drop dots and brackets in some situation lets you further “simplify” things:&lt;br /&gt;&lt;pre&gt;   a.+(b)&lt;/pre&gt;&lt;br /&gt;becomes a much more friendlier&lt;br /&gt;&lt;pre&gt;   a + b&lt;/pre&gt;(&lt;font face='Courier New'&gt;+&lt;/font&gt; is a valid function name in Scala).&lt;br /&gt;&lt;br /&gt;But &lt;br /&gt;&lt;pre&gt;   a :: b&lt;/pre&gt;&lt;br /&gt;does not mean&lt;br /&gt;&lt;pre&gt;   a.::(b)&lt;/pre&gt;&lt;br /&gt;but&lt;br /&gt;&lt;pre&gt;   b.::(a)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(“Operators” that end with “:” bind from right to left).&lt;br /&gt;&lt;br /&gt;Another nice feature: When defining a class how often have you assigned the values from the constructor parameter list to class variables for later use? It's usually the first thing you do.  In Scala this is done automatically.  Why hasn't somebody invented this earlier?  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Documentation + support&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is documentation available for Lift and Scala on the web.  While perhaps not exactly light reading, they will get you started.&lt;br /&gt;&lt;br /&gt;For Scala &lt;a href='http://programming-scala.labs.oreilly.com/index.html' target='_blank'&gt;http://programming-scala.labs.oreilly.com/index.html&lt;/a&gt; from O'Reilly is a good start, and on the Scala website there is &lt;a href='http://www.scala-lang.org/docu/files/ScalaByExample.pdf' target='_blank'&gt;http://www.scala-lang.org/docu/files/ScalaByExample.pdf&lt;/a&gt;.  Both publications expect that you have done some programming before.&lt;br /&gt;&lt;br /&gt;For Lift you should check out master.pdf from &lt;a href='http://groups.google.com/group/the-lift-book/files' target='_blank'&gt;http://groups.google.com/group/the-lift-book/files&lt;/a&gt;. More information is available at the &lt;a href='http://wiki.liftweb.net/index.php/Main_Page' target='_blank'&gt;Lift Wiki&lt;/a&gt; and a subscription to the &lt;a href='http://groups.google.com/group/liftweb' target='_blank'&gt;Lift newsgroup&lt;/a&gt; is also recommended.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-2888655601638932111?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/2888655601638932111/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=2888655601638932111' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/2888655601638932111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/2888655601638932111'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/08/lift-scala-introduction.html' title='Lift + Scala, Introduction'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-1730149729348108806</id><published>2010-06-28T02:14:00.001+02:00</published><updated>2010-06-29T22:29:52.899+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Update with caution - Firefox 3.6.6</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;The recent update to Firefox 3.6.6 seems to cause more problems than usual.&lt;br/&gt;&lt;br/&gt;Over here, a Mac was the first to update - and Firefox did not re-start.  Having discovered the &lt;i&gt;safe-mode&lt;/i&gt; option &lt;a href='http://tuxpool.blogspot.com/2010/06/firefox-ausfall-der-rechten-maustaste.html' target='_blank'&gt;recently&lt;/a&gt;, I used it on the Mac:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;/Applications/Firefox.app/Contents/MacOS/firefox-bin -safe-mode&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;After disabling all add-ons, Firefox 3.6.6 did start normally. &lt;br/&gt;&lt;br/&gt;On my Ubuntu machine, Firefox is still on version 3.6.3.   So I decided to test FF 3.6.6 before the Ubuntu updater pushes the update.  I downloaded the Linux version of 3.6.6 from &lt;a href='http://www.mozilla.com/' target='_blank'&gt;Mozilla&lt;/a&gt; and installed it in a separate directory.  &lt;br/&gt;&lt;br/&gt;Multiple versions of Firefox can coexist on the same machine, but only one can run at any given time.  I.e. you have to close ALL Firefox windows of one version before starting the other.&lt;br/&gt;&lt;br/&gt;Strangely enough, the new version worked even with the add-ons that crashed Firefox on the Mac.  But there were other issues:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;no graphics on Google Analytics&lt;/li&gt;&lt;li&gt;no address resolution of a web server on the LAN (worked on FF 3.6.3, might be a 64 bit issue - ping is ok)&lt;/li&gt;&lt;/ul&gt;I think, I'll skip this one.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;If the new versions has already been installed...&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;If you hover your mouse over the appropriate download button on the Mozillas website, you see a link like this one (perhaps with different o/s and language settings) in the status bar:&lt;br/&gt;&lt;br/&gt;&lt;font face='monospace'&gt;http://download.mozilla.org/?product=firefox-3.6.6&amp;amp;os=osx&amp;amp;lang=de&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;You can copy the link, modify the version number to get the older Firefox version.&lt;br/&gt;&lt;br/&gt;&lt;i&gt;[Update, June 29th]&lt;/i&gt;&lt;br/&gt;Firefox 3.6.6 (32 bit and 64 bit) from the Ubuntu repositories run without problems.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-1730149729348108806?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/1730149729348108806/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=1730149729348108806' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1730149729348108806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1730149729348108806'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/06/update-with-caution-firefox-366.html' title='Update with caution - Firefox 3.6.6'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6805532165829011241</id><published>2010-06-26T12:35:00.001+02:00</published><updated>2010-06-28T00:53:51.610+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='UMTS'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Integrating a re-branded Huawai UMTS modem into Ubuntu 10.04</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;The Huawai E160 is a popular UMTS stick and works with Ubuntu Lucid Lynx out-of-the-box. &lt;br/&gt;&lt;br/&gt;It is also commonly used by European phone companies in their mobile internet starter packs.  Unfortunately these sticks are usually sim-locked to the phone company and some identify themselves with a USB id unknown to current Ubuntu setup.&lt;br/&gt;&lt;br/&gt;When you plug the stick into the computer, all you see is a small flash drive icon containing the Windows and sometimes Macintosh drivers.  On these systems the drivers switches the stick from mass storage device mode into modem mode after the initial phase.&lt;br/&gt;&lt;br/&gt;The Linux utility for this task is called &lt;font face='Courier New'&gt;modem-modeswitch&lt;/font&gt;, and can be found in &lt;font face='Courier New'&gt;/lib/udev&lt;/font&gt;.  The actual task is to automate the execution of this utility when the UMTS stick is plugged in.&lt;br/&gt;&lt;br/&gt;The UMTS stick in this example is/was sold by the Belgian phone company Mobistar.  When you query the USB IDs:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;sudo lsusb&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;it is identified as&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;12d1:1446 Huawei Technologies Co., Ltd. &lt;br/&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;The two numbers at the beginning of the line are the vendor ID and product ID of the stick in the current mode.&lt;br/&gt;&lt;br/&gt;To check if the modem switch works as expected, call the utility manually:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;sudo /lib/udev/modem-modeswitch -v 0x12d1 -p 0x1446 -t option-zerocd&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Wait a few seconds and check the USB IDs again.  The entry should now read:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem&lt;br/&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;If nothing happens, David Santinoli &lt;a href='http://www.santinoli.com/open/e1692-howto.html' target='_blank'&gt;suggests&lt;/a&gt; in a related document to unmount the device containing the drivers before attempting the switch.&lt;br/&gt;&lt;br/&gt;You can automate the process by creating the file&lt;font face='Courier New'&gt; 62-huawai.rules&lt;/font&gt; in &lt;font face='Courier New'&gt;/lib/udev/rules.d&lt;/font&gt;:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1446", RUN+="modem-modeswitch -v 0x%s{idVendor} -p 0x%s{idProduct} -t option-zerocd"&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;(The file name is arbitrary, as long as it starts with “62-” and ends with “.rules”.) The rule itself is based on similar entries in &lt;font face='Courier New'&gt;61-option-modem-modeswitch.rules&lt;/font&gt;.&lt;br/&gt;&lt;br/&gt;Next time you boot your computer, the rule becomes active, and the modem should be recognized automatically.&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6805532165829011241?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6805532165829011241/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6805532165829011241' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6805532165829011241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6805532165829011241'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/06/integrating-re-branded-huawai-umts.html' title='Integrating a re-branded Huawai UMTS modem into Ubuntu 10.04'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-3146680796564596025</id><published>2010-06-14T12:16:00.001+02:00</published><updated>2010-06-14T12:23:28.016+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox - Ausfall der rechten Maustaste</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;In den letzten Wochen ist es bei mir häufiger vorgekommen, dass Firefox 3.5 (unter Ubuntu 10.04) nicht mehr auf die rechte Maustaste reagierte. Auf dem Desktop und in den übrigen Programmen funktionierte sie weiterhin, sodass ein Problem mit der Maus ausgeschlossen werden konnte.&lt;br/&gt;&lt;br/&gt;Der eigentliche Grund des Problems ist weiterhin unklar. Mit dem folgenden Trick kann man Firefox jedoch in den Normalzustand zurücksetzen:&lt;br/&gt;&lt;br/&gt;Hierzu beendet man Firefox vollständig und ruft es von der Kommandozeile mit&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;firefox -safe-mode&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;auf. Daraufhin erscheint der folgende Bildschirm:&lt;br/&gt;&lt;br/&gt;&lt;img title='Safe Mode Dialog' alt='' src='http://lh6.ggpht.com/_wCX5P_aGQzo/TBYBcvUxbjI/AAAAAAAAAHE/aljSsHAd4P4/%5BUNSET%5D.png' style='float: none;'/&gt;&lt;br/&gt;&lt;br/&gt;Im Safe-Mode startet Firefox - ähnlich wie der Safe-Mode bei Windows - ohne Erweiterungen.&lt;br/&gt;&lt;br/&gt;Wie man sieht kann man fast alles zurücksetzen, was man in den letzten Jahren in mühsamer Kleinarbeit zusammengetragen hat.&lt;br/&gt;&lt;br/&gt;"Reset toolbars and controls" scheint die Option mit dem geringsten "Lösch-Potenzial" zu sein, und in meinem Fall reichte sie auch aus. Nach "Make Changes and Restart" reagierte Firefox wieder auf die rechte Maustaste.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-3146680796564596025?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/3146680796564596025/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=3146680796564596025' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/3146680796564596025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/3146680796564596025'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/06/firefox-ausfall-der-rechten-maustaste.html' title='Firefox - Ausfall der rechten Maustaste'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_wCX5P_aGQzo/TBYBcvUxbjI/AAAAAAAAAHE/aljSsHAd4P4/s72-c/%5BUNSET%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-8313334141532846744</id><published>2010-05-25T12:26:00.001+02:00</published><updated>2010-05-26T01:24:41.496+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedia'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Touch Me, Tux - die Zweite</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img height='146' width='217' src='http://lh3.ggpht.com/_wCX5P_aGQzo/S_xXVzpzN_I/AAAAAAAAAHA/pO1csTCR5s4/%5BUNSET%5D.jpg?imgmax=800' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;Im Zuge der in einigen Tagen beginnenden &lt;a target='_blank' href='http://de.wikipedia.org/wiki/Fu%C3%9Fball-Weltmeisterschaft_2010'&gt;Fußball-WM 2010&lt;/a&gt; verkaufte &lt;a target='_blank' href='http://www.aldi-sued.de'&gt;Aldi-Süd&lt;/a&gt; letzte Wochen den „TEVION® Tragbarer 11 cm/4,3'' Touch Multimediaplayer“ (MD 82700) mit eingebautem DVB-T-Empfänger. So können sich die Fußballfans per „&lt;a target='_blank' href='http://www.ueberalltv.de/'&gt;Überall-Fernsehen&lt;/a&gt;“ auf dem Laufenden halten - wenigstens „überall“ dort, wo es empfangbar ist. &lt;br/&gt;&lt;br/&gt;Im Lieferumfang befinden sich neben dem Netzteil, ein USB-Kabel, ein Ohrhörer und eine kleine DVB-T-Magnetfußantenne.&lt;br/&gt;&lt;br/&gt;Daneben gibt der Player Videos, Musik und Fotos wieder. Und auch Text kann man sich anzeigen lassen; natürlich kein Vergleich zu Kindle und Co – weshalb das Feature wahrscheinlich nicht einmal beworben wurde.&lt;br/&gt;&lt;br/&gt;Das Gerät meldet sich unter Linux als USB-Massenspeicher (MD 82700) an. Je nachdem, ob eine zusätzlich Micro-SD Karte eingelegt ist, erscheinen ein (intern: 4 GB) bzw. zwei USB-Laufwerke. Bilder und Video lassen sich auch mit gängigen Werkzeugen unter Linux so codieren, dass sie vom Player wiedergegeben werden.&lt;br/&gt;&lt;br/&gt;Als Wiedergabeformate werden JPEG, MP3, MPEG4, RM, RMVB, Divx und Xvid beworben. Zu RM und RMVB kann ich nichts sagen, da ich unter Linux keine Encoder dafür laufen habe. &lt;br/&gt;&lt;br/&gt;Die Angabe von MPEG4 ist zwar nicht falsch, aber vielleicht etwas missverständlich. MPEG4 ist ähnlich wie AVI ein Container-Format. Es sagt nichts über die darin verwendeten Codecs aus. &lt;br/&gt;&lt;br/&gt;Um normale Dateien zu  komprimieren gibt unterschiedliche Algorithmen (ZIP, RAR, LZH, usw.). Ein sehr bekannt Algorithmus für Audio ist MP3, aber er ist halt nicht der einzige. Im Open-Souce-Bereich ist auch Ogg Vorbis verbreitet, Mac-User kennen AAC usw. Und auch bei den Videocodecs sind mittlerweile nicht nur Eingeweihten mehrere Codecs bekannt: DivX (und sein Open-Source-Pendant Xvid) sowie MPEG2 von den DVDs.&lt;br/&gt;&lt;br/&gt;Häufig genutzte Quellen für MP4-Dateien sind heutzutage Video-Portale wie Youtube und Vimeo. Die dort erhältlichen Videos werden mit dem sehr effektiven Codec H.264 für Video und häufig mit AAC für Audio komprimiert. Diese beiden Codecs versteht das Gerät allerdings &lt;b&gt;nicht&lt;/b&gt;. Solche Dateien können nicht direkt wiedergegeben werden und müssen auf dem Computer umcodiert werden. &lt;br/&gt;&lt;br/&gt;Wenn man einmal vom DVB-T absieht, so erinnert der Player sehr an das Technaxx-Gerät, mit dem dieses Blog vor über einem Jahr &lt;a target='_blank' href='http://tuxpool.blogspot.com/2009_02_01_archive.html'&gt;begann&lt;/a&gt;. Die verfügbaren Formate, Aufbau und Inhalt der Menüs, exotische Funktionen wie Liedtext-Wiedergabe mit .lirc-Dateien, ähneln sehr der Software im Technaxx-Player. Selbst der vor einem Jahr genannte Konvertier-Befehl kann so (und in leicht abgewandelter Form) verwendet werden.&lt;br/&gt;&lt;br/&gt;Von der Auflösung her unterscheiden sich der Technaxx- (320 x 240) und der Medion-Player (480 x 272) nicht sonderlich. Die höhere Pixelzahl ist fast ausschließlich dem Wechsel vom 4:3- zum 16:9-Format zu verdanken; aber natürlich ist der Bildschirm jetzt deutlich größer.&lt;br/&gt;&lt;br/&gt;Der Wiedergabe-Chip ist leistungsstärker geworden, so dass viele Einschränkungen weggefallen sind: Es werden höhere Bildfrequenzen (Technaxx: max. 20 Bilder pro Sekunde) und höhere Bitraten für Video und Audio wiedergegeben. Auch &lt;a target='_blank' href='http://de.wikipedia.org/wiki/B-Frame'&gt;B-Frames&lt;/a&gt; werden nun unterstützt, die eine höhere Komprimierung erlauben.&lt;br/&gt;&lt;br/&gt;Die alten für den Technaxx kodierten Dateien lassen sich daher weiter abspielen. Und da diverse Einschränkungen wegfallen, lassen sich mit Avidemux erstellte Dateien nun direkt verwenden.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Erfolgreich getestete Formate:&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;Container-Formate: &lt;i&gt;AVI, MP4&lt;/i&gt;&lt;br/&gt;Videocodecs: &lt;i&gt;DivX, Xvid&lt;/i&gt;&lt;br/&gt;Audiocodecs: &lt;i&gt;MP2, MP3, AC3&lt;/i&gt;&lt;br/&gt;Videofrequenz (Bilder/Sekunde): &lt;i&gt;20, 25&lt;/i&gt;&lt;br/&gt;Bildformate: &lt;i&gt;JPEG, BMP&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;Hier ein Konvertierbefehl im Bausatz&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Dateinamen, Ausgabeformat: AVI&lt;/b&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;mencoder -noodml QUELLDATEI -of avi -o ZIELDATEI&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Videocodec XVID, Bitrate&lt;/b&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;-ovc xvid -xvidencopts bitrate=VIDEOBITRATE:quant_type=h263:me_quality=6&lt;/font&gt;&lt;br/&gt;VIDEOBITRATE: je nach Qualität, typische Werte 800 bis 1000&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Audiocodec&lt;/b&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;-oac AUDIOCODEC&lt;/font&gt;&lt;br/&gt;AUDIOCODEC: mp3lame, mp2, ac3&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Beispiel:&lt;/b&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;mencoder -noodml ein.mp4 -of avi -o aus.avi -ovc xvid -xvidencopts bitrate=1000:quant_type=h263:me_quality=6 -oac mp3lame&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-8313334141532846744?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/8313334141532846744/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=8313334141532846744' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/8313334141532846744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/8313334141532846744'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/05/touch-me-tux-die-zweite.html' title='Touch Me, Tux - die Zweite'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_wCX5P_aGQzo/S_xXVzpzN_I/AAAAAAAAAHA/pO1csTCR5s4/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-7533713527210559617</id><published>2010-05-19T12:16:00.003+02:00</published><updated>2010-05-19T19:27:31.354+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>The wow factor book</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img height='203' width='171' src='http://lh5.ggpht.com/_wCX5P_aGQzo/S_Qd54T9bNI/AAAAAAAAAG4/Zq6VkExTc3I/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;Yesterday, a young man in Australia became victim of his own success.&lt;br/&gt;&lt;br/&gt;Andrew Price of &lt;a target='_blank' href='http://www.blenderguru.com/'&gt;blenderguru.com&lt;/a&gt; fame had demonstrated in the past that he can produce good and easy to understand blender text and video &lt;a target='_blank' href='http://www.blenderguru.com/category/tutorials/'&gt;tutorials&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;He peaked the community's interest when he announced an e-book -  “&lt;a target='_blank' href='http://www.wowfactorbook.com/'&gt;the wow-factor&lt;/a&gt;” - about the compositor of Blender 2.5, something that hasn't got a lot of coverage so far.&lt;br/&gt;&lt;br/&gt;During the last weeks he released a sample chapter of his book and produced a promotional video worthy of a shopping channel.  Apart from detailing the content of the e-book, it listed all the bonuses which come with it, and culminated in the display of the e-book itself and all the bonuses as CDs and booklets which, of course, all exist - in good Blender fashion - only virtually.&lt;br/&gt;&lt;img height='106' width='246' src='http://lh3.ggpht.com/_wCX5P_aGQzo/S_QelTCNWHI/AAAAAAAAAG8/XEBaBWhUdhg/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/&gt;&lt;br/&gt;One day before the release he offered a chance to win a free copy of the e-book.  It got 700+ entries which should have been a warning about what was going to hit him.&lt;br/&gt;&lt;br/&gt;With only a few hours to go, his website become slower and slower, and when the first message "error 500" appeared, it was clear that the demand crashed his server.  The move to a more powerful home took another 3+ hours which deprived a few of his costumers of the chance to be among the first hundred buyers eligible for “the vault” - the collection of source material which made up the book. &lt;br/&gt;&lt;br/&gt;Before going to bed myself, I skimmed the e-book.  It delivers what was promised: an overview of glares, blurs and optical effects - many of which most of us have never heard of - and how to create them in Blender.  &lt;br/&gt;&lt;br/&gt;The bonuses provide additional information which are not available in this completeness at this time anywhere else.  The “node encyclopaedia”  for example will save you hours of gathering this information and will hopefully become part of the regular Blender documentation once the final 2.5 version is released, which can still take some time.&lt;br/&gt;&lt;br/&gt;The reason that the compositor is not the most prominent feature in most other Blender tutorials is, that it is one of the last steps of creating something in Blender used to polish your render.  This means that you must already have something to work with – a fact that has been taken care of by two video tutorials showing how to build a scene in which to use the effects.  Unfortunately they are only available in a time limited fashion.&lt;br/&gt;&lt;br/&gt;All in all it seems to provide a lot of useful information which I can hopefully learn during the coming weeks while reading, watching and listening to the provided material.&lt;br/&gt;&lt;br/&gt;I wonder if there were free bonus steak knives mentioned in the commercial... .blend files would suffice. :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-7533713527210559617?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/7533713527210559617/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=7533713527210559617' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7533713527210559617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7533713527210559617'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/05/wow-factor-book.html' title='The wow factor book'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_wCX5P_aGQzo/S_Qd54T9bNI/AAAAAAAAAG4/Zq6VkExTc3I/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-1764517065955911253</id><published>2010-05-07T01:48:00.001+02:00</published><updated>2010-05-07T01:48:41.106+02:00</updated><title type='text'>dbus tutorial - part 3</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;The last part started with the basic structure of the dbus part of the CD file listing utility and then showed the particular problems with the HAL implementation.&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceKit.Disks &lt;/font&gt;has to overcome similar problems, but due to the different concepts behind DeviceKit they have to be solved slightly differently.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;DeviceKit.Disks&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;Like HAL, DeviceKit.Disks is another daemon handling devices and is offering similar services under different names. HAL is a jack of all trades, providing information about nearly everything in your system. This lead to its downfall, because the code base became huge and unmaintainable.  DeviceKit on the other hand is split into individual more specialised daemons.  &lt;font face='Courier New'&gt;DeviceKit.&lt;b&gt;Disks&lt;/b&gt;&lt;/font&gt; is strictly focussed on disks and drives.&lt;br/&gt;&lt;br/&gt;Differences to HAL from a programmers point of view:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;As already seen: A different function is used to install the callbacks.&lt;/li&gt;&lt;li&gt;The string given to the callback function (e.g. &lt;font face='Courier New'&gt;/org/freedesktop/DeviceKit/Disks/devices/sr0&lt;/font&gt;)  is the name of a Devkit device. It points to a hardware &lt;i&gt;device&lt;/i&gt; (e.g. the CDROM drive) not a &lt;i&gt;volume&lt;/i&gt; (the inserted medium).  And because the string already points to the hardware device we don't have to check for any parent object.&lt;/li&gt;&lt;li&gt;Being a fixed drive, we also don't need the &lt;font face='Courier New'&gt;device_added_callback&lt;/font&gt; or &lt;font face='Courier New'&gt;device_removed_callback&lt;/font&gt;, because the physical CDROM device is not likely to be removed during the lifetime of the program and only changing the medium does not trigger &lt;i&gt;these&lt;/i&gt; callbacks. (Note: A USB stick where the physical device itself is being unplugged does trigger these callbacks.).&lt;/li&gt;&lt;li&gt;Which leaves the &lt;font face='Courier New'&gt;device_changed_callback&lt;/font&gt;. However, unlike HAL, there is no indication which property has changed when it is being triggered. We have to track the appropriate properties ourselves.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Initialization&lt;/b&gt;&lt;br/&gt;(&lt;a target='_blank' href='http://tuxpool.blogspot.com/2010/04/dbus-tutorial-part-2.html'&gt;See part 2&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;import gobject&lt;br/&gt;import dbus&lt;br/&gt;...&lt;br/&gt;gobject.threads_init()&lt;br/&gt;dbus.glib.threads_init()&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Adding the callback&lt;/b&gt;&lt;br/&gt;(&lt;a target='_blank' href='http://tuxpool.blogspot.com/2010/04/dbus-tutorial-part-1.html'&gt;See part 1&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;bus = dbus.SystemBus()&lt;br/&gt;devkit_object = bus.get_object("org.freedesktop.DeviceKit.Disks",&lt;br/&gt;    "/org/freedesktop/DeviceKit/Disks")&lt;br/&gt;devkit_disks = dbus.Interface(devkit_object, 'org.freedesktop.DeviceKit.Disks')&lt;br/&gt;devkit_disks.connect_to_signal('DeviceChanged', device_changed_callback)&lt;br/&gt;&lt;br/&gt;...&lt;br/&gt;&lt;br/&gt;def device_changed_callback(device):&lt;br/&gt;    print 'Device %s was changed' % (device)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Device properties in Devicekit.Disks&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;DeviceKit.Disks devices implement an interface named &lt;font face='Courier New'&gt;Properties&lt;/font&gt; which gives access to the device properties:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;device_object = bus.get_object("org.freedesktop.DeviceKit.Disks", udi)&lt;br/&gt;device_prop = dbus.Interface(device_object, "org.freedesktop.DBus.Properties")&lt;br/&gt;property = device_prop.Get("org.freedesktop.DeviceKit.Disks.Device","name_of_property")&lt;br/&gt;&lt;br/&gt;# or&lt;br/&gt;&lt;br/&gt;all_properties = device_prop.GetAll("org.freedesktop.DeviceKit.Disks.Device")&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Interesting properties are:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;font face='Courier New'&gt;DriveMediaCompatibility&lt;/font&gt;&lt;br/&gt;description: hardware compatibility&lt;br/&gt;typical values: &lt;font face='Courier New'&gt;optical_cd, optical_cd_r, optical_cd_rw, optical_dvd, optical_dvd_r,  optical_dvd_ram&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt;&lt;br/&gt;typical values: &lt;font face='Comic Sans MS'&gt;0/1&lt;/font&gt;&lt;br/&gt;0: disk tray empty&lt;br/&gt;1: optical media has been found&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt;&lt;br/&gt;typical values: &lt;font face='Comic Sans MS'&gt;0/1&lt;/font&gt;&lt;br/&gt;0: nothing mounted yet&lt;br/&gt;1: valid DeviceMountPaths&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;IdLabel&lt;/font&gt;&lt;br/&gt;description: label of CD/DVD&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;DeviceMountPaths&lt;/font&gt;&lt;br/&gt;descirption: mount point, if a CD/DVD has been mounted&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt;&lt;br/&gt;typical values:&lt;font face='Comic Sans MS'&gt; 0/1&lt;/font&gt;&lt;br/&gt;0: media in the drive is not blank&lt;br/&gt;1: media in the drive is blank&lt;/li&gt;&lt;li&gt;&lt;font face='Comic Sans MS'&gt;DeviceIsRemovable&lt;/font&gt;&lt;br/&gt;typical values: &lt;font face='Comic Sans MS'&gt;0/1&lt;/font&gt;&lt;br/&gt;1: device can contain removable media (-&amp;gt; Eject should work)&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;See also: &lt;a target='_blank' href='http://hal.freedesktop.org/docs/DeviceKit/'&gt;http://hal.freedesktop.org/docs/DeviceKit/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;You can get a quick overview with human readable property names with&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;devkit-disks --dump | more&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;How to filter out events that are not CD related&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;The most promising way is to check &lt;font face='Comic Sans MS'&gt;DriveMediaCompatibility&lt;/font&gt; for the value &lt;font face='Comic Sans MS'&gt;optical_cd&lt;/font&gt; or &lt;font face='Comic Sans MS'&gt;optical_dvd&lt;/font&gt;.&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;device_object = bus.get_object("org.freedesktop.DeviceKit.Disks", udi)&lt;br/&gt;device_prop = dbus.Interface(device_object, "org.freedesktop.DBus.Properties")&lt;br/&gt;md = device_prop.Get("org.freedesktop.DeviceKit.Disks.Device","DriveMediaCompatibility")&lt;br/&gt;print "is CD-ROM:", (u"optical_cd" in md) or (u"optical_dvd" in md)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;If you observe the events (using the dbus-monitor) when inserting or ejecting a CD, the following patterns emerge:&lt;br/&gt;(I haven't found any authoritative documentation yet, but the steps seem logical):&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;When the CDROM tray is empty&lt;/b&gt;:&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 0&lt;/li&gt;&lt;li&gt;&lt;b&gt;Blank medium inserted&lt;/b&gt;:&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 1&lt;br/&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt; == 1&lt;/li&gt;&lt;li&gt;&lt;b&gt;After ejecting the blank medium:&lt;/b&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 0&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Insert a medium containing data&lt;/b&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;step 1 (medium gets recognized):&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 1&lt;br/&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt; == 0&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; == 0&lt;/li&gt;&lt;li&gt;step 2 (medium gets auto mounted):&lt;br/&gt; &lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 1&lt;br/&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt; == 0&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; == 1&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;eject medium:&lt;br/&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;step 1 (auto umount)&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 1&lt;br/&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt; == 0&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; == 0&lt;/li&gt;&lt;li&gt;step 2 (eject)&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; == 0&lt;br/&gt;&lt;font face='Courier New'&gt;OpticalDiscIsBlank&lt;/font&gt; == 0&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; == 0&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;If &lt;font face='Courier New'&gt;DeviceIsOpticalDisc&lt;/font&gt; is being set to 1, the property &lt;font face='Courier New'&gt;IdLabel&lt;/font&gt; becomes valid.&lt;/li&gt;&lt;li&gt;If &lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; is being set to 1, the property &lt;font face='Courier New'&gt;DeviceMountPaths&lt;/font&gt; becomes valid.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;When to read the file list&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;As DeviceKit.Disks does not provide the information which property was modified, we have to track the state of &lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; ourselves and read the files below the mount point(s) when &lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt; changes from 0 to 1.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Eject via software&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;This function is located in the interface&lt;font face='Courier New'&gt; org.freedesktop.DeviceKit.Disks.Device&lt;/font&gt;. Note that a volume must be unmounted first before it can be ejected (see property &lt;font face='Courier New'&gt;DeviceIsMounted&lt;/font&gt;).&lt;br/&gt;&lt;font face='Courier New'&gt;&lt;br/&gt;system_bus = dbus.SystemBus()&lt;br/&gt;device_object = system_bus.get_object("org.freedesktop.DeviceKit.Disks", udi)&lt;br/&gt;&lt;br/&gt;# get properties&lt;br/&gt;device_prop = dbus.Interface(device_object, "org.freedesktop.DBus.Properties")&lt;br/&gt;all_properties = device_prop.GetAll("org.freedesktop.DeviceKit.Disks.Device")&lt;br/&gt;&lt;br/&gt;# call unmount/eject depending on the device state&lt;br/&gt;disk_dev_func = dbus.Interface(device_object, "org.freedesktop.DeviceKit.Disks.Device")&lt;br/&gt;if all_properties['DeviceIsMounted'] == 1:&lt;br/&gt;    disk_dev_func.FilesystemUnmount('')&lt;br/&gt;if all_properties['DeviceIsOpticalDisc'] == 1:&lt;br/&gt;    disk_dev_func.DriveEject('')&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;With this, we have all the building blocks for DeviceKit.disks implementation of the CD file listing utility&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-1764517065955911253?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/1764517065955911253/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=1764517065955911253' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1764517065955911253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1764517065955911253'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/05/dbus-tutorial-part-3_07.html' title='dbus tutorial - part 3'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-495312844275284592</id><published>2010-04-28T00:57:00.000+02:00</published><updated>2010-04-29T00:02:54.663+02:00</updated><title type='text'>dbus tutorial - part 2</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;b&gt;Implementation overview&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;The &lt;a href='http://tuxpool.blogspot.com/2010/04/dbus-tutorial-part-1.html'&gt;first part&lt;/a&gt; introduced the dbus components and how to access them using Python.&lt;br/&gt;&lt;br/&gt;The goal is to write a program that lists and stores the names of the files on a CD after it has been inserted.  The basic steps are:&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Initialize dbus&lt;/li&gt;&lt;li&gt;Wait for the notification when a CD is inserted into the drive.&lt;/li&gt;&lt;li&gt;Wait for the notification when the volume is mounted by the (Gnome) automounter&lt;/li&gt;&lt;li&gt;Read the file list below that mount point and store the info.&lt;/li&gt;&lt;li&gt;Then perhaps eject the CD.&lt;/li&gt;&lt;li&gt;Go back to step 2&lt;/li&gt;&lt;/ol&gt;&lt;br/&gt;&lt;b&gt;Initialize dbus: Starting dbus threads&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;In order to get the dbus communication running in the python application, the following threads have to be started before you connect to any bus:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;import gobject&lt;br/&gt;import dbus&lt;br/&gt;import dbus.glib&lt;br/&gt;...&lt;br/&gt;gobject.threads_init()&lt;br/&gt;dbus.glib.threads_init() &lt;/font&gt;&lt;br/&gt;&lt;br/&gt;This piece of code uses Python threads in the background.  &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;HAL implementation specifics&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;In the first part we've seen how callbacks are hooked into the system:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;bus = dbus.SystemBus()&lt;br/&gt;bus.add_signal_receiver(device_added_callback,&lt;br/&gt;                                 "DeviceAdded",&lt;br/&gt;                                 "org.freedesktop.Hal.Manager",&lt;br/&gt;                                 "org.freedesktop.Hal",&lt;br/&gt;                                 "/org/freedesktop/Hal/Manager")&lt;br/&gt;bus.add_signal_receiver(device_removed_callback,&lt;br/&gt;                                 "DeviceRemoved",&lt;br/&gt;                                 "org.freedesktop.Hal.Manager",&lt;br/&gt;                                 "org.freedesktop.Hal",&lt;br/&gt;                                 "/org/freedesktop/Hal/Manager")&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;When a CD is inserted &lt;font face='Courier New'&gt;DeviceAdded&lt;/font&gt; receives a string like this:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;/org/freedesktop/Hal/devices/volume_label_backupcd1________&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;When the CD is ejected, &lt;font face='Courier New'&gt;DeviceRemoved&lt;/font&gt; is executed, receiving the same information.  I'll refer to this string as &lt;font face='Courier New'&gt;udi&lt;/font&gt; in the following code.&lt;br/&gt;&lt;br/&gt;This string refers to an HAL object, and describes a volume i.e. the medium you inserted, not the actual hardware (i.e. the CDROM drive).  To get more information about this volume you have to get the HAL object via &lt;font face='Courier New'&gt;bus.get_object&lt;/font&gt; (as described before):&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;d_object = bus.get_object('org.freedesktop.Hal',udi)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Objects starting with&lt;font face='Courier New'&gt; /org/freedesktop/Hal/devices/...&lt;/font&gt; implement the interface &lt;font face='Courier New'&gt;org.freedesktop.Hal.Device&lt;/font&gt;, which in turn exposes (among others) the function &lt;font face='Courier New'&gt;GetAllProperties&lt;/font&gt; which returns a dictionary that contains further useful information:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;d_interface = dbus.Interface(d_object,'org.freedesktop.Hal.Device')&lt;br/&gt;properties = d_interface.GetAllProperties()&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Interesting keys in this dictionary are:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;font face='Courier New'&gt;volume.label&lt;/font&gt;&lt;br/&gt;description: CD label&lt;br/&gt;typical value:&lt;font face='Courier New'&gt; empty, backup123&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;volume.disc.has_data&lt;/font&gt;&lt;br/&gt;description: data disk&lt;br/&gt;typical value: 0, 1&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;volume.disc.is_blank&lt;/font&gt;&lt;br/&gt;description: blank media&lt;br/&gt;typical value: 0, 1&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;volume.mount_point&lt;/font&gt;&lt;br/&gt;description: CD mount point &lt;br/&gt;typical value: /media/backup123&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;block.device&lt;/font&gt;&lt;br/&gt;description: linux device descriptor &lt;br/&gt;typical value: /dev/sr0&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;storage.drive_type&lt;/font&gt;&lt;br/&gt;typical value: cdrom&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;See also &lt;a target='_blank' href='http://www.marcuscom.com/hal-spec/hal-spec.html'&gt;HAL specification &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;To get a quick overview, type&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;lshal | more&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;in a shell.  (You will need the &lt;font face='Courier New'&gt;more&lt;/font&gt; command.)&lt;br/&gt;&lt;br/&gt;The interface &lt;font face='Courier New'&gt;org.freedesktop.Hal.Device &lt;/font&gt;(implemented by all &lt;font face='Courier New'&gt;.../Hal/devices/&lt;/font&gt; ) also contains the signal &lt;font face='Courier New'&gt;PropertyModified&lt;/font&gt; - which will be fired when properties change (in our example: the info &lt;font face='Courier New'&gt;volume.mount_point &lt;/font&gt;is empty when the device is added.  It becomes available later when the auto-mounter of the desktop framework has mounted the device.).  You can add a callback for this signal:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;def device_added_hook(udi):&lt;br/&gt;    ....&lt;br/&gt;    bus.add_signal_receiver(property_modified_callback,&lt;br/&gt;           "PropertyModified",&lt;br/&gt;           "org.freedesktop.Hal.Device", &lt;br/&gt;           "org.freedesktop.Hal",&lt;br/&gt;           udi)&lt;br/&gt;&lt;br/&gt;def property_modified_callback(numupdates,updates):&lt;br/&gt;    ...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;numupdates&lt;/font&gt; are the number of entries in a list of updates.  An "update" is a tuple with the following signature: (key_name, was_added, was_removed)&lt;br/&gt;&lt;br/&gt;If a CD/DVD was mounted, the list of updates contains (among others) the following tuples:&lt;br/&gt;&lt;font face='Courier New'&gt;&lt;br/&gt;('volume.mount_point', False, False)&lt;br/&gt;('volume.is_mounted', False, False)&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;This means that the property was neither added (1st &lt;font face='Courier New'&gt;False&lt;/font&gt;) nor removed (2nd &lt;font face='Courier New'&gt;False&lt;/font&gt;), it was merely modified.  We don't get any information about the new value of the property and more importantly we don't get any information about the object (i.e. the device) that triggered it.&lt;br/&gt;&lt;br/&gt;For this reason the method &lt;font face='Courier New'&gt;add_signal_receiver&lt;/font&gt; can be extended:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;...&lt;br/&gt;    bus.add_signal_receiver(property_modified_callback,&lt;br/&gt;           "PropertyModified",&lt;br/&gt;           "org.freedesktop.Hal.Device", &lt;br/&gt;           "org.freedesktop.Hal",&lt;br/&gt;           udi,&lt;br/&gt;           &lt;b&gt;path_keyword = "sending_device"&lt;/b&gt; )&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;The parameter &lt;font face='Courier New'&gt;path_keyword&lt;/font&gt; defines the name of an additional parameter (in this example &lt;font face='Courier New'&gt;sending_device&lt;/font&gt;) for the &lt;font face='Courier New'&gt;property_modified_callback&lt;/font&gt; which will contain the “path” - or in my parlance “the object” - that triggered the signal.  Now the &lt;font face='Courier New'&gt;property_modified_callback&lt;/font&gt; looks like this:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;def property_modified_callback(numupdates, updates, sending_device = None):&lt;br/&gt;    ...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Apart from &lt;font face='Courier New'&gt;path_keyword&lt;/font&gt;, &lt;font face='Courier New'&gt;add_signal_receiver&lt;/font&gt; can define even more additional parameters for the callback function:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;font face='Courier New'&gt;sender_keyword&lt;/font&gt; - for the connection name (usually in the internal numeric format)&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;destination_keyword&lt;/font&gt; - &lt;font face='Courier New'&gt;None&lt;/font&gt; for broadcasts&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;interface_keyword &lt;/font&gt;- interface name&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;member_keyword&lt;/font&gt; - signal name&lt;/li&gt;&lt;li&gt;&lt;font face='Courier New'&gt;path_keyword &lt;/font&gt;- object name&lt;/li&gt;&lt;/ul&gt;each followed by a string containing the name of the parameter in the callback function.  The variable will contains the appropriate information.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;HAL implementation: Filter out events that are not CD related &lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;DeviceAdded&lt;/font&gt; is called for every new device in the system (network devices, bluetooth devices, etc.), and the &lt;font face='Courier New'&gt;property_modified_callback&lt;/font&gt; is invoked if any property of any device changes.&lt;br/&gt;&lt;br/&gt;In order to filter out the CD related calls, we have to check the properties for suitable keys.&lt;br/&gt;&lt;br/&gt;First, we have to ensure that the object describes a volume.  For this we have to check if the property&lt;font face='Courier New'&gt; block.is_volume&lt;/font&gt; is present, and if so, that it is set to &lt;font face='Courier New'&gt;True&lt;/font&gt;.&lt;br/&gt;The object will then have a property named &lt;font face='Courier New'&gt;info.parent&lt;/font&gt;, pointing back to the physical drive.&lt;br/&gt;&lt;br/&gt;After retrieving the properties of that parent object, we first check &lt;font face='Courier New'&gt;block.is_volume&lt;/font&gt;, which has to be set to &lt;font face='Courier New'&gt;False&lt;/font&gt;, and then obtain the value of &lt;font face='Courier New'&gt;storage.drive_type&lt;/font&gt;, which is set to "&lt;font face='Courier New'&gt;cdrom&lt;/font&gt;", if the device is an optical drive.&lt;br/&gt;&lt;br/&gt;...&lt;br/&gt;&lt;font face='Courier New'&gt;# get object of the device that triggered the property_modified_callback&lt;br/&gt;d_object = self.system_bus.get_object('org.freedesktop.Hal',sending_device)&lt;br/&gt;d_interface = dbus.Interface(d_object,'org.freedesktop.Hal.Device')&lt;br/&gt;&lt;br/&gt;# get their properties&lt;br/&gt;d_properties = d_interface.GetAllProperties()&lt;br/&gt;&lt;br/&gt;if not d_properties.has_key("block.is_volume"): return&lt;br/&gt;if not d_properties["block.is_volume"]: return&lt;br/&gt;&lt;br/&gt;parent_device = d_properties["info.parent"]&lt;br/&gt;p_object = system_bus.get_object('org.freedesktop.Hal',parent_device)&lt;br/&gt;p_interface = dbus.Interface(p_object,'org.freedesktop.Hal.Device')&lt;br/&gt;p_properties = p_interface.GetAllProperties()&lt;br/&gt;if not p_properties["block.is_volume"]:&lt;br/&gt;   if p_properties["storage.drive_type"] == "cdrom":&lt;br/&gt;       # further code here&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Another approach is to get the list of all optical drives when the utility is launched and check the parent udi against this list:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;system_bus = dbus.SystemBus()&lt;br/&gt;hal_object = system_bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')&lt;br/&gt;hal_manager = dbus.Interface(hal_object, 'org.freedesktop.Hal.Manager')&lt;br/&gt;...&lt;br/&gt;installed_optical_drives = hal_manager.FindDeviceStringMatch("storage.drive_type","cdrom")&lt;br/&gt;...&lt;br/&gt;if parent in installed_optical_drives:&lt;br/&gt;   ...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Mount point is empty&lt;/b&gt;&lt;br/&gt;At the time when the device is added &lt;font face='Courier New'&gt;volume.mount_point&lt;/font&gt; is empty.  That's why the signals &lt;font face='Courier New'&gt;DeviceAdded&lt;/font&gt; and &lt;font face='Courier New'&gt;DeviceRemoved&lt;/font&gt; are not important in our application.  You might want to use them anyway to display the state of your drive (e.g. disk inserted or nor) in the GUI.&lt;br/&gt;&lt;br/&gt;The import part is the &lt;font face='Courier New'&gt;property_modified_callback&lt;/font&gt;.  After the checks described above we know the label of the CD and its mount point.  With this information we can obtain a file list and store it in any form we want.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;The next part will show how &lt;font face='Courier New'&gt;DeviceKit.Disks&lt;/font&gt; handles these problems.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-495312844275284592?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/495312844275284592/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=495312844275284592' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/495312844275284592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/495312844275284592'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/04/dbus-tutorial-part-2.html' title='dbus tutorial - part 2'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6766033099207053872</id><published>2010-04-23T01:35:00.004+02:00</published><updated>2010-04-23T02:19:27.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>dbus tutorial - part 1</title><content type='html'>&lt;span style="font-size: large;"&gt;&lt;b&gt;Basic dbus concepts&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is dbus?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;dbus is part of most modern Linux distros.&amp;nbsp; It handles interprocess communication, either between desktop applications or between systems daemons and applications (e.g. a desktop framework like Gnome or KDE, or user applications).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overview&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The goal of this series of postings is the creation of a small desktop example application written in Python which reads the name of the files on a CD or DVD after the media has been inserted, and to store these names together with the CD label in a file.&amp;nbsp; The graphical user interface will be based on wxWidgets.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The first part contains an introduction to the basic dbus components.&lt;br /&gt;The second part discusses the implementation using the Hardware Abstraction Layer (HAL).&lt;br /&gt;The following part shows the differences in implementation between HAL to the DeviceKit.Disks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prerequisites&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Python&lt;/span&gt;: which is part of any current Linux distribution. (I'm using Python 2.6).&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;python-dbus&lt;/span&gt;: the dbus bindings for Python &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;python-wxgtk2.8&lt;/span&gt;: wxWidgets and its Python bindings (for the GUI)&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Useful additions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;python-wxglade&lt;/span&gt;: GUI builder for wxWidgets, creates Python source code (and C source code...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d-feet:&lt;/span&gt; graphical display of dbus components&lt;br /&gt;&lt;br /&gt;&lt;b&gt;dbus components&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In our example dbus is used to catch the notifications sent by the kernel when a CD or DVD has been inserted, as well as the notification when Gnome has mounted this medium. (There were times when you had to do this manually.)&lt;br /&gt;&lt;br /&gt;In some places I will differ from the official dbus designations for these components to make their distinction easier.&amp;nbsp; In some cases different components share the same name.&amp;nbsp; This makes their close relation quite obvious, but it becomes difficult to determine if a given name refers to a connection or an interface, for example. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Buses&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In dbus &amp;#8220;buses&amp;#8221; are at the root of a hierarchy.&amp;nbsp; In normal applications you encounter mostly the following two buses:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bus = dbus.SessionBus()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for communication between desktop applications, and&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bus = dbus.SystemBus()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for communication with system programs and daemons like the NetworkManager, the ModemManager, the Hardware Abstraction Layer daemon (HAL) or DeviceKit, to name but a few.&lt;br /&gt;&lt;br /&gt;When you insert a disc, a notification is routed via HAL or DeviceKit, depending on which daemon is installed.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: Ubuntu Karmic uses HAL and DeviceKit simultaneously.&amp;nbsp; However, the Hardware Abstraction Layer is being phased out from most Linux distributions, and the upcoming version of Ubuntu 10.04 (Lucid Lynx) will drop it completely. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;Connections&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8220;Connections&amp;#8221; are the layer below the buses.&amp;nbsp; You can use a "connection" to &amp;#8220;connect&amp;#8221; to a specific daemon or application.&amp;nbsp; Please note the dotted notation: &lt;br /&gt;The NetworkManager is available via a connection named &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.NetworkManger&lt;/span&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The connection &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal&lt;/span&gt; will connect you to the HAL daemon.&amp;nbsp; &lt;br /&gt;The "disks" part of DeviceKit is available via the connection named &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.DeviceKit.Disks&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Objects&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;These programs (NetworkManager, HAL, DeviceKit.Disks, etc.) will offer their services via one or more "objects".&amp;nbsp; Object names contain slashes and look like file paths, which might be the reason that they are sometimes called "paths".&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Examples: &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/org/freedesktop/Hal/devices&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/org/freedesktop/Hal/Manager&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; /org/freedesktop/Hal/devices/volume_label_backupcd1________&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/org/freedesktop/DeviceKit/Disks/devices/sr0 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Interfaces&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Objects export methods and and signals grouped into one or more "interfaces".&amp;nbsp; The names of these interfaces again contain dots, e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal.Manager&lt;/span&gt; or &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.DeviceKit.Disks.Device&lt;/span&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Methods&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Methods are functions you can invoke.&amp;nbsp; One method of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal.Manager&lt;/span&gt; interface for example is &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceExists&lt;/span&gt;.&amp;nbsp; The interface &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.DeviceKit.Disks&lt;/span&gt; implements e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EnumerateDevices&lt;/span&gt;, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Signals&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;An interface may also export "signals".&amp;nbsp; Signals of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal.Manager&lt;/span&gt; interface that we are going to use are &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceAdded&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceRemoved&lt;/span&gt;, which are triggered&amp;nbsp; when you put a new CD into the drive or eject it, but also if any other device is added (an USB stick, a new network interface, etc.), as well as the signal &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;PropertiesModified&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Introspect&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;One interface that is implemented by all objects is &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.DBus.Introspectable&lt;/span&gt; which offers one method: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Introspect()&lt;/span&gt;.&amp;nbsp; &lt;br /&gt;This function returns a description of the object's interfaces, i.e. what methods and signals are available and what parameters they use.&amp;nbsp; The above mentioned utility d-feet uses this method to display the information in a nice graphical way.&amp;nbsp; (Note: In d-feet a "Connection" is called "Bus Name").&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you want to see the dbus messaging at work (for the SystemBus) open a shell and start:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dbus-monitor --system&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;bus&lt;/b&gt;: top level (SessionBus or SystemBus)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;connection&lt;/b&gt;: from the bus to a daemon; names with dots&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;object&lt;/b&gt;: logical part within that daemon; names with slashes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;interface&lt;/b&gt;: one or more within an object (same interface on different objects means same API (methods and signals)); names with dots&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;methods&lt;/b&gt; and &lt;b&gt;signals&lt;/b&gt; (none or more within an object)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Examples&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to call a method (HAL)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to call a method like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceExists&lt;/span&gt;, you have to know, that this particular function is&lt;br /&gt;&lt;ol&gt;&lt;li&gt;part of the interface &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal.Manager&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;that this interface is implemented by the object named&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; /org/freedesktop/Hal/Manager&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;which in turn can be reached via the connection &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.freedesktop.Hal&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;on the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SystemBus&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;b&gt;&lt;br /&gt;In Python:&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (4)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus = dbus.SystemBus()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (3 + 2)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;object = bus.get_object("org.freedesktop.Hal","/org/freedesktop/Hal/Manager")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (1)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;interface = dbus.Interface(object,"org.freedesktop.Hal.Manager")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;result = interface.DeviceExists(...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As mentioned earlier, you have to know which parameter of &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus.get_object&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dbus.Interface &lt;/span&gt;is the object name, the connection name, and the interface name.&amp;nbsp; The names themselves are usually not a great help.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Signal callbacks (HAL)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to make dbus call a method in your program when a signal is triggered you have to add a signal receiver:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus.add_signal_receiver(&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; handler_name_in_your_program,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; "signal_name",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; "interface_name",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; "connection_name",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; "object_name")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The handler method looks like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def handler(...):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The parameters used when this handler is executed (the so called "signature") differ from signal to signal.&amp;nbsp; (This info can be obtained via the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Introspect&lt;/span&gt; interface.)&amp;nbsp; Here the example for the methods &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceAdded&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceRemoved&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus = dbus.SystemBus()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus.add_signal_receiver(device_added_callback,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "DeviceAdded",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "org.freedesktop.Hal.Manager",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "org.freedesktop.Hal",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "/org/freedesktop/Hal/Manager")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus.add_signal_receiver(device_removed_callback,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "DeviceRemoved",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "org.freedesktop.Hal.Manager",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "org.freedesktop.Hal",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "/org/freedesktop/Hal/Manager")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;....&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def device_added_callback(udi):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print udi&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def device_removed_callback(udi):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; print udi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(More on add_signal_receiver in the next post)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to call a function (DeviceKit.Disks)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The fundamental dbus principles described in the HAL example still apply:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (4)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bus = dbus.SystemBus()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (3 + 2)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;devkit_object = bus.get_object("org.freedesktop.DeviceKit.Disks", &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "/org/freedesktop/DeviceKit/Disks")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (1)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;devkit_disks = dbus.Interface(devkit_object, 'org.freedesktop.DeviceKit.Disks')&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;all_devices = devkit_disks.EnumerateDevices()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note: This time the connection/object/interface names are nearly identical.&amp;nbsp; Keep in mind which parameter describes what&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Signal callbacks (DeviceKit.Disks)&lt;/b&gt;&lt;br /&gt;Even tough a few handler names are identical to HAL and their functions are similar, their parameters are different.&amp;nbsp; Also note that the way &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DeviceKit.Disks&lt;/span&gt; adds callbacks is different:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;devkit_disks.connect_to_signal('DeviceAdded', device_added_callback)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;devkit_disks.connect_to_signal('DeviceRemoved', device_removed_callback)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;devkit_disks.connect_to_signal('DeviceChanged', device_changed_callback)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def device_added_callback(device):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # not really needed&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Device %s was added' % (device)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def device_removed_callback(device):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # not really needed&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Device %s was removed' % (device)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def device_changed_callback(device):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Device %s was changed' % (device)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Other daemons&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are other interesting daemons, like the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ModemManager&lt;/span&gt;, which not only can control modems, but also allows access to your mobile phone, SMS etc.&lt;br /&gt;&lt;div style='clear: both;'&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6766033099207053872?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6766033099207053872/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6766033099207053872' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6766033099207053872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6766033099207053872'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/04/dbus-tutorial-part-1.html' title='dbus tutorial - part 1'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5022736358158158932</id><published>2010-04-10T23:48:00.001+02:00</published><updated>2010-04-10T23:50:26.924+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ein Tag ohne E-Mail</title><content type='html'>Nach einem Sicherheitsupdate in Ubuntu Karmic meldete sich Thunderbird beim Start mit:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Die Sicherheitskomponente der Anwendung konnte nicht&lt;br /&gt;initialisiert werden. Der wahrscheinlichste Grund dafür sind&lt;br /&gt;Probleme mit Dateien im Profil-Ordner Ihrer Anwendung.&lt;br /&gt;Bitte stellen Sie sicher, dass der Ordner keine Lese- und&lt;br /&gt;Schreibbeschränkung hat und Ihre Festplatte nicht voll oder&lt;br /&gt;fast voll ist. Es wird empfohlen,  dass Sie die Anwendung&lt;br /&gt;jetzt beenden und das Problem beheben. Wenn Sie diese Sitzung&lt;br /&gt;weiter verwenden, können Sie unkorrektes Verhalten der Anwendung&lt;br /&gt;beim Zugriff auf Sicherheitsfunktionen feststellen.&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;und sämtliche mit SSL gesicherten Verbindungen zu POP- und SMTP-Servern schlugen fehl... und das sind bei mir alle.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://mrhirsh.com/2010/04/06/i-hate-it-when-this-happens.aspx"&gt;I hate it when this happens.&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;Gegenmaßnahmen, die ich bei einer ersten Google-Suche nach dieser Fehlermeldung gefunden hatte (Neuinstallation von Thunderbird, Löschen von cert8.db, Anlegen eines neuen Profils) waren jedoch wirkungslos.&lt;br /&gt;&lt;br /&gt;Beim Sicherheitsupdate wurde unter anderem die Bibliothek &lt;span style=";font-family:&amp;quot;;" &gt;libnss&lt;/span&gt; aktualisiert, die für Verschlüsselung zuständig ist.&lt;br /&gt;&lt;br /&gt;Ein &lt;a href="http://forum.ubuntuusers.de/topic/thunderbird-2-0-0-24/#post-2435064"&gt;Eintrag&lt;/a&gt; im Ubuntu-Form bestätigte diesen Verdacht. In meinem Fall reichte es, die veraltete Bibliothek &lt;span style=";font-family:&amp;quot;;" &gt;libnss3-0d &lt;/span&gt;in Synaptic zu deinstallieren.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5022736358158158932?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5022736358158158932/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5022736358158158932' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5022736358158158932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5022736358158158932'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/04/ein-tag-ohne-e-mail.html' title='Ein Tag ohne E-Mail'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-709394789335696362</id><published>2010-03-13T18:20:00.007+01:00</published><updated>2010-03-13T18:28:59.410+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>T60: Die Tastatur, die Henne und das Ei</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wCX5P_aGQzo/S5vDT_KKicI/AAAAAAAAAGw/2pXg6kP5EY4/s1600-h/t60-key1.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img src="http://2.bp.blogspot.com/_wCX5P_aGQzo/S5vDT_KKicI/AAAAAAAAAGw/2pXg6kP5EY4/s200/t60-key1.JPG" border="0" height="173" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Seit einigen Wochen habe ich einen &lt;i&gt;neuen&lt;/i&gt; Laptop...&lt;br /&gt;&lt;br /&gt;Naja, ein Gebrauchtgerät - Lenovo T60 - erworben beim Gebraucht-Laptop-Händler meines Vertrauens, bei dem ich über die Jahre schon einige Geräte der jeweils vorletzten Generation erworben habe.&lt;br /&gt;&lt;br /&gt;Wie bei früheren Laptops, so hatte auch dieser eine ausländische Tastatur. Der Laptop kam mit Etiketten zum Überkleben der Tasten. Das war bei früheren Käufen auch so gewesen und die Etiketten halten immer noch.&lt;br /&gt;&lt;br /&gt;Unterdessen läuft Ubuntu Karmic mit Gnome auf dem Rechner. Die diversen Funktionstasten werden unterstützt (laut, leise, heller, dunker) und auch Blender ist dank &lt;a href="http://doppelherz.de/"&gt;der Kraft der zwei Kerne&lt;/a&gt;  halbwegs flott.&lt;br /&gt;&lt;br /&gt;Etwas gestutzt hatte ich dann gestern, als ich auf der Kommandozeile eine etwas längere Ausgabe mit  &lt;span style=";font-family:&amp;quot;;" &gt;| less&lt;/span&gt; seitenweise anzeigen wollte. Nirgendwo war der senkrechts Strich zu finden.&lt;br /&gt;&lt;br /&gt;Sollten die Aufkleber doch nicht so vollständig gewesen sein? Nachdem ich alle Tasten mit gedrückter Alt-Gr-Taste durchprobiert hatte stand fest: kein senkrechter Strich. Nun gut, dann eben eine Umleitung in eine Datei - aber auch das Größerzeichen war nirgends zu finden.&lt;br /&gt;&lt;br /&gt;Fehlt also eine Taste?&lt;br /&gt;&lt;br /&gt;Die Antwort ist: ja. Nach ein wenig googlen fand ich auf &lt;a href="http://www.notebookcheck.com/Testbericht-IBM-Lenovo-Thinkpad-T60.875.0.html"&gt;Notebookcheck&lt;/a&gt; ein Bild des Laptops mit aufgeklappter Tastatur. Die dort gezeigte Tastatur (oben rechts) hat im Gegensatz zu meiner eine schmalere linke Shift-Taste. In dem freiwerdenden Zwischenraum liegt normalerweise:  &lt;span style=";font-family:&amp;quot;;" &gt;&amp;lt;  &amp;gt; |&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Wahrscheinlich hat Sprache, für die die Tastatur eigentlich ausgelegt ist, weniger Sonderzeichen, braucht weniger Tasten und das  &lt;span style=";font-family:&amp;quot;;" &gt;&amp;lt; &amp;gt; &lt;/span&gt;befinden sich irgendwo unter den Tasten Ä Ö oder Ü.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Was also tun? Ohne "größer" und "kleiner" ist das Programmieren recht umständlich. Und wie häufig man auf der Kommandoebene die Pipe benutzt merkt man erst dann, wenn es nicht mehr geht...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Umdefinieren der Tastatur mit Xmodmap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Im Ubuntu-Wiki gibt es hierzu einen ausführlichen &lt;a href="http://wiki.ubuntuusers.de/Xmodmap"&gt;Eintrag&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Erster Schritt: Auslesen der aktuellen Zuweisung.&lt;br /&gt;&lt;br /&gt;Hierzu muss im Home-Verzeichnis der Befehl&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: courier new;" face="courier new"&gt;xmodmap -pke &amp;gt; .Xmodmap&lt;/div&gt;&lt;br /&gt;eingegeben werden, was bei fehlendem "&amp;gt;" ein echtes Henne- und Ei-Problem ist. (Ich habe schließlich auf einem anderen Rechner (mit voller Tastatur) ein einzeiliges Skript geschrieben und auf den Laptop kopiert).&lt;br /&gt;&lt;br /&gt;Sucht man in .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Xmodmap&lt;/span&gt; nach "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;greater&lt;/span&gt;", so findet man zwar:&lt;br /&gt;&lt;br /&gt;&lt;div  style="font-family: courier new;font-family:&amp;quot;;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;keycode&lt;/span&gt;  94 = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;less&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;greater&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;less&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;greater&lt;/span&gt; bar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;brokenbar&lt;/span&gt; bar&lt;/div&gt;&lt;br /&gt;Versucht man aber - nach Aufruf des Programms &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;xev&lt;/span&gt;&lt;/b&gt; - die Taste mit dem &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Keycode&lt;/span&gt; 94 zu finden, so wird man nicht fündig. Ich habe mich schließlich für die Tasten "Blättern" (links und rechts über "Cursor links" und "Cursor rechts", &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Keycode&lt;/span&gt; 166 bzw. 167) entschieden und die Belegung dort wie folgt geändert:&lt;br /&gt;&lt;br /&gt;&lt;div  style="font-family:courier new;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;keycode&lt;/span&gt; 166 = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;less&lt;/span&gt; bar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;XF&lt;/span&gt;86&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Back&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;NoSymbol&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;XF&lt;/span&gt;86&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Back&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:courier new;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;keycode&lt;/span&gt; 167 = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;greater&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;NoSymbol&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;XF&lt;/span&gt;86&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Forward&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;NoSymbol&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;XF&lt;/span&gt;86&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Forward&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Nachdem Aufruf&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: courier new;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;xmodmap&lt;/span&gt; .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;Xmodmap&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;sind die fehlenden Zeichen nun zugänglich.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spezielle Behandlung von ~/.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Xmodmap&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nach einer einmaligen Nachfrage beim nächsten Einloggen wird die geänderte Tastaturbelegung unter X dauerhaft aktiv.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-709394789335696362?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/709394789335696362/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=709394789335696362' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/709394789335696362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/709394789335696362'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/03/t60-die-tastatur-die-henne-und-das-ei.html' title='T60: Die Tastatur, die Henne und das Ei'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wCX5P_aGQzo/S5vDT_KKicI/AAAAAAAAAGw/2pXg6kP5EY4/s72-c/t60-key1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-1091068893502911220</id><published>2010-03-01T23:17:00.001+01:00</published><updated>2010-03-15T20:39:25.792+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hugin'/><title type='text'>Hugin - Probleme unter Windows</title><content type='html'>Hugin ist ein Open-Source-Projekt dessen Software u.a. dazu eingesetzt werden kann mehrere Einzelbilder zu einem Panorama zu kombinieren, ein Vorgang, der als "Stiching" bezeichnet wird.&lt;br /&gt;&lt;br /&gt;Damit die Aufnahmen nahtlos ineinander übergehen müssen sog. Kontrollpunkte gesetzt werden. Der Kontrollpunkt in Bild A und der zugehörige Kontrollpunkt in Bild B bezeichnen den gleichen Ort in der realen Welt.&lt;br /&gt;&lt;br /&gt;Man kann diese Kontrollpunkte von Hand setzen, aber auch dafür gibt es mittlerweile Hilfsprogramme. Ein bei Hugin-Usern sehr beliebtes (weil schnelles) Programm ist autopano-sift-c. Es sucht in den Bildern nach markanten Punkten und versucht diese zuzuordnen.&lt;br /&gt;&lt;br /&gt;Im nächsten Schritt beginnt Hugin anhand dieser Daten die Bilder passend zu verzerren, zu verschieben und zu überblenden.&lt;br /&gt;&lt;br /&gt; &lt;b&gt;Die Probleme&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hugin ist mittlerweile auf diverse Plattformen portiert - so auch Windows - von wo mich der Hilferuf erreichte, der zu diesem Posting führte. Es waren mehrere Probleme aufgetreten, die das Programm unbrauchbar machten.&lt;br /&gt;&lt;br /&gt;Hugin wird bei SourceForge gehostet. Die zurzeit (März 2010) dort &lt;a href="http://sourceforge.net/projects/hugin/files/"&gt;verfügbare&lt;/a&gt; Windows-Version ist &lt;i&gt;schon&lt;/i&gt; 2 Monate alt.&lt;br /&gt;&lt;br /&gt;Unterdessen sind compilierte neuere Builds aus dem Hugin Subversion Repository aus &lt;a href="http://lemur.dreamhosters.com/hugin/"&gt;anderen Quellen &lt;/a&gt;verfügbar und mein Bekannter hatte das neuste Build installiert (als User von Blender 2.5 kann ich das nachfühlen).&lt;br /&gt;Diese Builds führen jedoch beim Laden der von ihm verwendeten TIFF-Dateien zu einem "TIFF library error". Ein Downgrade auf die ältere SourceForge-Version beseitigte das Problem.&lt;br /&gt;&lt;br /&gt;Auch beim Suchen der Kontrollpunkte ist die neuere Variante (Autopano-SIFT-C version 2.5.2 23July2009) nicht die bessere.&lt;br /&gt; &lt;br /&gt;Das Fehlerbild hier: Hugin meldet, dass keine Kontrollpunkte gefunden wurden.&lt;br /&gt;&lt;br /&gt;Ruft man das Programm über die Kommandozeile auf, erkennt man, dass zwar einige Punkte gefunden werden (einige Hundert), normal sind jedoch 1000 und mehr. So verwundert es nicht, dass beim Abgleich, welche markanten Punkte aus Bild A zu denen in Bild B passen könnten, zum Schluß keiner übrig bleibt.&lt;br /&gt;&lt;br /&gt;Abhilfe schafft hier, wie von Bart van Andel in einem Google-Groups-Thread beschrieben, die ältere Version 2.5.1 (Download Link siehe erwähnter &lt;a href="http://www.google.com/url?sa=D&amp;amp;q=http://www.sendspace.com/file/0mgb8o&amp;amp;usg=AFQjCNEGZfjT79MQ4JGZOseiJ8cmYQrBmg"&gt;Thread&lt;/a&gt;). Das Einbinden der neuen Version erfolgt über "Datei - Einstellungen - Kontrollpunkt-Detektoren".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sollte eines der oben erwähnten Probleme auftreten, so scheint zurzeit die folgende Kombination am stabilsten zu laufen:&lt;br /&gt;&lt;br /&gt;Hugin_2009.4 von SourceForge und Autopano-SIFT-C 2.5.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-1091068893502911220?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/1091068893502911220/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=1091068893502911220' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1091068893502911220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1091068893502911220'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/03/hugin-probleme-unter-windos.html' title='Hugin - Probleme unter Windows'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4406373286436069701</id><published>2010-02-20T21:12:00.001+01:00</published><updated>2010-02-21T11:52:35.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Blender 2.5 alpha 1 verfügbar</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s1600-h/blender.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img src="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s200/blender.png" border="0" height="173" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Seit heute ist Blender 2.5 alpha 1 &lt;a href="http://www.blender.org/development/release-logs/blender-250/"&gt;verfügbar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dieses offizielle Release läuft auch unter Ubuntu Hardy - der (noch) aktuellen LTS-Version von Ubuntu.&lt;br /&gt;&lt;br /&gt;Bei den aktuelleren Blender Builds auf &lt;a href="http://www.graphicall.org/builds/"&gt;GraphicAll.org&lt;/a&gt; war das seit dem Übergang von Alpha 0 auf Alpha 1 leider nicht mehr der Fall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4406373286436069701?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4406373286436069701/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4406373286436069701' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4406373286436069701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4406373286436069701'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/02/blender-250-alpha-1-verfugbar.html' title='Blender 2.5 alpha 1 verfügbar'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s72-c/blender.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-7760477523083358168</id><published>2010-01-01T08:59:00.004+01:00</published><updated>2010-01-01T23:51:17.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: cStringIO vs. StringIO</title><content type='html'>If a function expects a file handle as an input parameter, but the data you want to process is stored in a string variable, you could store its content in a temporary file on disk, then open that file and use its file handle for the above mentioned function.&lt;br /&gt;&lt;br /&gt;A nicer way to do this is the python function &lt;b&gt;StringIO&lt;/b&gt; in the &lt;i&gt;StringIO&lt;/i&gt; library. It takes the string as an argument and returns a file handle, from which the function can&lt;span style=";font-family:&amp;quot;;" &gt; read()&lt;/span&gt;. The conversion happens in memory, i.e. no tedious creation of temporary files.&lt;br /&gt;&lt;br /&gt;Depending on how often you need this functionality and how large the data is, the &lt;span style="font-family:courier new;"&gt;StringIO.StringIO&lt;/span&gt; - which is programmed purely in Python - may be too slow.&lt;br /&gt;&lt;br /&gt;The library &lt;i&gt;&lt;b&gt;c&lt;/b&gt;StringIO&lt;/i&gt; offers a function with the same name with the same functionality carried out by a faster C-implementation. This function should be a drop-in replacement for the Python version.&lt;br /&gt;&lt;br /&gt;However, since more and more strings are stored in &lt;i&gt;unicode&lt;/i&gt; this function has an unexpected side effect. This side effect is detailed in the library &lt;a href="http://python.org/doc/2.5.2/lib/module-cStringIO.html"&gt;description&lt;/a&gt;, if you look close enough.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;c&lt;/span&gt;StringIO.StringIO&lt;/span&gt; does &lt;b&gt;not&lt;/b&gt; return the original encoded text, but the "representation of the Unicode string", which may differ from machine to machine:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt;import StringIO&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a = StringIO.StringIO(u"test")&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.read()&lt;br /&gt;u'test'&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;import cStringIO&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a = cStringIO.StringIO(u"test")&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.read()&lt;br /&gt;'t\x00\x00\x00e\x00\x00\x00s\x00\x00\x00t\x00\x00\x00'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A patch to fix this was &lt;a href="http://bugs.python.org/issue2387"&gt;proposed&lt;/a&gt; but rejected due to backwards compatibility.&lt;br /&gt;&lt;br /&gt;So be aware...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-7760477523083358168?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/7760477523083358168/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=7760477523083358168' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7760477523083358168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7760477523083358168'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2010/01/python-cstringio-vs-stringio.html' title='Python: cStringIO vs. StringIO'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-252667329239706069</id><published>2009-12-28T14:02:00.001+01:00</published><updated>2009-12-28T14:02:49.078+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>wxPython-Versionen auswählen</title><content type='html'>Wenn mehrere wxPython-Versionen gleichzeitig auf einem System installiert sind, so lädt ein einfaches&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import wx&lt;/pre&gt;&lt;br /&gt;natürlich immer die Version, mit der man gerade nicht arbeiten will.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import wxversion&lt;br /&gt;wxversion.select('2.8')&lt;br /&gt;import wx&lt;/pre&gt;&lt;br /&gt;Die Version des gerade geladenen Moduls erhält man mit:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;print wx.__version__&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-252667329239706069?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/252667329239706069/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=252667329239706069' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/252667329239706069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/252667329239706069'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/12/wxpython-versionen-auswahlen.html' title='wxPython-Versionen auswählen'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-1410057174158572459</id><published>2009-12-25T22:36:00.001+01:00</published><updated>2010-03-03T10:44:05.965+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><title type='text'>Changing USB device permissions in Ubuntu Karmic</title><content type='html'>If you plug an USB device into a Linux box that uses a current distro, &lt;b&gt;udev&lt;/b&gt; dynamically creates an entry in the &lt;span style=";font-family:&amp;quot;;" &gt;/dev&lt;/span&gt; directory.  You can list all currently available USB units with the &lt;span style=";font-family:&amp;quot;;" &gt;lsusb&lt;/span&gt; command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ lsusbBus 002 Device 003: ID 03eb:6125 Atmel Corp. Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;/pre&gt;&lt;br /&gt;The only "real" device here is my XAiOX GPS logger (first entry).  The output shows that it has the vendor id (hex) 03eb, the product id (hex) 6125.&lt;br /&gt;&lt;br /&gt;The device file created by &lt;i&gt;udev&lt;/i&gt; is:&lt;span style=";font-family:&amp;quot;;" &gt; /dev/bus/usb/002/003&lt;/span&gt;&lt;br /&gt;(Yes, these are the bus and device numbers shown in the &lt;i&gt;lsusb&lt;/i&gt; output).&lt;br /&gt;&lt;br /&gt;The default permissions are rather restrictive:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ls -l /dev/bus/usb/002insgesamt 0crw-rw-r-- 1 root root 189, 128 2009-12-23 22:14 001crw-rw-r-- 1 root root 189, 128 2009-12-23 22:19 003&lt;/pre&gt;&lt;br /&gt;Only root can read and &lt;b&gt;write&lt;/b&gt; to the USB device.  Anybody else only has read access.&lt;br /&gt;&lt;br /&gt;In order to retrieve the stored GPS info from my GPS logger (e.g. by using &lt;a href="http://itrackutil.sourceforge.net/"&gt;itrackutil&lt;/a&gt;), I have to instruct the device to send the data.  In order to send this command I need the write privileges.&lt;br /&gt;&lt;br /&gt;I could start the &lt;i&gt;itrackutil&lt;/i&gt; as &lt;i&gt;root&lt;/i&gt;, but from a security standpoint that is not what you want.&lt;br /&gt;&lt;br /&gt;This problem usually arises only, if the USB device is not (yet) managed by the system, because part of that managing process is... changing the permissions.&lt;br /&gt;&lt;br /&gt;The solution I'm suggesting here works with Ubuntu Karmic.&lt;br /&gt;&lt;br /&gt;The first step is to create a group named &lt;i&gt;usbusers&lt;/i&gt; (or any other name), then make yourself member of that group and instruct &lt;i&gt;udev&lt;/i&gt; to set the device &lt;b&gt;group&lt;/b&gt; id to &lt;i&gt;usbusers&lt;/i&gt; and set the permissions accordingly.&lt;br /&gt;&lt;br /&gt;On the command line, creating a group and adding the user (e.g. mike) is quite simple:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo groupadd usbuserssudo adduser mike usbusers&lt;/pre&gt;&lt;br /&gt;If you pefer the Gnome GUI, you find the appropriate program under "System - Administration - User and groups":&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SzUsB5jpa_I/AAAAAAAAAGg/wU7MWy8P7ek/s1600-h/user1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SzUsB5jpa_I/AAAAAAAAAGg/wU7MWy8P7ek/s400/user1.png" height="212" width="400" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;After unlocking the panel ("Click to make changes"), click onto "Manage Groups".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SzUsVSbKNjI/AAAAAAAAAGk/5JsyMCIUbe4/s1600-h/user2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SzUsVSbKNjI/AAAAAAAAAGk/5JsyMCIUbe4/s400/user2.png" height="323" width="400" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;"Add Group".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SzUsgHV5TJI/AAAAAAAAAGo/-y5IA3PvMFk/s1600-h/user3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SzUsgHV5TJI/AAAAAAAAAGo/-y5IA3PvMFk/s400/user3.png" height="308" width="400" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Make enter "usbusers" as group name, make sure that the group id suggested by the system is not zero. It's usually in the 1000+ range, enable the "Group Members" and click "Ok".&lt;br /&gt;&lt;br /&gt;As a last step you have to create a new udev rule:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="usbusers"&lt;/pre&gt;&lt;br /&gt;Save it under the following name: &lt;span style=";font-family:&amp;quot;;" &gt;/etc/udev/rules.d/45-xaiox.rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then reboot.&lt;br /&gt;&lt;br /&gt;Two remarks regarding the filename:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;in order to be executed, the filename &lt;b&gt;&lt;span style="font-family:Arial,Helvetica,sans-serif;"&gt;must&lt;/span&gt;&lt;/b&gt; end with&lt;i&gt; .rules&lt;/i&gt; (all other files are ignored)&lt;/li&gt;&lt;li&gt;the 45 ensures that the file is executed before the corresponding "old" rule found in /lib/udev/rules.d/50-udev-default.rules &lt;/li&gt;&lt;/ul&gt; If you now plug-in your usb device, the permissions look like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ls -l /dev/bus/usb/002/total 0crw-rw-r-- 1 root usbusers 189, 128 2009-12-25 20:20 001crw-rw-r-- 1 root usbusers 189, 133 2009-12-25 22:22 006&lt;/pre&gt;&lt;br /&gt;And being a member of &lt;i&gt;usbusers&lt;/i&gt;, you have read &lt;b&gt;and&lt;/b&gt; write access.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-1410057174158572459?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/1410057174158572459/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=1410057174158572459' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1410057174158572459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1410057174158572459'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/12/changing-usb-device-permissions-in.html' title='Changing USB device permissions in Ubuntu Karmic'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wCX5P_aGQzo/SzUsB5jpa_I/AAAAAAAAAGg/wU7MWy8P7ek/s72-c/user1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-698155790672310195</id><published>2009-12-10T01:17:00.002+01:00</published><updated>2009-12-10T01:20:51.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Blender 2.5 alpha, slow screen update</title><content type='html'>&lt;div&gt;&lt;a style="" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s1600/blender.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5408561645212841986" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s320/blender.png" style="margin: 0pt 0pt 10px 10px; cursor: pointer; float: right; height: 196px; width: 226px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now that I got &lt;a href="http://www.graphicall.org/builds/"&gt;Blender 2.5 alpha 0&lt;/a&gt; running on my old laptop, I noticed that when rotating what must be the most deleted cube in the 3D world, the refresh rate was very slow. An update rate of 2 or 3 times per second makes the program unusable.&lt;br /&gt;&lt;br /&gt;Granted, the laptop is not very fast, but in the old version of Blender (2.49a) the cube followed the mouse movement without any visible delay.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SyArUWlr7sI/AAAAAAAAAF8/pSX2ONY3sdE/s1600-h/openglerror1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5413374380760362690" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SyArUWlr7sI/AAAAAAAAAF8/pSX2ONY3sdE/s400/openglerror1.png" style="margin: 0pt 10px 10px 0pt; cursor: pointer; float: left; height: 126px; width: 270px;" border="0" /&gt;&lt;/a&gt;Having seen Blender using OpenGL without hardware acceleration before, I tried pressing one of the OpenGL buttons down in the "header" of the 3D window:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This produced the error: "Failed to create OpenGL offscreen buffer".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SyAriMtFa9I/AAAAAAAAAGE/TGVPxJkwbP0/s1600-h/openglerror2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SyAriMtFa9I/AAAAAAAAAGE/TGVPxJkwbP0/s320/openglerror2.png" height="146" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Something &lt;b&gt;was&lt;/b&gt; wrong with the use of OpenGL.&lt;br /&gt;&lt;br /&gt;User &lt;span style="font-family: courier new;"&gt;teeth&lt;/span&gt; in the developer IRC channel &lt;span style="font-family:courier new;"&gt;#blendercoders&lt;/span&gt; on freenet.org, suggested to change the user preferences from "Triple Buffer" to "Overlap".&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SyArseCYCpI/AAAAAAAAAGM/twbZ3WEuu9c/s1600-h/usersettings.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" id="BLOGGER_PHOTO_ID_5413374795076602514" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SyArseCYCpI/AAAAAAAAAGM/twbZ3WEuu9c/s400/usersettings.png" style="margin: 0px auto 10px; cursor: pointer; display: block; height: 240px; text-align: center; width: 400px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;You can display these settings using "File - User Preferences" or Ctrl-Alt-U. Then select "System" and look for the "Window draw method".&lt;br /&gt;&lt;br /&gt;Don't forget to "Save as default".&lt;br /&gt;&lt;br /&gt;It worked here.  If you have the same problem, it's worth a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-698155790672310195?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/698155790672310195/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=698155790672310195' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/698155790672310195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/698155790672310195'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/12/blender-25-alpha-slow-screen-update.html' title='Blender 2.5 alpha, slow screen update'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s72-c/blender.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6877203179746529777</id><published>2009-12-01T23:20:00.012+01:00</published><updated>2009-12-02T18:43:42.845+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='karmic'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='mesa'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Bisecting mesa - bug 446632</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SxW85jviO3I/AAAAAAAAAF0/DV6Lrf-NhaU/s1600/mesasplit.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 112px; height: 211px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SxW85jviO3I/AAAAAAAAAF0/DV6Lrf-NhaU/s320/mesasplit.png" alt="" id="BLOGGER_PHOTO_ID_5410438224388701042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bug &lt;a href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/446632"&gt;446632&lt;/a&gt; is responsible for the segfaulting blender on start-up on machines with ATI graphics cards running Ubuntu Karmic.&lt;br /&gt;&lt;br /&gt;Analysis showed that the segfault originated in the mesa library. The code of the mesa contains the OpenGL implementation under Linux, and is used by Blender and various other programs.&lt;br /&gt;&lt;br /&gt;During the pre-release process of Karmic, various builds of the mesa package have been made and are still available &lt;a href="https://launchpad.net/ubuntu/karmic/+source/mesa"&gt;online&lt;/a&gt;. Tests showed that the last build without the bug was &lt;a href="https://launchpad.net/ubuntu/+source/mesa/7.6.0%7Egit20090817.7c422387-0ubuntu8"&gt;7.6.0~git20090817.7c422387-0ubuntu8&lt;/a&gt;. The next one was &lt;a href="https://launchpad.net/ubuntu/+source/mesa/7.6.0-1ubuntu1"&gt;7.6.0-1ubuntu1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To determine which patch between those two releases is responsible for the bug, a process called git-bisecting is used.  For this, you give git the id of a version with and without the bug. Git chooses a version in the middle. You check it out, compile it and test it. After that you tell git if this version was good or bad. After that git chooses another version halfway between the last good and the first bad one. This process is repeated until you find the bad commit.&lt;br /&gt;&lt;br /&gt;Sounds simple enough.... but it raises the following questions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What Git repository does Ubuntu use for the mesa package?&lt;/li&gt;&lt;li&gt;Which commits correspond to the above mentioned builds?&lt;/li&gt;&lt;li&gt;And once you have the source, how do you compile, package and use it?&lt;/li&gt;&lt;/ul&gt;Within the Ubuntu project there is no git repository that describes the way from  7.6.0~git20090817.7c422387-0ubuntu8 to  7.6.0-1ubuntu1. Therefore we use the upstream git repository  at  git://anongit.freedesktop.org/mesa/mesa (browseable: &lt;a href="http://cgit.freedesktop.org/mesa/mesa"&gt;http://cgit.freedesktop.org/mesa/mesa&lt;/a&gt;) on which the Ubuntu version is based.&lt;br /&gt;&lt;br /&gt;7c422387 is the commit id within the freedesktop repository (well, not quite. The real commit ID is 7c4223876b4f8a78335687c7fcd7448b5a83ad10, but the first few digits are usually sufficient to find it).&lt;br /&gt;&lt;br /&gt;The last commit of the 7.6.0 branch in this repository has the label &lt;span style="font-style: italic;"&gt;mesa_7_6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The way to compile the source is described later in this post. As you will see, packaging is not necessary. The compiled drivers can be used directly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Git"ting started&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You need &lt;span style="font-weight: bold;"&gt;git-core&lt;/span&gt; - and also download &lt;span style="font-weight: bold;"&gt;gitk&lt;/span&gt; (which is not really necessary, but makes a nice graphical representation).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install git-core gitk&lt;/pre&gt;choose a directory and download the entire repository (in this tutorial I use my home directory).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd ~&lt;br /&gt;git clone git://anongit.freedesktop.org/mesa/mesa&lt;/pre&gt;&lt;br /&gt;This will create the subdirectory &lt;span style="font-weight: bold;"&gt;mesa&lt;/span&gt;, and a subdirectory&lt;span style="font-weight: bold;"&gt; .git&lt;/span&gt;, that contains the content of the cloned repository.&lt;br /&gt;&lt;br /&gt;Be patient. After counting the elements to be transferred it takes some time before the actual download begins. All in all around 100 MB.&lt;br /&gt;&lt;br /&gt;The code that we are going to compile needs some additional source files:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get build-dep mesa&lt;br /&gt;sudo apt-get install libx11-dev libxt-dev libxmu-dev libxi-dev&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Further preparations&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;make clean&lt;br /&gt;./autogen.sh&lt;br /&gt;./configure --prefix=/usr --mandir=\${prefix}/share/man \&lt;br /&gt;--infodir=\${prefix}/share/info --sysconfdir=/etc \&lt;br /&gt;--localstatedir=/var --build=i486-linux-gnu --disable-gallium --with-driver=dri \&lt;br /&gt;--with-dri-drivers="r200 r300 radeon" --with-demos=xdemos --libdir=/usr/lib/glx \&lt;br /&gt;--with-dri-driverdir=/usr/lib/dri --enable-glx-tls --enable-driglx-direct --disable-egl \&lt;br /&gt;--disable-glu --disable-glut --disable-glw CFLAGS="-Wall -g -O2"&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;make clean removes&lt;/span&gt; the "debris" from previous compilations. But we haven't created any yet... Do it anyway - it's good practice :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;./autogen.sh&lt;/span&gt; verifies that all prerequisites are met. If anything is missing, it will complain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;./configure&lt;/span&gt; sets up what is compiled, where and how.&lt;br /&gt;&lt;br /&gt;During the tests remove &lt;a href="http://www.nersc.gov/nusers/resources/software/ibm/opt_options/on.php"&gt;-O2&lt;/a&gt; (under CFLAGS). This disables compiler optimisations. The resulting code is a bit larger and a little bit slower, but it is easier to use during debugging.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;--with-dri-drivers="..."&lt;/span&gt; determines which drivers are compiled. As the original bug only affects ATI machines, we only need the drivers we use. That saves a lot of compile time. If yours is not among them, check out &lt;span style="font-style: italic;"&gt;~/mesa/src/mesa/drivers/dri/&lt;/span&gt; and add it.&lt;br /&gt;&lt;br /&gt;You can find out which driver you are using with:&lt;br /&gt;&lt;pre&gt;xdriinfo driver 0&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Verify the good build&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We know that build 7c4223876b4f8a78335687c7fcd7448b5a83ad10 still works with Blender. So let's check it out, compile it and test it. If Blender does not crash, we know that the process so far is working correctly.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;git checkout 7c422387&lt;br /&gt;make&lt;/pre&gt;&lt;br /&gt;We could enter the entire ID, but the first few digits are usually sufficient.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;make&lt;/span&gt; should finish without errors. Now we start Blender using:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;LD_LIBRARY_PATH&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;LIBGL_DRIVERS_PATH &lt;/span&gt;make Blender (and only Blender, or any other program you specify) use the just compiled libraries. No need to reboot or to restart X. No effects to the remaining programs.&lt;br /&gt;&lt;br /&gt;Please note, that you may need to replace the &lt;span style="font-style: italic;"&gt;radeon&lt;/span&gt; part of the driver path with  &lt;span style="font-style: italic;"&gt;r200&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;r300&lt;/span&gt; depending on the driver you use.&lt;br /&gt;&lt;br /&gt;Blender should run correctly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bisecting&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We now officially start the bisecting process:&lt;br /&gt;&lt;pre&gt;git bisect start&lt;/pre&gt;... and tell git that this was a "good" build.&lt;br /&gt;&lt;pre&gt;git bisect good&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Checking out the bad build&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As we can not pinpoint which git version corresponds to first bad Ubuntu build (7.6.0-1ubuntu1) we simply start at the newest commit in the mesa_7_6 branch:&lt;br /&gt;&lt;pre&gt;git checkout mesa_7_6&lt;/pre&gt;&lt;br /&gt;This replaces the files in the mesa directories and its subdirectories (except .git) with the new ones.&lt;br /&gt;&lt;br /&gt;We compile it:&lt;br /&gt;&lt;pre&gt;make&lt;/pre&gt;and test it:&lt;br /&gt;&lt;pre&gt;LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender&lt;/pre&gt;&lt;br /&gt;This time Blender should crash. We notify git:&lt;br /&gt;&lt;pre&gt;git bisect bad&lt;/pre&gt;&lt;br /&gt;With this command, git chooses a commit approx. in the middle:&lt;br /&gt;&lt;pre&gt;Bisecting: 482 revisions left to test after this (roughly 9 steps)&lt;br /&gt;[ee066eaf6d0dd3c771dc3e37390f3665e747af2a] llvmpipe: Allow to dump the disassembly byte code.&lt;/pre&gt;&lt;br /&gt;The make,  test, bisect process is repeated until git displays the first bad commit.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bfbad4fbb7420d3b5e8761c08d197574bfcd44b2 is first bad commit&lt;br /&gt;commit bfbad4fbb7420d3b5e8761c08d197574bfcd44b2&lt;br /&gt;Author: Pauli Nieminen &lt;suokkos@gmail.com&gt;&lt;br /&gt;Date: Fri Aug 28 04:58:50 2009 +0300&lt;br /&gt;r100/r200: Share PolygonStripple code.&lt;br /&gt;:040000 040000 1b1f09ef26e217307a5768bb9806072dc50f2a14 eb20bf89c37b2f59ce2c243b361587918d3c9021 M src&lt;/suokkos@gmail.com&gt;&lt;/pre&gt;&lt;br /&gt;As an interesting side note, the driver from this commit does crash Blender, but not with a segfault. There is even an output on the console: "drmRadeonCmdBuffer: -22".&lt;br /&gt;&lt;br /&gt;The next commit in this branch 4322181e6a07ecb8891c2d1ada74fd48c996a8fc makes Blender crash the way we have come to know.&lt;br /&gt;&lt;br /&gt;The previous commit (e541845959761e9f47d14ade6b58a32db04ef7e4) would be a good candidate to keep Blender running until mesa is fixed:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;git checkout e541845959761e9f47d14ade6b58a32db04ef7e4&lt;br /&gt;make&lt;br /&gt;LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ackowledgements&lt;/span&gt;&lt;br /&gt;Tormod Volden for creating and updating  &lt;a rel="nofollow" href="https://wiki.ubuntu.com/X/BisectingMesa"&gt;https:/&lt;wbr&gt;/wiki.ubuntu.&lt;wbr&gt;com/X/Bisecting&lt;wbr&gt;Mesa&lt;/a&gt; and various other info.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References&lt;/span&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/446632"&gt;https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/446632&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bugs.freedesktop.org/show_bug.cgi?id=25354"&gt;http://bugs.freedesktop.org/show_bug.cgi?id=25354&lt;/a&gt;&lt;br /&gt;&lt;a href="https://wiki.ubuntu.com/X/Bisecting"&gt;https://wiki.ubuntu.com/X/Bisecting&lt;/a&gt;&lt;br /&gt;&lt;a href="https://wiki.ubuntu.com/X/BisectingMesa"&gt;https://wiki.ubuntu.com/X/BisectingMesa&lt;/a&gt;&lt;br /&gt;&lt;a href="https://launchpad.net/%7Exorg-edgers/+archive/ppa"&gt;https://launchpad.net/~xorg-edgers/+archive/ppa&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html"&gt;http://www.kernel.org/pub/software/scm/git/docs/user-manual.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cgit.freedesktop.org/mesa/mesa"&gt;http://cgit.freedesktop.org/mesa/mesa&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6877203179746529777?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6877203179746529777/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6877203179746529777' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6877203179746529777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6877203179746529777'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/12/bisecting-mesa-bug-446632.html' title='Bisecting mesa - bug 446632'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wCX5P_aGQzo/SxW85jviO3I/AAAAAAAAAF0/DV6Lrf-NhaU/s72-c/mesasplit.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4771231866308642304</id><published>2009-11-30T13:09:00.004+01:00</published><updated>2009-12-02T14:17:36.915+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='karmic'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Update zum "Blender"-Bug</title><content type='html'>Bei den &lt;a href="http://tuxpool.blogspot.com/2009/11/blender-absturz-in-karmic.html"&gt;Abstürzen&lt;/a&gt; von Blender unter Ubuntu Karmic scheint es sich nicht um einen Fehler in Blender zu handeln, sondern um einen Bug im Paket &lt;span style="font-style: italic;"&gt;mesa&lt;/span&gt;, das für die OpenGL-Implementierung unter Linux zuständig ist.&lt;br /&gt;&lt;br /&gt;Der Bug-Report ist unterdessen &lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=25354"&gt;upstream&lt;/a&gt; gemeldet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4771231866308642304?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4771231866308642304/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4771231866308642304' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4771231866308642304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4771231866308642304'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/11/update-zum-blender-bug.html' title='Update zum &quot;Blender&quot;-Bug'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-665991361231123273</id><published>2009-11-27T00:41:00.006+01:00</published><updated>2009-11-30T13:12:32.585+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='karmic'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Blender-Absturz in Karmic</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s1600/blender.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 226px; height: 196px;" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s320/blender.png" alt="" id="BLOGGER_PHOTO_ID_5408561645212841986" border="0" /&gt;&lt;/a&gt;Blender 2.5 Alpha 0 ist gerade erschienen, und dass dies nicht auf Anhieb funktioniert erwartet man fast.&lt;br /&gt;&lt;br /&gt;Dass allerdings die ältere Version von Blender (2.49a) aus den Ubuntu-Repositories nicht funktioniert, ist dann schon ärgerlicher, zumal sich wahrscheinlich das nächste halbe Jahr nichts daran ändern wird.&lt;br /&gt;&lt;br /&gt;Blender stürzt nach dem Aufruf mit einem Segfault ab.&lt;br /&gt;&lt;br /&gt;Probleme scheinen mal wieder nur die ATI-Karten zu haben.&lt;br /&gt;&lt;br /&gt;Bug-Report in Ubuntu's &lt;a href="https://bugs.launchpad.net/bugs/446632"&gt;Launchpad&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-665991361231123273?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/665991361231123273/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=665991361231123273' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/665991361231123273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/665991361231123273'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/11/blender-absturz-in-karmic.html' title='Blender-Absturz in Karmic'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wCX5P_aGQzo/Sw8SKRi2uAI/AAAAAAAAAFs/U3y09TNtAdU/s72-c/blender.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4091180386523438223</id><published>2009-11-18T00:13:00.009+01:00</published><updated>2009-12-02T14:16:33.999+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itracku'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><title type='text'>itrackutil 0.1 veröffentlicht</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/SwMurkwBXTI/AAAAAAAAAFk/k1ckpJy1iFk/s1600/xaiox_kl.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 226px;" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/SwMurkwBXTI/AAAAAAAAAFk/k1ckpJy1iFk/s320/xaiox_kl.jpg" alt="" id="BLOGGER_PHOTO_ID_5405215303909072178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Seit einigen Wochen bin ich Besitzer eines XAiOX iTrackU GPS Loggers.&lt;br /&gt;&lt;br /&gt;Das Gerät verwendet den SirfIII Chipsatz, besitzt Bluetooth und kann bis zu 250.000 Wegpunkte speichern, das sind, wenn man einen Punkt pro Sekunde aufzeichnet, fast drei Tage.&lt;br /&gt;&lt;br /&gt;So lange hält der eingebaute Akku zwar nicht, aber die - laut Prospekt - immerhin 17 Stunden sind reichlich bemessen.&lt;br /&gt;&lt;br /&gt;Außerdem hat er eine Sprachansage, zur Quittierung verschiedener Betriebszustände (Bluetooth ein/aus, Satellitensuche, Fix).&lt;br /&gt;&lt;br /&gt;Die Sprachansage ist wohl eher dem (bis auf die Firmware) baugleichen Gerät mit dem Namen TrapScout zu verdanken, das als "Speed Camera Detector" per USB eine Datenbank mit Koordinaten programmiert bekommt und dann an den "Points of Interest" die Ansage "Sie fahren zu schnell." ausgibt.&lt;br /&gt;&lt;br /&gt;Für &lt;a href="http://www.openstreetmap.de/"&gt;OSM&lt;/a&gt;-Tracker ist natürlich die erste Variante interessanter.&lt;br /&gt;&lt;br /&gt;Und zunächst sah es so aus, als hätte ich nach längerer Zeit ein Gerät gefunden, für das es unter Linux keine Software gab. Aber auch hier war mir jemand zuvorgekommen. Harmut Schimmel hatte bereits vor einiger Zeit ein paar Perl-Skripte geschrieben, mit denen das Gerät von der Kommandozeile aus programmiert und ausgelesen werden konnte und diese auf seiner &lt;a href="http://itu4l.schimmelnetz.de/"&gt;Site&lt;/a&gt; veröffentlicht.&lt;br /&gt;&lt;br /&gt;Ein paar offene Fragen gab es dann aber doch noch. Die Ergebnisse von USB Sniffer und ein wenig Knobelei habe ich &lt;a href="http://itrackutil.sourceforge.net/develop.html"&gt;dokumentiert&lt;/a&gt; und sie sind in meine Utility &lt;a href="http://itrackutil.sourceforge.net/index.html"&gt;itrackutil&lt;/a&gt;, das auf SourceForge in der Version 0.1 veröffentlicht worden ist, eingeflossen.&lt;br /&gt;&lt;br /&gt;Viele Stellen in den vom Logger gesendeten Daten sind noch unklar, und können nur durch Vergleich mit anderen XAiOX iTrackU mit SirfIII Chipsatz vielleicht weiter entschlüsselt werden.&lt;br /&gt;&lt;br /&gt;Außerdem berichtet Hartmut, dass weitere Geräte "kompatibel" sind. Tester mit diesen Geräten suche ich auch:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XAiOX iTrackU mit Nemerix Chipsatz&lt;/li&gt;&lt;li&gt;Gisteq PhotoTrackr&lt;/li&gt;&lt;li&gt;Gisteq PhotoTrackr Lite (DPL700)&lt;/li&gt;&lt;/ul&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;Das Programm läuft zurzeit unter Linux (Ubuntu Karmic), stellt aber von den weiteren Abhängigkeiten keine allzu großen Hürden auf.&lt;br /&gt;&lt;br /&gt;Und obwohl diese Pakete auch unter Windows verfügbar sind, haben erste Versuche gezeigt, dass die zur USB-Kommunikation eingesetzte Bibliothek &lt;span style="font-style: italic;"&gt;libusb&lt;/span&gt; dann doch nicht 100%ig ihrem Linux-Pendant entspricht.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4091180386523438223?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4091180386523438223/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4091180386523438223' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4091180386523438223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4091180386523438223'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/11/itrackutil-01-veroffentlicht.html' title='itrackutil 0.1 veröffentlicht'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wCX5P_aGQzo/SwMurkwBXTI/AAAAAAAAAFk/k1ckpJy1iFk/s72-c/xaiox_kl.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-8439554279634014537</id><published>2009-10-21T10:07:00.005+02:00</published><updated>2009-10-21T11:38:02.172+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><title type='text'>USB Sniffing unter Linux</title><content type='html'>USB Sniffing – also das „Belauschen“ der USB-Kommunikation zwischen Computer und Endgerät – wird gerne eingesetzt, wenn für ein Gerät zwar ein Windows-Treiber aber kein Linux-Treiber vorhanden ist. Man versucht dabei herauszubekommen, welche Aktionen in der Windows-Anwendung welche USB-Kommunikation nach sich zieht, um dies dann in einer Linux-Anwendung nachzubilden.&lt;br /&gt;&lt;br /&gt;Hierzu wird normalerweise ein Treiber im Windows-System installiert, der die Daten abfängt und protokolliert, bevor Sie an die USB-Schnittstelle weitergeleitet werden.&lt;br /&gt;&lt;br /&gt;Auch unter Linux gibt es eine derartige Einrichtung. Sie nennt sich:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;usbmon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Aktivieren ist unter Ubuntu Jaunty denkbar einfach:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo mount -t debugfs none_debugs /sys/kernel/debug&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unter Hardy ist &lt;span style="font-style: italic;"&gt;usbmon&lt;/span&gt; noch ein separates Kernelmodul, das zusätzlich mit&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo modprobe usbmon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eingebunden werden muss.&lt;br /&gt;&lt;br /&gt;Danach erscheinen unter &lt;span style="font-family:courier new;"&gt;/sys/kernel/debug/usbmon &lt;/span&gt;diverse Dateien. Zum Beispiel:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ls /sys/kernel/debug/usbmon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;0s  0t  0u  1s  1t  1u  2s  2t  2u  3s  3t  3u&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Zahl im Namen bezeichnet die Nummer des USB-Busses (hier 1, 2 und 3). Der virtuelle „Bus 0“ liefert die Events aller Busse. Der Buchstabe hinter der Zahl (s, t, u) beschreibt, was ausgegeben werden soll:&lt;br /&gt;&lt;br /&gt;u – der mitgeschnittene Datenverkehr&lt;br /&gt;s – Statusmeldungen&lt;br /&gt;t – eine Teilmenge von „u“ (dieser Eintrag wird in absehbarer Zeit nicht mehr unterstützt).&lt;br /&gt;&lt;br /&gt;Was bleibt, ist diese Datei auszugeben und/oder in eine Datei umzuleiten, z.B.:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cat /sys/kernel/debug/usbmon/0u &gt; usbmon.txt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wireshark&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ganz ohne dieses Modul kommt Wireshark aus. Mit „Capture – Interfaces“ kann auch ein USB-Bus ausgewählt werden. Hierzu sind natürlich root-Rechte notwendig.&lt;br /&gt;&lt;br /&gt;Wireshark stellt die USB-Kommunikation in ähnlicher Weise wie sonst den Netzwerkverkehr dar. Außerdem werden die diversen Konstanten und Strukturen, wie bei Wireshark üblich, schon dekodiert und mit Klartext ausgegeben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Was bringt's?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Virtuelle Maschinen (z.B. VirtualBox, Vmware) haben unterdessen die Möglichkeit, USB-Geräte im virtualisierten System laufen zu lassen, die über das Gast-System auf die USB-Schnittstelle zugreifen.&lt;br /&gt;&lt;br /&gt;Kombiniert man diese beiden Möglichkeiten, so lassen sich z.B. Geräte in einer virtualisierten Windows-Umgebung betreiben, und „von außen“ belauschen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-8439554279634014537?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/8439554279634014537/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=8439554279634014537' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/8439554279634014537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/8439554279634014537'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/10/usb-sniffing-unter-linux.html' title='USB Sniffing unter Linux'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5961582616109930861</id><published>2009-09-22T00:17:00.004+02:00</published><updated>2009-09-22T00:44:20.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><title type='text'>Licht im Tunnel</title><content type='html'>Um die meist textbasierten Internet-Protokolle von Hand auszuprobieren verwendet man häufig Telnet. So kann man sich mit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;telnet www.google.de 80 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;mit einem Web-Server verbinden und eine Seite mit&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;GET / HTTP/1.0&lt;/span&gt;&lt;br /&gt;&lt;return&gt;&lt;br /&gt;abrufen.&lt;br /&gt;&lt;br /&gt;In ähnlicher Weise kann man andere Protokolle ausprobieren.Wenn Sie also immer schon wissen wollen, was der Befehl &lt;span style="font-weight: bold;"&gt;UIDL&lt;/span&gt; bei POP3-Servern bewirkt, telnet bringt Sie Ihrem POP3-Server näher.&lt;br /&gt;&lt;br /&gt;Wenn die Verbindung mit SSL verschlüsselt ist, hilft telnet nicht mehr weiter.&lt;br /&gt;&lt;br /&gt;In einem &lt;a href="http://www.heise.de/security/E-Mail-Verschluesselung-austesten--/artikel/145393"&gt;Artikel&lt;/a&gt; bei Heise wird der Einsatz von &lt;span style="font-weight: bold;"&gt;openssl&lt;/span&gt; beschrieben. Die Unterfunktion &lt;span style="font-family: courier new;"&gt;s_client&lt;/span&gt; stellt das SSL-Pendant zum guten alten telnet dar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;openssl s_client -connect www.heise.de:443&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nachdem die SSL-Verbindung aufgebaut ist, werden diverse Informationen angezeigt (chain of trust, Serverzertifikat, verwendete Verschlüsselungsalgorithmen usw.).&lt;br /&gt;&lt;br /&gt;Danach kann man sich - wie bei Telnet - mit dem Server unterhalten.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/return&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5961582616109930861?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5961582616109930861/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5961582616109930861' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5961582616109930861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5961582616109930861'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/09/licht-im-tunnel.html' title='Licht im Tunnel'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4635363943352459875</id><published>2009-09-14T00:36:00.011+02:00</published><updated>2009-09-14T01:55:48.545+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='UMTS'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><title type='text'>Der lange Marsch nach Huawei</title><content type='html'>&lt;a target="blank" style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/Sq10TFLazsI/AAAAAAAAAEs/60piL5WX9CA/s1600-h/vorderseite.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 262px; height: 320px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/Sq10TFLazsI/AAAAAAAAAEs/60piL5WX9CA/s320/vorderseite.jpg" alt="" id="BLOGGER_PHOTO_ID_5381085000934018754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Das UMTS-Modem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zurzeit gibt es bei Aldi-Süd den „Internet-USB-Stick S4011“ für knapp 60 €.&lt;br /&gt;&lt;br /&gt;Die von lsusb ausgegebene USB-ID sowie die „Selbstauskunft“ des Sticks zeigen aber, dass es sich um ein Huawei E160 handelt, wie sie im Augenblick zu Tausenden in Startersets von diversen Mobilfunkanbietern unter die Leute gebracht werden.&lt;br /&gt;&lt;br /&gt;Unter der Glasabdeckung des Lebensmitteldiscounters war jedoch die Rückseite nicht zu erkennen, die auf das hauseigene Starterset hinweist. Ganz unten findet sich dann aber dann der Hinweis, dass dieses Starterset nicht im Lieferumfang enthalten ist.&lt;br /&gt;&lt;br /&gt;Und in der Tat hat dieser Stick, im Gegensatz zu vielen anderen (teilweise teureren) „Startersets“, keinen Sim-Lock und ist hier schon mit den SIM-Karten der unterschiedlichsten Mobilfunkanbieter gelaufen.&lt;br /&gt;&lt;br /&gt;Eine kurze Recherche zeigte, dass der Stick vom (noch) aktuellen Ubuntu Jaunty unterstützt wird, und in der Tat läuft er mit dem Network-Manager ohne Probleme.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Der Datentarif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ohne SIM-Karte läuft aber auch dieses Modem nicht. Da der Stick nur gelegentlich eingesetzt werden soll, fiel die Wahl - nach einiger Suche - auf die Prepaid-Karte von &lt;a href="http://www.fonic.de/"&gt;Fonic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Auch dort gibt es ein Starterset – 69,95 € mit 5 Tagen freies Surfen. Der Stick, ein – wer hätte es gedacht – Huawai E160, hat jedoch, nach Auskunft der Hotline, einen Simlock.&lt;br /&gt;&lt;br /&gt;Da ich ja nun bereits ein simlock-freies E160 habe war die Alternative die normale SIM-Karte von Fonic (mit 111 Freiminuten). Da die Freiminuten bzw. die „Frei-Tage“ als Guthaben auf das Prepaid-Konto gutgeschrieben werden besteht zwischen den Angeboten kein großer Unterschied.&lt;br /&gt;&lt;br /&gt;Der normale Datentarif kostet zurzeit 0,24 €/MB und kann von der Hotline vom Volumentarif auf die Tagesflatrate zu 2,50 € umgestellt werden. Bei der Flatrate wird nach 1 GB am Tag die Geschwindigkeit gedrosselt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UMTSmon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wie bereits erwähnt läuft der Stick unter Network-Manager ohne Probleme. Bei meiner Recherche bin ich aber auf das Programm UMTSmon gestoßen.&lt;br /&gt;&lt;br /&gt;UMTSmon gab es schon bevor die Funktion in den Network-Manager integriert wurde. Es hat ein paar nützlich Zusatzfunktionen, wie das Anzeigen der Empfangsfeldstärke, SMS-Versand und das Nachhalten der verbrauchten Zeit und des verbrauchten Datenvolumens.&lt;br /&gt;&lt;br /&gt;UMTSmon ist leider nicht in den Ubuntu-Repositories verfügbar. Ein i386 Binary ist jedoch im  Download-Bereich des &lt;a href="http://sourceforge.net/projects/umtsmon/files/"&gt;Projekts&lt;/a&gt; zu finden.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;usb_modeswitch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UMTSmon verlangt nach einem weiteren Progamm: &lt;span style="font-family:courier new;"&gt;usb_modeswitch&lt;/span&gt;. Das Programm ist auf der &lt;a href="http://www.draisberghof.de/usb_modeswitch/"&gt;Seite des Autors&lt;/a&gt;  erhältlich. Das Debian-Projekt hält es als &lt;a href="http://packages.debian.org/sid/usb-modeswitch"&gt;.deb-Paket&lt;/a&gt; vor. Bei neueren Kernels ist &lt;span style="font-family:courier new;"&gt;usb_modeswitch&lt;/span&gt; eigentlich nicht mehr notwendig, da der Kernel diese Funktion übernimmt.&lt;br /&gt;&lt;br /&gt;Die Huawai-Sticks melden sich nämlich zunächst als USB-Massenspeicher an. Dieser Massenspeicher enthält Software und Treiber, die unter Windows per Autorun gestartet und installiert werden. Diese Treiber schalten dann den Stick in den „Modem-Modus“ um. Unter Linux übernimmt diese Funktion&lt;span style="font-family:courier new;"&gt; usb_modeswitch&lt;/span&gt;, und seit einiger Zeit der Kernel. Diese Technik ist auch als ZeroCD bekannt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;… und die Problemchen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Beim ersten Aufruf prüft UMTSmon diverse Abhängigkeiten. Zunächst bemängelte es das fehlende SUID-Bit bei &lt;span style="font-family:courier new;"&gt;usb_modeswitch&lt;/span&gt;. &lt;span style="font-family:courier new;"&gt;usb_modeswitch&lt;/span&gt; braucht für seine Aufgabe Root-Rechte. Diese waren schnell nachgetragen mit:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo chmod u+s /usr/sbin/usb_modeswitch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das nächste Problem bestand darin, dass sich das Modem in kein Netz einwählen konnte. Der Network Operator Wizard (Verbindung – Netzbetreiber auswählen) zeigte zwar diverse Netze an, nur ansprechen konnte ich sie nicht. Dieses Problem löste sich aber mit der Zeit von selbst. Man sollte bei neuen SIM-Karten warten bis sie freigeschaltet sind... :-)&lt;br /&gt;&lt;br /&gt;Nach der Freischaltung fand das Modem auch das von Fonic verwendete O2-Netz.&lt;br /&gt;&lt;br /&gt;&lt;a target="blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/Sq1-olKuk-I/AAAAAAAAAFE/S3ywQGEeThg/s1600-h/Bildschirmfoto-Edit+Profile.png"&gt;&lt;img style="cursor: pointer; width: 158px; height: 200px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/Sq1-olKuk-I/AAAAAAAAAFE/S3ywQGEeThg/s200/Bildschirmfoto-Edit+Profile.png" alt="" id="BLOGGER_PHOTO_ID_5381096365414585314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Danach habe ich eine neues Profil für Fonic angelegt (Verbindung – Profile bearbeiten – Add Profile). Als APN (Zugangspunkt) habe ich die im Netz angegebene Adresse „pinternet.interkom.de“ verwendet (ohne Gewähr). Ansonsten habe ich die Standardeinstellungen belassen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;pppd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der Versuch, sich mit dem Internet zu verbinden (2. Icon von links - „Connect to default profile“), scheiterte mit der Fehlermeldung:&lt;br /&gt;&lt;br /&gt;&lt;a target="blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/Sq13g9n06fI/AAAAAAAAAE8/GrQraLApmLs/s1600-h/Bildschirmfoto-PPP+Fehler+Logs2.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 128px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/Sq13g9n06fI/AAAAAAAAAE8/GrQraLApmLs/s200/Bildschirmfoto-PPP+Fehler+Logs2.png" alt="" id="BLOGGER_PHOTO_ID_5381088537958738418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;und den  vielsagenden Erklärungen:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;&amp;lt; ppp did not provide any stdout information &amp;gt;&amp;gt; und&lt;/li&gt;&lt;li&gt;&amp;lt;&amp;lt; ppp did not provide any stderr information &amp;gt;&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Leider brachte mich der gutgemeinte Hinweis auf die Kommandozeilen-Option &lt;span style="font-family:courier new;"&gt;-v4&lt;/span&gt; nicht viel weiter. Sie bewirkt, dass UMTSmon Debug-Informationen ausgibt. Unter anderem sieht man die Kommunikation mit dem Modem.&lt;br /&gt;&lt;br /&gt;Zum Einbinden des Internets ruft UMTSmon den &lt;span style="font-family:courier new;"&gt;pppd&lt;/span&gt; Daemon auf. Sehen wir uns die Datei &lt;span style="font-family:courier new;"&gt;pppd&lt;/span&gt; mal genauer an:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;$ ls -l /usr/sbin/pppd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-rwsr-xr-- 1 root dip 277352 2009-02-20 18:25 /usr/sbin/pppd&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Programm kann nur von &lt;span style="font-family:courier new;"&gt;root&lt;/span&gt; oder einem Mitglied der Gruppe &lt;span style="font-family:courier new;"&gt;dip&lt;/span&gt; gestartet werden – und das bin ich „normalerweise“ nicht. Der Grund, weshalb UMTSmon keine Informationen von ppp erhält ist, dass das pppd mangels fehlender Rechte nicht gestartet wurde.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wo ist dip?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Natürlich könnte man UMTSmon einfach mit root-Rechten aufrufen, aber das gehört sich nicht. Die einfachste Variante zum Mitglied der Gruppe dip zu werden ist der Befehl:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo adduser user_name dip&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der Versuch dies über die GUI (System – Systemverwaltung – Benutzer und Gruppen) zu erledigen läuft zunächst ins Leere. Ruft man nach dem „Entsperren“ den Punkt „Gruppen verwalten“ auf, so sucht man dort die Gruppe &lt;span style="font-family:courier new;"&gt;dip&lt;/span&gt; vergebens. Diese Gruppe versteckt sich bei den Benutzerrechten.&lt;br /&gt;&lt;br /&gt;Also: Benutzer anklicken – Eigenschaften – Benutzerrechte – „Internet-Verbindung mit Modem aufbauen“ ankreuzen.&lt;br /&gt;&lt;br /&gt;Eigentlich logisch – aber das muss man wirklich erst einmal wissen. Die Option „Modems verwenden“ muss ebenfalls aktiv sein, was sie jedoch standardmäßig ist. Sie macht einem zum Mitglied der Gruppe &lt;span style="font-family:courier new;"&gt;dialout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Dann muss man sich erst einmal ab- und wieder anmelden, bevor diese neue Einstellung aktiv ist. Ein Neustart ist jedoch nicht nötig.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ein neuer Versuch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der nächste Versuch, ins Internet zu kommen, scheiterte auch. Diesmal war die Fehlermeldung (stdout) etwas umfangreicher. Hier ein gekürzter Ausschnitt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;pppd options in effect:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debug debug debug        # (from command line)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/dev/ttyUSB1        # (from command line)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;460800        # (from command line)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;lock        # (from command line)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;crtscts        # (from command line)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Using interface ppp0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Connect: ppp0 &lt;--&gt; /dev/ttyUSB1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LCP: timeout sending Config-Requests&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Connection terminated.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Receive serial link is not 8-bit clean:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Problem: all had bit 7 set to 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Modem hangup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Im Rahmen der Fehlersuche hatte ich mit &lt;span style="font-weight: bold;"&gt;dmesg&lt;/span&gt; das Boot-Protokoll abgefragt. Dort findet man u.a.:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[   11.424602] USB Serial support registered for GSM modem (1-port)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.424737] option 2-2:1.0: GSM modem (1-port) converter detected&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.425007] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.425071] option 2-2:1.1: GSM modem (1-port) converter detected&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.425322] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.425405] usbcore: registered new interface driver option&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[   11.425452] option: v0.7.2:USB Driver for GSM modems&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hier ist zu erkennen, dass der Kernel für das Modem &lt;span style="font-weight: bold;"&gt;zwei&lt;/span&gt; serielle Devices einrichtet: &lt;span style="font-family:courier new;"&gt;/dev/ttyUSB0&lt;/span&gt; und &lt;span style="font-family:courier new;"&gt;/dev/ttyUSB1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Startet man umtsmon mit den Optionen&lt;span style="font-family:courier new;"&gt; -v4&lt;/span&gt; und&lt;span style="font-family:courier new;"&gt; --force-autodetect&lt;/span&gt; kann man schön verfolgen, wie&lt;br /&gt;&lt;ul&gt;&lt;li&gt;zunächst das Modem als solches erkannt wird&lt;/li&gt;&lt;li&gt;die beiden seriellen Devices gefunden und&lt;/li&gt;&lt;li&gt;nacheinander getestet werden (ein Modem antwortet auf „AT“ mit „OK“)&lt;/li&gt;&lt;li&gt;und dann sowohl für die AT-Befehle als auch für die PPP-Verbindung &lt;span style="font-family:courier new;"&gt;/dev/ttyUSB1&lt;/span&gt; ausgewählt wird.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Hier die interessanten Ausgaben:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Start iterating through all AutoDetectors&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  Let's continue with the next AutoDetector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: AutoDetectBase::go() for 'USB ZeroCD Autodetection'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::traverseTrees()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Checking USB device on 001:006&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::matchIDs(0x12d1, 0x1003)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: This is a known ZeroCD Device: "Huawei E220 / E800"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB_ZeroCD::findPortNames()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::findPortNames()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: looking for ttyUSB ports&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Found serial port number 1 with name 'ttyUSB0'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Found serial port number 2 with name 'ttyUSB1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: INFO: 'There are 2 ports available'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::traverseTrees()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Checking USB device on 001:006&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::matchIDs(0x12d1, 0x1003)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P2 t=372: GOOD: 'A 'Huawei E220 / E800' modem detected'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372:  AutoDetect_USB::findPortNames()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: looking for ttyUSB ports&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Found serial port number 1 with name 'ttyUSB0'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372:   Found serial port number 2 with name 'ttyUSB1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: INFO: 'There are 2 ports available'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Device: probing port '/dev/ttyUSB0' for AT commands&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: TempSerialPort::TempSerialPort()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Serial::openDev('/dev/ttyUSB0') as FD 7 - Serial instance 0xbfa4eec0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: Query sends the following mesage: 'AT'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P2 t=372: Device port '/dev/ttyUSB0': no response to "AT", return code 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Device: probing port '/dev/ttyUSB0' failed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: TempSerialPort::~TempSerialPort()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: SerialPort::closeDev() for FD 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Device: probing port '/dev/ttyUSB1' for AT commands&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: TempSerialPort::TempSerialPort()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Serial::openDev('/dev/ttyUSB1') as FD 7 - Serial instance 0xbfa4eec0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: Query sends the following mesage: 'AT'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: answer 1:'AT'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P4 t=372: answer 2:'OK'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Got Query::OK from port&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: Device: probing port '/dev/ttyUSB1' successful&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: TempSerialPort::~TempSerialPort()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: SerialPort::closeDev() for FD 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: set AT  serial to '/dev/ttyUSB1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=372: set PPP serial to '/dev/ttyUSB1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=373: Serial::openDev('/dev/ttyUSB1') as FD 7 - Serial instance 0x9ff3b70&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P2 t=373: GOOD: 'Device created successfully'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P1 t=373: Found hardware configuration stored to disk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=373: TheDeviceManagerSingleton::writeToConfigFile()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;##P3 t=373: Everything done - device created&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Könnte es also sein, dass man für die PPP-Verbindung &lt;span style="font-family:courier new;"&gt;/dev/ttyUSB&lt;span style="font-weight: bold;"&gt;0&lt;/span&gt;&lt;/span&gt; statt &lt;span style="font-weight: bold;font-family:courier new;" &gt;1 &lt;/span&gt;verwenden sollte? Die entsprechende Option beim Aufruf lautet:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;umtsmon -s/dev/ttyUSB1,/dev/ttyUSB0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Und siehe da... Internet!&lt;br /&gt;&lt;br /&gt;Damit man dies nicht andauernd eingeben muss, kann man es auch in der Konfiguration von UMTSmon dauerhaft ändern (zu finden unter&lt;span style="font-family:courier new;"&gt; ~/.umtsmon/umtsmonrc&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[device]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ATPortName=/dev/ttyUSB1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PPPPortName=/dev/ttyUSB0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Happy surfing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4635363943352459875?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4635363943352459875/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4635363943352459875' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4635363943352459875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4635363943352459875'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/09/der-lange-marsch-nach-huawei.html' title='Der lange Marsch nach Huawei'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wCX5P_aGQzo/Sq10TFLazsI/AAAAAAAAAEs/60piL5WX9CA/s72-c/vorderseite.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-7445722073556354515</id><published>2009-07-29T00:09:00.014+02:00</published><updated>2009-08-03T00:09:40.677+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Datenbanken'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Linux, Python und die MS-Access-Datenbank</title><content type='html'>Hier lag sie nun - ein Überbleibsel aus einer anderen Zeit und Welt. Eine Bilderdatenbank, die ich vor Jahren unter Windows mit dem bekannten Programm "Daumen Plus" erstellt hatte und deren Daten ich nun gerne nutzen wollte. Das Problem war das Format: MS-Access&lt;br /&gt;&lt;br /&gt;Dieses Format ist unter Linux nicht gerade gängig, der Zugriff  ist aber  - wenn auch nicht "out of the box" - durchaus möglich.&lt;br /&gt;&lt;br /&gt;Die hier beschriebenen Schritte beziehen sich auf eine Standardinstallation von Ubuntu Jaunty - sie dürften sich aber so oder ähnlich auch auf anderen Systemen nachvollziehen lassen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Der Treiber&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der eigentliche Treiber findet man im Paket &lt;span style="font-family:courier new;"&gt;libmdbodbc&lt;/span&gt;. Wie der Name schon andeutet, läuft der  Treiber  im &lt;a href="http://de.wikipedia.org/wiki/Open_Database_Connectivity"&gt; ODBC&lt;/a&gt;-Framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Die Schnittstelle&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;ODBC&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ODBC ist eine standardisierte Schnittstelle, in der auf der einen Seite Treiber wie Plugins die Verbindung zu den verschiedenen Datenbankentypen herstellen, und die auf der anderen Seite von Programmen - unabhängig vom Typ der Datenbank - immer in der gleichen Weise angesprochen werden können.&lt;br /&gt;&lt;br /&gt;ODBC ist in Jaunty  nicht standardmäßig installiert. Man braucht das Paket &lt;span style="font-family:courier new;"&gt;unixodbc&lt;/span&gt;. Zusätzlich sollte man noch &lt;span style="font-family:courier new;"&gt;unixodbc-dev &lt;/span&gt;holen, das wir weiter unten  brauchen.&lt;br /&gt;&lt;br /&gt;Zunächst muss man ODBC über das Vorhandensein des Treibers informieren. Die Treiber werden in Form sog. Templates eingerichtet. Hier das Template für MS Access.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[MDB]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Description             = Microsoft Access ODBC Driver&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Driver                  = /usr/lib/libmdbodbc.so.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Setup                   = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FileUsage               = 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CPTimeout               = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CPReuse                 = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;UsageCount              = 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es besagt, dass der Treiber &lt;span style="font-family:courier new;"&gt;libmdbodbc.so.0&lt;/span&gt; nun im ODBC-Framework unter dem Namen frei gewählten Namen &lt;span style="font-weight: bold;"&gt;MDB&lt;/span&gt; angesprochen werden kann.&lt;br /&gt;&lt;br /&gt;Speichern Sie dieses Template (z.B. unter derm Namen &lt;span style="font-family:courier new;"&gt;msaccess.template&lt;/span&gt;) und installieren Sie es mit dem folgenden Befehl:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;odbcinst -i -d -f msaccess.template&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Template wird in der Datei  &lt;span style="font-family:courier new;"&gt;/etc/odbcinst.ini&lt;/span&gt; abgelegt.  Diese Datei  im &lt;a href="http://de.wikipedia.org/wiki/Initialisierungsdatei"&gt;INI-Format&lt;/a&gt; könnte man natürlich auch von Hand editieren.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Die Datenquelle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eine Datenquelle fasst mehrere Parameter unter einem Namen (&lt;span style="font-weight: bold;"&gt;D&lt;/span&gt;ata &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;ource &lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;ame, DSN) zusammen. Diese Parameter könnten zwar auch beim Aufruf der Datenbank angegeben werden, aber der Parameterstring wird schnell sehr lang und seine Länge ist begrenzt.&lt;br /&gt;Unter einem DSN  werden in diesem Beispiel der verwendete Treiber, der Server und der Pfad zur Datenbank hinterlegt. Weitere Angaben sind je nach verwendetem Treiber möglich.&lt;br /&gt;&lt;br /&gt;Das Verfahren ähnelt dem Einrichten des Treibers. Hier ein Beispiel:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[bilderdb]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Description             = Bilder-Datenbank&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Driver                  = MDB&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Database                = /home/mike/fotos.mdb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Servername              = localhost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;UserName                = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Password                = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Port                    = 5432&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Abgespeichert in einer Textdatei mit dem Namen &lt;span style="font-family:courier new;"&gt;bilder.template&lt;/span&gt;, erfolgt die Installation entweder systemweit mit&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;odbcinst -i -s -l -f bilder.template&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;oder benutzerspezifisch mit&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;odbcinst -i -s -f bilder.template&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gespeichert wird diese Information in der INI-Datei  &lt;span style="font-family:courier new;"&gt;/etc/odbc.ini&lt;/span&gt; (systemweit) bzw.    &lt;span style="font-family:courier new;"&gt;~/.odbc.ini&lt;/span&gt; (benutzerspezifisch).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Zugriff via Python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zum Zugriff braucht man das Paket &lt;span style="font-family:courier new;"&gt;pyodbc&lt;/span&gt;. Das wiederum gibt es leider zurzeit nicht in einem  Ubuntu-Paket. Man muss es - wie früher - aus dem Quellcode kompilieren. Hierzu braucht man zum einen den &lt;a href="http://github.com/mkleehammer/pyodbc/tree/master"&gt;Sourcecode&lt;/a&gt; von &lt;span style="font-weight: bold;"&gt;pyodbc&lt;/span&gt; sowie  die oben erwähnte Datei &lt;span style="font-family:courier new;"&gt;unixodbc-dev&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Wer  das erste Mal selbst kompiliert, installiert noch &lt;span style="font-family:courier new;"&gt;build-essential&lt;/span&gt;, letzteres ist  wieder bequem über &lt;span style="font-family:courier new;"&gt;apt-get&lt;/span&gt; oder Synaptic aus den Ubuntu-Archiven verfügbar.&lt;br /&gt;&lt;br /&gt;Das pyodbc-Archiv muss entpackt werden. Danach begibt man sich in das beim Auspacken angelegte Verzeichnis und gibt&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo python setup.py build install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ein. Das war es schon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Kurze Zusammenfassung:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aus den Ubuntu-Repositories braucht man:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;build-essential&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;unixodbc-dev&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;unix-odbc&lt;/span&gt; und &lt;span style="font-family:courier new;"&gt;libmdbodbc&lt;/span&gt;.&lt;br /&gt;Aus dem Web:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pyodbc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Und los geht's&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;import odbc&lt;br /&gt;&lt;br /&gt;con = pyodbc.connect("DSN=bilderdb")&lt;br /&gt;cursor = con.cursor()&lt;br /&gt;cursor.execute("sinnvoller SQL-Befehl")&lt;br /&gt;result = cursor.fetchone()&lt;/pre&gt;&lt;br /&gt;Jedem, der in Python mit Datenbanken zu tun hatte, sollten diese Zeilen bekannt vorkommen.&lt;br /&gt;&lt;br /&gt;Die bei &lt;span style="font-family:courier new;"&gt;connect&lt;/span&gt; verwendete Zeichenkette, die in diesem Beispiel nur auf eine Datenquelle (DSN) verweist, kann viele andere Parameter aufnehmen, z.B. Username und Passwort bei einer passwortgeschützten Datenbank:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;con = pyodbc.connect("DSN=bilderdb;UID=name;PWD=passwort")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die einzelnen Parameter werden, durch Semikolon getrennt, in der Form &lt;span style="font-family:courier new;"&gt;Attribut=Wert&lt;/span&gt; aneinandergereiht. Die Namen der Attribute hängen vom verwendeten Treiber ab und sind recht &lt;a href="http://www.devlist.com/ConnectionStringsPage.aspx"&gt;vielfältig&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Zum Schluss noch ein paar nützliche Tipps beim Erkunden einer MS-Access-Datenbank:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Liste der Tabellen in einer Datenbank&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import pyodbc&lt;br /&gt;&lt;br /&gt;con = pyodbc.connect('DSN=bilderdb')&lt;br /&gt;cursor = con.cursor()&lt;br /&gt;&lt;br /&gt;for row in cursor.table():&lt;br /&gt;print row&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Die Zeilen haben den Aufbau (Werte: String oder &lt;span style="font-family:courier new;"&gt;None&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;table_cat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;table_schem&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;table_name              Name der Tabelle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;table_type               SYSTEM TABLE, VIEW, TABLE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die eigentlichen Tabellen werden unter dem Typ &lt;span style="font-family:courier new;"&gt;TABLE&lt;/span&gt; aufgelistet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aufbau einer Tabelle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dieser lässt sich mit dem normalen SQL-Befehl erfragen:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cursor.execute('DESCRIBE TABLE tablenname")&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Das Ergebnis wird in der Form (Name, Type, Größe) zurückgegeben.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-7445722073556354515?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/7445722073556354515/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=7445722073556354515' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7445722073556354515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7445722073556354515'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/07/linux-python-und-die-ms-access.html' title='Linux, Python und die MS-Access-Datenbank'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-83132774407757683</id><published>2009-07-26T01:01:00.016+02:00</published><updated>2009-07-26T11:02:49.245+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><title type='text'>Webdav-Bug in Ubuntu Jaunty</title><content type='html'>Möchte man das Mediacenter vom GMX nutzen, so hat man mehrere Optionen, die Daten zum GMX-Server zu übertragen und dort zu verwalten (löschen, umbenennen usw.).&lt;br /&gt;&lt;br /&gt;Zum einen den  klassischen Weg über das Web-Interface mit Javascript, oder - sehr viel einfacher - über Webdav.&lt;br /&gt;&lt;br /&gt;Mit Webdav lässt sich der Webspace so einbinden, als wäre er ein normaler Ordner, auf den man dann mit den normalen Funktionen des Betriebssystems zugreifen kann. In der Windows-Welt ist diese Funktion als "Webordner" bekannt.&lt;br /&gt;&lt;br /&gt;Zum Einbinden sind die folgenden Informationen nötig:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adresse: &lt;span style="font-style: italic;"&gt;mediacenter.gmx.net&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Username: &lt;span style="font-style: italic;"&gt;die GMX-Kundennummer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Passwort: &lt;span style="font-style: italic;"&gt;das GMX E-Mail-Passwort&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Die Kommunikation kann verschlüsselt  oder unverschlüsselt  erfolgen. Da bei Webdav das Passwort (hier ist es sogar das E-Mail-Passwort)  bei jedem Zugriff quasi unverschlüsselt übertragen wird, sollte man die Kommunikation als Ganzes absichern und die Option "dav&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;:" bzw. "http&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;:" wählen.&lt;br /&gt;&lt;br /&gt;Unter Gnome gibt es diverse Möglichkeiten eine Verbindung zu einem Webdav-Server herzustellen. Am häufigsten dürfte wohl "Verbindung zu Server" im Menü "Orte" eingesetzt werden.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwWC2aETFI/AAAAAAAAAC8/4xirRixaCvg/s1600-h/cts1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 253px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwWC2aETFI/AAAAAAAAAC8/4xirRixaCvg/s400/cts1.png" alt="" id="BLOGGER_PHOTO_ID_5362685494511815762" border="0" /&gt;&lt;/a&gt;Wenn man diesen Menüpunkt aufruft, öffnet sich ein Fenster, in dem man das Protokoll ("sicheres WebDAV"),&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/SmwXH8bnDMI/AAAAAAAAADU/Dqjg9xnyvAw/s1600-h/cts2b.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 346px;" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/SmwXH8bnDMI/AAAAAAAAADU/Dqjg9xnyvAw/s400/cts2b.png" alt="" id="BLOGGER_PHOTO_ID_5362686681539873986" border="0" /&gt;&lt;/a&gt;  den Server und den Benutzernamen eingeben kann.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwXSzsY1EI/AAAAAAAAADc/DvJf1lrqHGo/s1600-h/cts3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 327px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwXSzsY1EI/AAAAAAAAADc/DvJf1lrqHGo/s400/cts3.png" alt="" id="BLOGGER_PHOTO_ID_5362686868172887106" border="0" /&gt;&lt;/a&gt;Nach einem Klick auf "Verbinden" öffnet sich erwartungsgemäß ein weiteres Fenster, das nach dem Passwort fragt...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwX5fwSb2I/AAAAAAAAADs/rUMxlNYNmfg/s1600-h/cts4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 228px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwX5fwSb2I/AAAAAAAAADs/rUMxlNYNmfg/s400/cts4.png" alt="" id="BLOGGER_PHOTO_ID_5362687532835434338" border="0" /&gt;&lt;/a&gt;und nach dessen Eingabe erscheint in "Ubuntu Jaunty" eine Fehlermeldung, die sich über eine nicht korrekte Identifizierung beklagt.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwXm6swGFI/AAAAAAAAADk/a-aD_ZgaYRo/s1600-h/cts5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 154px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwXm6swGFI/AAAAAAAAADk/a-aD_ZgaYRo/s400/cts5.png" alt="" id="BLOGGER_PHOTO_ID_5362687213650843730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dies scheint ein Bug in der augenblicklichen Gnome-Version zu sein, unter Ubuntu Hardy und Intrepid arbeitet dieser Menüpunkt korrekt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Der Work-Around&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Einfach &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;keinen&lt;/span&gt; Usernamen im ersten Fenster eintragen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/SmwYLFkuftI/AAAAAAAAAD0/qmJ-NNw5Lag/s1600-h/cts6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 327px;" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/SmwYLFkuftI/AAAAAAAAAD0/qmJ-NNw5Lag/s400/cts6.png" alt="" id="BLOGGER_PHOTO_ID_5362687835045265106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In diesem Fall wird in der zweiten Abfrage nach Usernamen &lt;span style="font-weight: bold;"&gt;und&lt;/span&gt; Passwort gefragt.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SmwYVsNHMdI/AAAAAAAAAD8/AHQyOzfNIhA/s1600-h/cts8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 261px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SmwYVsNHMdI/AAAAAAAAAD8/AHQyOzfNIhA/s400/cts8.png" alt="" id="BLOGGER_PHOTO_ID_5362688017213895122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nach deren korrekten Eingabe öffnet sich dann das gewünschte Nautlius-Fenster.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SmwYew3NjcI/AAAAAAAAAEE/1LLCip6Yq6U/s1600-h/cts9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 302px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SmwYew3NjcI/AAAAAAAAAEE/1LLCip6Yq6U/s400/cts9.png" alt="" id="BLOGGER_PHOTO_ID_5362688173083037122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ähnlich verhält es sich mit bei der zweiten Möglichkeit Webdav-Server anzusprechen:&lt;br /&gt;&lt;br /&gt;Man gibt in der Adresszeile eines Nautilus-Fensters&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; davs://mediacenter.gmx.net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ein, statt einer URI mit Username:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; davs://&lt;span style="font-weight: bold;"&gt;username@&lt;/span&gt;mediacenter.gmx.net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SmwZZh8Le_I/AAAAAAAAAEM/66gn3Gs_jpo/s1600-h/cts10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 238px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SmwZZh8Le_I/AAAAAAAAAEM/66gn3Gs_jpo/s400/cts10.png" alt="" id="BLOGGER_PHOTO_ID_5362689182689623026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Die Ergebnisse und Fehlermeldungen sind entsprechend.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Und warum?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Schaut man sich mit einem Paket-Sniffer die Kommunikation zwischen Gnome und GMX an, dann läuft diese  im Fall ohne Angabe des Usernamens wie folgt ab:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Gnome sendet eine OPTIONS-Abfrage an GMX, ohne Username und Passwort.&lt;/li&gt;&lt;li&gt; GMX antwortet mit dem Fehler &lt;span style="font-family: courier new;"&gt;401&lt;/span&gt; (Nicht authentifiziert) und Angabe eines sog. Realms.&lt;/li&gt;&lt;li&gt; Gnome fordert den Usernamen und das Passwort vom Benutzer an und&lt;/li&gt;&lt;li&gt; sendet eine erneute OPTIONS-Abfrage, diemal mit Username + Passwort.&lt;/li&gt;&lt;li&gt; GMX sendet ein OK (&lt;span style="font-family: courier new;"&gt;200&lt;/span&gt;) - und es folgt der normale Datenaustausch.&lt;/li&gt;&lt;/ol&gt;Gibt man hingegen den Username vorher an, so sind Schritt 1 und 2 identisch.&lt;br /&gt;In Schritt 3 wird nur noch das Passwort abgefragt.&lt;br /&gt;Schritt 4 fehlt, und deshalb gibt es auch keinen Schritt 5.&lt;br /&gt;Nur eine Fehlmeldung von Gnome, dass es nicht geklappt hat.&lt;br /&gt;&lt;br /&gt;Der Bug ist unterdessen gemeldet. Bis dahin halt den Usernamen nicht direkt angeben.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-83132774407757683?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/83132774407757683/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=83132774407757683' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/83132774407757683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/83132774407757683'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/07/webdav-bug-in-ubuntu-jaunty.html' title='Webdav-Bug in Ubuntu Jaunty'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wCX5P_aGQzo/SmwWC2aETFI/AAAAAAAAAC8/4xirRixaCvg/s72-c/cts1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4587780707957119888</id><published>2009-07-14T01:52:00.015+02:00</published><updated>2009-07-15T01:21:43.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Multimedia'/><title type='text'>Eigene Videos auf das Cybershot</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SlyyqXi3tgI/AAAAAAAAACM/EH0qmBl-4M0/s1600-h/sony_kl.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 188px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SlyyqXi3tgI/AAAAAAAAACM/EH0qmBl-4M0/s320/sony_kl.jpg" alt="" id="BLOGGER_PHOTO_ID_5358354097608570370" border="0" /&gt;&lt;/a&gt;Das Handy Sony Ericsson Cybershot C902 ist  keine eierlegende Wollmilchsau (auch &lt;a href="http://de.wikipedia.org/wiki/Eierlegende_Wollmilchsau"&gt;Eier legende Wollmilchsau&lt;/a&gt;) wie das iPhone - sondern eher zum Telefonieren gedacht.&lt;br /&gt;&lt;br /&gt;Nun gut - ein paar Multimedia- und Organizer-Funktionen hat es dann doch, sowie  einen 5 Megapixel-Fotosensor, und es kann Videos aufnehmen und wiedergeben.&lt;br /&gt;&lt;br /&gt;Die Handhabung ist ... &lt;a href="http://www.netzwelt.de/news/77929-test-sony-ericsson-cybershot-c902.html"&gt;naja&lt;/a&gt; - aber hier geht es ja um...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Die Zusammenarbeit mit Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Kamera wird unter Linux über das mitgelieferte USB-Kabel als Standard-Massenspeicher erkannt und wie ein normaler USB-Stick behandelt, was den Datentransport sehr beschleunigt. Und seitdem unter Ubuntu Jaunty die Bluetooth-Treiber wieder funktionieren, klappt der Datenaustausch auch drahtlos.&lt;br /&gt;&lt;br /&gt;Als Videoformate können 3GP- und MP4-Dateien wiedergegeben werden. Das Display hat 320 x 240 Pixel. Was die Bildgröße der Videos angeht, so skaliert und dreht das Handy (es hat einen Lagesensor) den wiedergegeben Clip, wenn dieser größer oder kleiner als das Display ist.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Erstellen einer MP4-Datei über die Kommandozeile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ein auf verschiedenen Seiten empfohlener Workflow ist - das Codieren mit &lt;span style="font-style: italic;"&gt;mencoder&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;mencoder input_file \&lt;br /&gt;-vf scale=320:240 \&lt;br /&gt;-ovc lavc -lavcopts vcodec=&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;mpeg4&lt;/span&gt;&lt;span style="font-size:100%;"&gt;:vbitrate=&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;300&lt;/span&gt;&lt;span style="font-size:100%;"&gt; \&lt;br /&gt;-ofps &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;25&lt;/span&gt;&lt;span style="font-size:100%;"&gt; \&lt;br /&gt;-oac &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;faac&lt;/span&gt;&lt;span style="font-size:100%;"&gt; -faacopts br=&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;64&lt;/span&gt;&lt;span style="font-size:100%;"&gt;:object=2 -channels &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;2&lt;/span&gt;&lt;span style="font-size:100%;"&gt; -srate &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;44100&lt;/span&gt;&lt;span style="font-size:100%;"&gt; \&lt;br /&gt;-o output.avi&lt;/span&gt;&lt;/pre&gt;Dieser Aufruf skaliert das Video auf 320x240 Pixel, codiert es als &lt;span style="font-weight: bold;"&gt;mpeg4&lt;/span&gt; mit einer Bitrate von &lt;span style="font-weight: bold;"&gt;300&lt;/span&gt; kbps und &lt;span style="font-weight: bold;"&gt;25&lt;/span&gt; Bildern pro Sekunde. Das Audio wird mit &lt;span style="font-weight: bold;"&gt;AAC&lt;/span&gt; codiert (hierzu muss ggf. das Paket &lt;span style="font-family:courier new;"&gt;libfaac0&lt;/span&gt; nachinstalliert werden).  Audioeinstellungen: Bitrate  &lt;span style="font-weight: bold;"&gt;64&lt;/span&gt; kbps, Stereo (&lt;span style="font-weight: bold;"&gt;2&lt;/span&gt; Kanäle) und eine Samplerate von &lt;span style="font-weight: bold;"&gt;44100&lt;/span&gt; Hz.&lt;br /&gt;&lt;br /&gt;Weil &lt;span style="font-style: italic;"&gt;mencoder&lt;/span&gt; angeblich kein normgerechtes MP4 erzeugen kann, wird das Ergebnis zunächst als AVI gespeichert, und im nächsten Schritt mit &lt;span style="font-style: italic;"&gt;mplayer&lt;/span&gt; wieder in eine Video- und eine Audio-Datei getrennt:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;mplayer output.avi -dumpvideo -dumpfile temp.mp4v&lt;br /&gt;mplayer output.avi -dumpaudio -dumpfile temp.aac&lt;/span&gt;&lt;/pre&gt;Diese werden  dann mit dem Programm &lt;span style="font-style: italic;"&gt;mp4creator&lt;/span&gt; (aus dem Paket&lt;span style="font-family:courier new;"&gt; mpeg4ip-server&lt;/span&gt;) wieder zusammengefügt - diesmal normgerecht:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rm output.mp4&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;mp4creator -r &lt;span style="font-weight: bold;"&gt;25&lt;/span&gt; -c temp.mp4v output.mp4&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;mp4creator -c temp.aac output.mp4&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;mp4creator -optimize output.mp4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Ergebnis ist dann eine  MP4-Datei, die vom C902 wiedergegeben werden kann. Die Bildrate (in diesem Beispiel 25 fps) muss hier  explizit angegeben werden.&lt;br /&gt;&lt;br /&gt;Man kann mit den Werten ein wenig spielen und z.B.  die Audio-Abtastrate an das Quellmaterial anpassen. 300 kbps für Video und 64 kbps für Audio liefern für die Wiedergabe auf dem Handy brauchbare Ergebnisse.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Erstellen der MP4-Datei mit Avidemux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://avidemux.org/"&gt;&lt;span style="font-style: italic;"&gt;Avidemux&lt;/span&gt;&lt;/a&gt; ist ein Videokonvertier-Programm mit einigen rudimentären Schnittmöglichkeiten und diversen Bearbeitungsoptionen. Es lässt sich meist über das Repository der jeweiligen Distribution nachinstallieren.&lt;br /&gt;&lt;br /&gt;Im Programm selber nimmt man dann - in Anlehnung an die von &lt;span style="font-style: italic;"&gt;mencoder&lt;/span&gt; verwendeten Werte - folgende Grundeinstellungen vor:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/Slz0D2xWalI/AAAAAAAAACk/QRu8kOCmCzc/s1600-h/domp401.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 269px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/Slz0D2xWalI/AAAAAAAAACk/QRu8kOCmCzc/s400/domp401.png" alt="" id="BLOGGER_PHOTO_ID_5358426003743337042" border="0" /&gt;&lt;/a&gt;Video: MPEG-4 ASP&lt;br /&gt;Audio: AAC (FAAC)&lt;br /&gt;Format: MP4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Video - Konfigurieren&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/Slz0fV4e_3I/AAAAAAAAACs/3dscCUayeYk/s1600-h/domp402.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 224px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/Slz0fV4e_3I/AAAAAAAAACs/3dscCUayeYk/s400/domp402.png" alt="" id="BLOGGER_PHOTO_ID_5358426475951226738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Benutzerschnittstelle&lt;br /&gt;Kodier-Modus:&lt;br /&gt;Einfacher/zweifacher Durchlauf mit (Durchschnitts-)Bitrate&lt;br /&gt;&lt;br /&gt;Bitrate (kb/s): 300&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Audio - Konfigurieren&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wCX5P_aGQzo/Slz0ubChDNI/AAAAAAAAAC0/cZiUlcmmcCs/s1600-h/domp403.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 268px; height: 131px;" src="http://1.bp.blogspot.com/_wCX5P_aGQzo/Slz0ubChDNI/AAAAAAAAAC0/cZiUlcmmcCs/s400/domp403.png" alt="" id="BLOGGER_PHOTO_ID_5358426735033519314" border="0" /&gt;&lt;/a&gt;Konfigurieren:&lt;br /&gt;Bitrate: 64 kb/s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nun können auch die restlichen Filter und Bearbeitungsfunktonen zum Einsatz kommen. z.B. das Zuschneiden des Clips, Änderungen in der Bildgröße, De-Inferlace-Funktionen, Anlegen neuer Tonspuren, um nur einige zu nennen.&lt;br /&gt;&lt;br /&gt;Das Ergebnis ist nach einem "Datei - Speicher - Video speichern" direkt auf dem C902 einsetzbar.&lt;br /&gt;&lt;br /&gt;Und sollte die Wiedergabe des Videos das Handy einmal zum Absturz bringen - die Batterie lässt sich ja einfach aus- und wieder einbauen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4587780707957119888?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4587780707957119888/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4587780707957119888' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4587780707957119888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4587780707957119888'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/07/eigene-videos-auf-das-cybershot.html' title='Eigene Videos auf das Cybershot'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wCX5P_aGQzo/SlyyqXi3tgI/AAAAAAAAACM/EH0qmBl-4M0/s72-c/sony_kl.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6756045774227311542</id><published>2009-07-12T12:40:00.004+02:00</published><updated>2009-07-12T13:33:18.950+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox 3.5 in Ubuntu (AMD 64)</title><content type='html'>Nun sollte es aber auch jeder mitbekommen haben... Die endgültige Version von Firefox 3.5 ist fertig.&lt;br /&gt;&lt;br /&gt;Und da, wie zuletzt &lt;a href="http://tuxpool.blogspot.com/2009/06/die-kehrseite-der-haufigen-ubuntu.html"&gt;berichtet&lt;/a&gt;, bei der jetzigen Ubuntu-Version (Jaunty) nicht damit zu rechnen ist, dass ein Update verfügbar wird... auf zu &lt;a href="http://www.mozilla.org/"&gt;mozilla.org&lt;/a&gt;, Firefox runtergeladen, läuft...&lt;br /&gt;&lt;br /&gt;... wenn da nicht die Flash-Integration wäre. Die ist auf AMD64-Systemen nämlich ohne Tricks nicht so einfach zu haben.&lt;br /&gt;&lt;br /&gt;Das Flash-Plugin von Adobe gibt es nur in 32 Bit, und läuft ohne weiteres nicht in 64-Bit-Versionen von Firefox. Dafür gibt es dann den &lt;span style="font-weight: bold;"&gt;npwrapper&lt;/span&gt;, mit dem dann 32-Bit-Plugins auch im 64-Bit-Firefox laufen.&lt;br /&gt;&lt;br /&gt;Und auch wenn der Firefox von mozilla.org eine 32-Bit-Version war, so erkannte das von Adobe geladene Installationsprogramm für Flash eine 64-Bit-Umgebung, und brach ab.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aber es geht auch einfacher&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;Christoph Langner fasst in seinem Blog die Möglichkeiten in einem &lt;a href="http://linuxundich.de/de/2009/07/die-ubuntu-firefox-3-5-faq/"&gt;FAQ&lt;/a&gt; zusammen. Im Fall von Jaunty ist es besonders einfach - es gibt bereits ein Paket mit dem Namen "firefox-3.5". Dieser übernimmt auch die bestehenden Einstellungen (inklusive der Plugins).&lt;br /&gt;&lt;br /&gt;Eine detaillierte Liste der installierten Plugins gibt es im übrigen mit der Eingabe &lt;span style="font-family:courier new;"&gt;about:plugins&lt;/span&gt; in der Adress-Zeile.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SlnJx6w3bRI/AAAAAAAAACE/LDKteHLc6FA/s1600-h/plugin1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 176px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SlnJx6w3bRI/AAAAAAAAACE/LDKteHLc6FA/s320/plugin1.png" alt="" id="BLOGGER_PHOTO_ID_5357535091158904082" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6756045774227311542?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6756045774227311542/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6756045774227311542' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6756045774227311542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6756045774227311542'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/07/firefox-35-in-ubuntu-amd-64.html' title='Firefox 3.5 in Ubuntu (AMD 64)'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wCX5P_aGQzo/SlnJx6w3bRI/AAAAAAAAACE/LDKteHLc6FA/s72-c/plugin1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-6867903560095143393</id><published>2009-06-19T22:20:00.005+02:00</published><updated>2009-06-19T23:25:02.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><title type='text'>eth-Null bleibt eth-Null bleibt eth-Null</title><content type='html'>In früheren Linux-Versionen hatte man in Systemen mit mehreren Ethernet-Netzwerkkarten hin und wieder das Problem, dass sich die &lt;span style="font-family: courier new;"&gt;eth&lt;/span&gt;-Gerätenummer z.B. nach einem Kernel-Update änderte, weil die Reihenfolge, in der Treiber aufgerufen wurden, auf einmal anders war.&lt;br /&gt;&lt;br /&gt;Funktionen, die auf diesen Gerätenummern aufbauten - wie z.B. iptables-Firewalls - bringt dies natürlich durcheinander; und man hat sich unter Umständen ausgesperrt. Wenn der Computer dann nicht so einfach zugänglich ist,  ist das... unangenehm.&lt;br /&gt;&lt;br /&gt;Bei neueren, auf &lt;span style="font-weight: bold;"&gt;udev&lt;/span&gt; basierenden Systemen passiert das nicht mehr. Das System merkt sich die MAC-Adresse der Karte und weist ihr fest einen Gerätenamen zu. Das Ergebnis sind udev-Regeln, die man in &lt;span style="font-weight: bold;"&gt;/etc/udev/rules.d/70-persistent-net.rules * &lt;/span&gt;finden kann:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# PCI device 0x10de:0x0057 (forcedeth)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Diese Datei ist Ergebnis des Scripts &lt;span style="font-weight: bold;"&gt;/lib/udev/write_net_rules&lt;/span&gt; welches seinerseit von der udev-Regel &lt;span style="font-weight: bold;"&gt;/etc/udev/rules.d/75-persistent-net-generator.rules&lt;/span&gt; gestartet wird. (Beispiele aus Ubuntu Hardy).&lt;br /&gt;&lt;br /&gt;In anderen Systemen, stehen diese Dateien teilweise in anderen Verzeichnissen, und die Nummer im Dateiname ist leicht verändert. Mit &lt;span style="font-family: courier new;"&gt;locate&lt;/span&gt; lassen sie sich aber leicht finden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-6867903560095143393?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/6867903560095143393/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=6867903560095143393' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6867903560095143393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/6867903560095143393'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/06/eth-null-bleibt-eth-null-bleibt-eth.html' title='eth-Null bleibt eth-Null bleibt eth-Null'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-3837365730067313961</id><published>2009-06-16T00:10:00.003+02:00</published><updated>2009-06-16T00:43:01.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Die Kehrseite der häufigen Ubuntu-Releases</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ubuntu.com/"&gt;&lt;img style="cursor: pointer; width: 57px; height: 55px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SjbG96WDmLI/AAAAAAAAAB8/pxknhIWspig/s320/logo.png" alt="" id="BLOGGER_PHOTO_ID_5347680374485129394" border="0" /&gt;&lt;/a&gt;Kehrseite der halbjährlichen Ubuntu-Releases ist die Tatsache, das während eines Release-Zyklus zwar Sicherheitsupdates veröffentlicht werden, Feature-Updates oder nicht sicherheitsrelevante Fehler frühestens mit dem nächsten Release behoben werden.&lt;br /&gt;&lt;br /&gt;War es im vorletzten Release (Intrepid)  - wegen Änderungen im Bluetooth-Stack - der nicht mehr funktionierende Bluetooth-Dongle, so schmerzen die beiden Bugs in Jaunty dann doch:&lt;br /&gt;&lt;br /&gt;In OpenOffice verschwinden plötzlich Tabellen aus Word-Dokumenten, und Inkscape lässt sich nach dem Update wegen Durcheinander in den zu ladenden Bibliotheken nicht mehr starten.&lt;br /&gt;&lt;br /&gt;Diese beiden Fehler treten bei mir nur in der wohl nicht so weit verbreiteten 64-Bit-Versionen auf und sollen teilweise schon behoben sein.&lt;br /&gt;&lt;br /&gt;Auch wenn der Besuch auf dem Ubuntu-Bugtracker-Portal &lt;a href="https://launchpad.net/"&gt;Launchpad&lt;/a&gt; einem das warme Gefühl vermittelt, dass man mit dem Problem nicht allein ist,  dem Durchschnitts-Ubuntuaner (oder heißen Sie Ubuntuniken...) also dem Durchschnitts-Ubunter-User werden diese Updates wohl frühestens ab Oktober mit Karmic zur Verfügung stehen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-3837365730067313961?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/3837365730067313961/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=3837365730067313961' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/3837365730067313961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/3837365730067313961'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/06/die-kehrseite-der-haufigen-ubuntu.html' title='Die Kehrseite der häufigen Ubuntu-Releases'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wCX5P_aGQzo/SjbG96WDmLI/AAAAAAAAAB8/pxknhIWspig/s72-c/logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-7789525713831559713</id><published>2009-06-08T09:07:00.004+02:00</published><updated>2009-06-08T09:32:35.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox - online auch ohne Internet</title><content type='html'>Es kommt zwar selten vor, aber hin und wieder betreibe ich meinen Ubuntu-Laptop auch ohne Verbindung zum Internet. Unterwegs - z.B. beim Erste-Hilfe-Einsatz als Computer-Doktor - ist der Zugriff auf die Laptop-Kopie meines Wikis recht nützlich.&lt;br /&gt;&lt;br /&gt;Wenn eine Netzwerkverbindung fehlt schaltet Firefox in den Offline-Modus. Auf einen im Laptop laufenden Apache-Server kann &lt;span style="font-style: italic; font-weight: bold;"&gt;so&lt;/span&gt; nicht zugegriffen werden.&lt;br /&gt;&lt;br /&gt;Natürlich kann man nun mit "Datei - Offline arbeiten" diesen Modus wieder ausschalten. Auf die Dauer nervt diese Zwischenschritt; deshalb hier die Option, wie man ihn umgehen kann:&lt;br /&gt;&lt;br /&gt;Mit der Eingabe &lt;span style="font-family:courier new;"&gt;about:config&lt;/span&gt; in der Adresszeile zeigt Firefox seine diversen Konfigurations-Optionen an, die so selten gebraucht werden, dass sich ein eigenes Panel dafür nicht lohnt. Hier sucht man nun nach&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;toolkit.networkmanager.disable&lt;/pre&gt;&lt;br /&gt;und setzt die Option auf &lt;span style="font-family: courier new;"&gt;True&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Man kann sich die Suche erleichtern, wenn man z.B. &lt;span style="font-family: courier new;"&gt;toolkit&lt;/span&gt; als Filterausdruck eingibt.&lt;br /&gt;&lt;br /&gt;Hiermit wird Firefox angewiesen den Netzwerkstatus &lt;span style="font-weight: bold;"&gt;nicht&lt;/span&gt; beim Networkmanager zu erfragen und bleibt deshalb immer im Online-Modus. Das als Startseite konfigurierte Wiki wird nun direkt angezeigt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-7789525713831559713?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/7789525713831559713/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=7789525713831559713' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7789525713831559713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7789525713831559713'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/06/firefox-online-auch-ohne-internet.html' title='Firefox - online auch ohne Internet'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-1802012513933469551</id><published>2009-06-06T00:19:00.002+02:00</published><updated>2009-06-06T00:46:21.045+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>ng-upnp2mrtg Version 0.2.3 freigegeben</title><content type='html'>Das Dienstprogramm &lt;a href="http://ng-upnp2mrtg.sourceforge.net/"&gt;ng-upnp2mrtg&lt;/a&gt; zur Abfrage von Byte-Countern in UPNP-Routern ist nun in Version 0.2.3 verfügbar.&lt;br /&gt;&lt;br /&gt;Neu in dieser Version ist die Option&lt;span style="font-family: courier new;"&gt; --nowrap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Beim Neuaufbau von Verbindungen (z.B. nach einer Zwangstrennung) setzen Modems häufig die Empfangs- und Sende-Zählerstände auf Null zurück.  MRTG interpretiert dies als 32-Bit-Zählerüberlauf, was in der grafischen Darstellung zu einer Spitze führt. Diese lässt sich auch durch andere MRTG-Optionen nicht sicher verhindern.&lt;br /&gt;&lt;br /&gt;Wenn diese ng-upnp2mrtg-Option gesetzt ist, werden die Zählerstände vom Skript zwischengespeichert und nach einem Reset als Offset bei allen nachfolgenden Ausgaben hinzuaddiert.&lt;br /&gt;&lt;br /&gt;Ohne diese Spitzen kann die Funktion zur automatischen Skalierung wieder richtig arbeiten.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-1802012513933469551?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/1802012513933469551/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=1802012513933469551' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1802012513933469551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/1802012513933469551'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/06/ng-upnp2mrtg-version-023-freigegeben.html' title='ng-upnp2mrtg Version 0.2.3 freigegeben'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4225956415174777080</id><published>2009-05-09T00:17:00.005+02:00</published><updated>2009-05-09T00:37:03.776+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='GnuPG'/><title type='text'>T-Mobile und GnuPG/PGP</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wCX5P_aGQzo/SgSyzrwJctI/AAAAAAAAAB0/0wc_IFsDWDU/s1600-h/text2509.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 114px;" src="http://2.bp.blogspot.com/_wCX5P_aGQzo/SgSyzrwJctI/AAAAAAAAAB0/0wc_IFsDWDU/s320/text2509.png" alt="" id="BLOGGER_PHOTO_ID_5333584459701252818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ab diesem Monat gibt es die Handy-Rechnung nicht mehr auf Papier – natürlich aus Umweltschutzgründen. Wohin die gesparten Druck- und Versandkosten fließen, bleibt ungenannt.&lt;br /&gt;&lt;br /&gt;Zu bekommen ist die Rechnung über das T-Mobile-Internet-Portal, aber auch der zusätzliche Versand per E-Mail ist vorgesehen. Diese E-Mail kann sogar mit PGP/GnuPG verschlüsselt werden. Falls der Rechnung noch der Einzelverbindungsnachweis beiliegen soll, ist die Verschlüsselung sogar zwingend vorgeschrieben.&lt;br /&gt;&lt;br /&gt;Den Masken zum Einrichten ist eine ausführliche Seite mit Anweisungen vorgeschaltet. Jeder der in der Lage ist, ein GnuPG/PGP-Schlüsselpaar zu generieren, den öffentlichen Schlüssel auszulagern und hochzuladen, wird mit der Beschreibung keine Probleme haben...&lt;br /&gt;&lt;br /&gt;Probleme hatte an diesem Tag hingegen der entsprechende Server bei T-Mobile, der den Versuch diese Konfiguration einzurichten mit einem „unbekannten Fehler“ quittierte. Zwar erhielt ich nach dem Einrichten die zugehörige verschlüsselte E-Mail mit der Bestätigung, der darin enthaltene Bestätigungscode wurde aber nicht angenommen. Unterdessen funktioniert aber auch das.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SgSvxq9aA1I/AAAAAAAAABs/xwLvFTXlmPc/s1600-h/telunknown1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SgSvxq9aA1I/AAAAAAAAABs/xwLvFTXlmPc/s320/telunknown1.png" alt="" id="BLOGGER_PHOTO_ID_5333581126593807186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So sehr man T-Mobile für eine der ersten realen Einsatzmöglichkeit für GnuPG/PGP danken möchte, ein weit verbreiteter Einsatz ist nicht zuletzt wegen des umständlichen Verfahrens unwahrscheinlich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4225956415174777080?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4225956415174777080/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4225956415174777080' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4225956415174777080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4225956415174777080'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/05/t-mobile-und-gnupgpgp.html' title='T-Mobile und GnuPG/PGP'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wCX5P_aGQzo/SgSyzrwJctI/AAAAAAAAAB0/0wc_IFsDWDU/s72-c/text2509.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5212194155467882904</id><published>2009-04-20T14:19:00.009+02:00</published><updated>2009-06-06T00:47:00.153+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>UPnP – Entdeckungsreise... zu Fuß</title><content type='html'>Für die im Folgenden beschrieben Abläufe gibt es sicher spezialisierte Programme. Das Ziel war aber ein &lt;span style="font-style: italic;"&gt;kurzes&lt;/span&gt; Skript, das von mrtg aufgerufen werden soll. Hierzu ist nur die Kenntnis einer Handvoll Strings notwendig, die in das Skript integriert werden müssen.&lt;br /&gt;&lt;br /&gt;Auch will ich hier nicht das UPnP-Protokoll vollständig wiedergeben. Vielmehr werden nur die Teile vorgestellt, die zur Abfrage von Werten (z.B. der Anzahl der übertragenen Bytes) benötigt werden.&lt;br /&gt;&lt;br /&gt;Mit diesen Kenntnissen sollte sich &lt;span style="font-family:courier new;"&gt;ng-upnp2mrtg&lt;/span&gt; eigentlich an alle UPnP-Modems, die die UPnP-Abfrage unterstützen anpassen lassen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Die eigentliche Abfrage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nachdem eine TCP-Verbindung zum UPnP-Server im Modem aufgebaut ist, erfolgt die Kommunikation nach dem HTTP-Protokoll.&lt;br /&gt;&lt;br /&gt;Schauen wir uns eine typische Abfrage an.&lt;br /&gt;&lt;br /&gt;Der Client sendet:&lt;br /&gt;&lt;pre&gt;POST /&lt;span style="font-weight: bold;"&gt;WANCommonInterfaceConfigService/control&lt;/span&gt; HTTP/1.0&lt;br /&gt;HOST: 192.168.0.1:49300&lt;br /&gt;CONTENT-LENGTH: 340&lt;br /&gt;CONTENT-TYPE: text/xml; charset="utf-8"&lt;br /&gt;SOAPACTION: "&lt;span style="font-weight: bold;"&gt;urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1&lt;/span&gt;#&lt;span style="font-weight: bold;"&gt;GetTotalBytesReceived&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;s:Envelope&lt;br /&gt;xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&lt;br /&gt;s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&amp;gt;&lt;br /&gt;&amp;lt;s:Body&amp;gt;&lt;br /&gt;&amp;lt;u:&lt;span style="font-weight: bold;"&gt;GetTotalBytesReceived&lt;/span&gt; xmlns:u="&lt;span style="font-weight: bold;"&gt;urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1&lt;/span&gt;"&amp;gt;&lt;br /&gt;&amp;lt;/u:&lt;span style="font-weight: bold;"&gt;GetTotalBytesReceived&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/s:Body&amp;gt;&lt;br /&gt;&amp;lt;/s:Envelope&amp;gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Die erste Zeile ist ein HTTP-Befehl (eine Methode, gefolgt von einer URL, gefolgt von der Protokollversion).&lt;/li&gt;&lt;li&gt;Ihr folgen einige Header-Zeilen in der Form 'Schlüssel: Wert'.&lt;/li&gt;&lt;li&gt;Eine Leerzeile trennt den Header von der eigentlichen Nachricht.&lt;/li&gt;&lt;li&gt;Diese liegt im XML-Format vor (SOAP).&lt;/li&gt;&lt;/ul&gt;Die interessanten variablen Teile sind fett dargestellt. Dies sind zum einen die URL in der ersten Zeile, und in der Zeile SOAPACTION den – nennen wir ihn – Dienstbezeichner (vor dem #-Zeichen mit '&lt;span style="font-family:courier new;"&gt;urn:schemas-upnp.org&lt;/span&gt;' beginnend) und die darauf anzuwendende Aktion (hinter dem #).&lt;br /&gt;&lt;br /&gt;Natürlich müssen auch die Werte für HOST und CONTENT-LENGTH angepasst werden. Sie haben die im HTTP-Protokoll definierten Bedeutungen und sind selbsterklärend.&lt;br /&gt;&lt;br /&gt;Die variablen Teile in der XML-Nachricht kennen wir schon aus dem Header.&lt;br /&gt;&lt;br /&gt;In der gleich TCP-Verbindung liefert der Server seine Antwort. Hier wieder ein typisches Beispiel:&lt;br /&gt;&lt;pre&gt;HTTP/1.1 200 OK&lt;br /&gt;EXT:&lt;br /&gt;CONTENT-TYPE: text/xml; charset="utf-8"&lt;br /&gt;SERVER: IAD, UPnP/1.0, MicroStack v1.0.2777&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"       xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;&lt;br /&gt;&amp;lt;s:Body&amp;gt;&lt;br /&gt;&amp;lt;u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"&amp;gt;&lt;br /&gt;  &amp;lt;NewConnectionStatus&amp;gt;Connected&amp;lt;/NewConnectionStatus&amp;gt;&lt;br /&gt;  &amp;lt;NewLastConnectionError&amp;gt;ERROR_NONE&amp;lt;/NewLastConnectionError&amp;gt;&lt;br /&gt;  &amp;lt;NewUptime&amp;gt;30864&amp;lt;/NewUptime&amp;gt;&lt;br /&gt;&amp;lt;/u:GetStatusInfoResponse&amp;gt;&lt;br /&gt;&amp;lt;/s:Body&amp;gt;&lt;br /&gt;&amp;lt;/s:Envelope&amp;gt; &lt;/pre&gt;Man erkennt eine Standard-HTTP-Antwort, mit dem HTTP-Ergebniscode in Zeile 1, weitere Headerzeilen, die unvermeidliche Leerzeile, gefolgt von Text, wieder im XML-Format. Im &amp;lt;u&amp;gt;-Tag selbst findet man wieder die Werte für Aktion und Dienst-Bezeichner. Der &amp;lt;u&amp;gt;-Tag umschließt die gewünschten Information, die ihrerseits von &amp;lt;tag&amp;gt; ...&amp;lt;/tag&amp;gt; eingeschlossen sind.&lt;br /&gt;&lt;br /&gt;Der Ergebniscode hat die bei HTTP definierte Bedeutung – kurz gesagt: &lt;span style="font-family:courier new;"&gt;200&lt;/span&gt; ist ok, bei allen anderen Werten muss man nachforschen.&lt;br /&gt;&lt;br /&gt;Um also eine bestimmte Information abzufragen braucht man:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IP-Adresse und Port-Nummer des UPnP-Servers&lt;/li&gt;&lt;li&gt;die URL&lt;/li&gt;&lt;li&gt;den Bezeichner für den Dienst bzw. das Gerät und die Aktion&lt;/li&gt;&lt;li&gt;sowie den Namen des Tags, in dem in der Antwort die gewünschte Information steht.&lt;/li&gt;&lt;/ul&gt;Die IP-Adresse ist meist mit der des Routers identisch, doch spätestens bei der Port-Nummer wird es schwierig. So verwendet die FritzBox Port 49000, das NetCologne-Modem hingegen Port 49300.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Der Weg in den Router&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Glücklicherweise werden diese Informationen – und noch einige mehr – vom UPnP-Server per UDP-Broadcast verbreitet. Standardmäßig wird dieser Broadcast an die IP-Adresse 239.255.255.250. Port 1900 gerichtet. Das Protokoll heißt &lt;a href="http://de.wikipedia.org/wiki/Simple_Service_Discovery_Protocol"&gt;SSDP&lt;/a&gt; (Simple Service Discovery Protocol).&lt;br /&gt;&lt;br /&gt;Die Pakete kann man z.B. mit Wireshark auffangen und decodieren. Grenzen Sie ggf. die Anzeige mit '&lt;span style="font-family:courier new;"&gt;ip.addr == a.b.c.d&lt;/span&gt;' auf die IP des Routers ein.&lt;br /&gt;&lt;br /&gt;Lassen Sie sich Zeit. Es kann einige Minuten dauern, bis die ersten SSDP-Pakete angezeigt werden. Untersuchen Sie den Text-Inhalt. Nach einiger Zeit wird dieser sich wiederholen, Sie sollten aber mehrere unterschiedliche Pakete finden.&lt;br /&gt;&lt;br /&gt;Hier der Textinhalt eines solchen Pakets&lt;br /&gt;&lt;pre&gt;NOTIFY * HTTP/1.1&lt;br /&gt;HOST: 239.255.255.250:1900&lt;br /&gt;LOCATION: http://192.168.0.99:49000/igddesc.xml&lt;br /&gt;SERVER: mynet UPnP/1.0 AVM FRITZ!Box WLAN 3170 49.04.57&lt;br /&gt;CACHE-CONTROL: max-age=1800&lt;br /&gt;NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1&lt;br /&gt;NTS: ssdp:alive&lt;br /&gt;USN: uuid:75802409-bccb-40e7-8e6c-001C4A50656D::urn:schemas-upnp-org:device:InternetGatewayDevice:1&lt;/pre&gt;Auch hier erkennt man wieder die HTTP-Struktur: eine Methode (NOTIFY), eine URL (*) (naja) und die Protokollversion, gefolgt von UPnP-Headern, die diverse nützliche Informationen enthalten.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LOCATION: eine URL mit einer XML-Datei, die die Dienste weiter beschreibt.&lt;/li&gt;&lt;li&gt;NT: den „Dienst-Bezeichner“&lt;/li&gt;&lt;li&gt;NTS: ssdp:alive = das Geräte meldet sich an; ssdp:byebye = das Gerät meldet sich ab&lt;/li&gt;&lt;li&gt;USN: nochmal der Name des Diensts, diesmal mit einer eindeutigen ID, die von Gerät zu Gerät unterschiedlich ist, auch wenn die Dienstnamen identisch sind.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Tell me more...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der nächste Schritt ist, die URL aus LOCATION in den Browser einzugeben. Ergebnis ist eine weitere XML-Datei. (Wenn Sie hierzu Firefox verwenden, wird die Datei übersichtlich formatiert dargestellt.) Interessant sind die Einträge unter &amp;lt;serviceList&amp;gt;, die an mehreren Stellen und in unterschiedlichen Ebenen im XML-Baum auftreten können:&lt;br /&gt;&lt;br /&gt;Hier ein Beispiel:&lt;br /&gt;&lt;pre&gt;...&lt;br /&gt;&amp;lt;serviceList&amp;gt;&lt;br /&gt;&amp;lt;service&amp;gt;&lt;br /&gt;&amp;lt;serviceType&amp;gt;urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1&amp;lt;/serviceType&amp;gt;&lt;br /&gt;&amp;lt;serviceId&amp;gt;urn:upnp-org:serviceId:WANCommonIFC1&amp;lt;/serviceId&amp;gt;&lt;br /&gt;&amp;lt;SCPDURL&amp;gt;WANCommonInterfaceConfigService/scpd.xml&amp;lt;/SCPDURL&amp;gt;&lt;br /&gt;&amp;lt;controlURL&amp;gt;WANCommonInterfaceConfigService/control&amp;lt;/controlURL&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/serviceList&amp;gt;&lt;/pre&gt;&lt;br /&gt;Unterhalb von &amp;lt;serviceList&amp;gt; findet man diverse Dienste mit &amp;lt;service&amp;gt; aufgelistet.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Der &amp;lt;serviceType&amp;gt; ist der Dienst-Bezeichner, den wir in der UPnP-Abfrage brauchen.&lt;/li&gt;&lt;li&gt;Die &amp;lt;controlURL&amp;gt; ist die URL für die UPnP-Abfrage (ohne vorangestellten Backslash).&lt;/li&gt;&lt;li&gt;&amp;lt;SCPDURL&amp;gt; verweist auf eine weitere XML-Datei, die die Aktionen näher beschreibt.&lt;/li&gt;&lt;/ul&gt;Stellen Sie der &amp;lt;SCPDURL&amp;gt; 'http://IP-Adresse:Port/' voran und geben Sie sie im Browser ein.&lt;br /&gt;&lt;br /&gt;In dieser XML-Datei findet sich unter &amp;lt;actionList&amp;gt; ein oder mehrere Einträge &amp;lt;action&amp;gt;. Eine Ebene tiefer finden sich &amp;lt;name&amp;gt; und die &amp;lt;argumentList&amp;gt; mit einem oder mehreren &amp;lt;argument&amp;gt; Einträgen. Und bei &amp;lt;argument&amp;gt; interessieren wir uns vor allem für &amp;lt;name&amp;gt; und &amp;lt;direction&amp;gt;.&lt;br /&gt;&lt;br /&gt;Prinzipieller Aufbau:&lt;br /&gt;&lt;pre&gt;&amp;lt;scpd&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;actionList&amp;gt;&lt;br /&gt;&amp;lt;action&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;Name_der_Aktion&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;argumentList&amp;gt;&lt;br /&gt;  &amp;lt;argument&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;ArgumentName_1&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;  &amp;lt;/argument&amp;gt;&lt;br /&gt;  &amp;lt;argument&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;ArgumentName_2&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;  &amp;lt;/argument&amp;gt;&lt;br /&gt;...&lt;br /&gt; &amp;lt;/argumentList&amp;gt;&lt;br /&gt;&amp;lt;/action&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/actionList&amp;gt;&lt;br /&gt;&amp;lt;/scpd&amp;gt;&lt;/pre&gt;&lt;br /&gt;Die Namen der Tags sind selbsterklärend. Interessant für eine Abfrage sind natürlich nur die Aktionen mit der &amp;lt;direction&amp;gt; out.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Der Name der &amp;lt;action&amp;gt; ist der Aktionsname für unsere Abfrage.&lt;/li&gt;&lt;li&gt;Der Name bei &amp;lt;argument&amp;gt; ist der Name des Tags bei der Antwort, der den entsprechenden Wert einklammert.&lt;/li&gt;&lt;/ul&gt;Somit hätten wir also alle Informationen zusammen, die wir für die Abfrage brauchen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Zum Abschluss&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Stellen in &lt;span style="font-family:courier new;"&gt;ng-upnp2mrtg&lt;/span&gt;, an denen diese Werte eingetragen werden müssen, sind im Quelltext einfach zu finden.&lt;br /&gt;Die Byte-Counter befinden sich meist in einer Aktion, die als Antwort die Tags „&lt;span style="font-family:courier new;"&gt;NewTotalBytesReceived&lt;/span&gt;“ und „&lt;span style="font-family:courier new;"&gt;NewTotalBytesReceived&lt;/span&gt;“ zurück gibt. Für die Verbindungsdauer sucht man am besten nach „&lt;span style="font-family:courier new;"&gt;NewUpTime&lt;/span&gt;“. Alle Werte werden bei einem Verbindungsaufbau zurückgesetzt, was bei &lt;a href="http://oss.oetiker.ch/mrtg/"&gt;MRTG&lt;/a&gt; leider einen Spike erzeugt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5212194155467882904?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5212194155467882904/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5212194155467882904' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5212194155467882904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5212194155467882904'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/04/upnp-entdeckungsreise-zu-fu.html' title='UPnP – Entdeckungsreise... zu Fuß'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-7782777127201636462</id><published>2009-04-15T23:42:00.002+02:00</published><updated>2009-04-15T23:46:15.929+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>ng-upnp2mrtg nun auf SourceForge</title><content type='html'>Das Projekt ng-upnp2mrtg wird ab heute auf &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=259289"&gt;SourceForge&lt;/a&gt; gehosted.&lt;br /&gt;&lt;br /&gt;Neuere Versionen sind künftig dort erhältlich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-7782777127201636462?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/7782777127201636462/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=7782777127201636462' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7782777127201636462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/7782777127201636462'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/04/ng-upnp2mrtg-nun-auf-sourceforge.html' title='ng-upnp2mrtg nun auf SourceForge'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-4236615586555731292</id><published>2009-04-02T23:08:00.010+02:00</published><updated>2009-05-09T00:48:01.600+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetCologne'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>NetCologne Premium-Modem und die Statusabfrage via UPnP</title><content type='html'>Sysadmins lieben schöne Bilder. Durch die grafische Darstellung des zeitlichen Verlaufs von Systemvariablen wie dem Durchsatz einer Internet-Verbindung oder der Temperaturen von Festplatten, fallen Veränderungen gegenüber der Norm meist recht schnell auf.&lt;br /&gt;&lt;br /&gt;Ein dafür sehr gern eingesetztes Werkzeug ist das Round Robin Database Tool &lt;a href="http://oss.oetiker.ch/rrdtool/"&gt;(RRDtool)&lt;/a&gt;  von Tobias Oetiker und der speziell für den Einsatz in Netzwerken angepasste Multi Router Traffic Grapher &lt;a href="http://oss.oetiker.ch/mrtg/"&gt;MRTG&lt;/a&gt; vom gleichen Author.&lt;br /&gt;&lt;br /&gt;MRTG beherrscht SNMP, das Protokoll mit dem sich bei industriell eingesetzten Netzwerkgeräten Statusmeldungen, wie eben die übertragene Datenmenge, abfragen lassen. Router für Endkunden besitzen diese Option meist nicht. Dafür beherrschen diese zunehmend UPnP (Universal Plug and Play). Dieser Standard wurde entwickelt, damit z.B. die Internet-fähige Stereoanlage den Internet-Router für ihre Bedürfnissen konfigurieren kann.&lt;br /&gt;&lt;br /&gt;Was die Internet-fähige Stereoanlage kann, können aber auch Schadprogramme, die den Router dann z.B. so programmieren können, dass der Rechner direkt von außen erreichbar wird. Deshalb ist diese Option bei den meisten sicherheitsbewussten Anwendern ausgeschaltet.&lt;br /&gt;&lt;br /&gt;Neben der Programmierung eines Routers sieht UPnP aber auch die Möglichkeit der Statusabfrage vor. Leider kann MRTG Daten nicht direkt über UPnP abfragen. In der Konfigurationsdatei &lt;span style="font-family:courier new;"&gt;/etc/mrtg.cfg&lt;/span&gt; kann jedoch unter &lt;span style="font-family:courier new;"&gt;Target[XXX]&lt;/span&gt; statt einer SNMP-OID ein Programm angegeben werden, das von MRTG aufgerufen wird, um die Daten zu ermitteln und an MRTG weiterzureichen (siehe auch „&lt;span style="font-family:courier new;"&gt;man mrtg-reference&lt;/span&gt;“). Für die weit verbreiteten Router der Marke FritzBox kommt hier meist &lt;a href="http://www.anetzb.de/upnp2mrtg/"&gt;upnp2mrtg&lt;/a&gt; zum Einsatz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vorbereitungen beim NetCologne-Router Premium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bei diesem NetCologne-Router kann im Expertenmodus über „Sicherheit – UPnP“ getrennt eingestellt werden, ob UPnP zur Programmierung von Portweiterleitungen und/oder (nur) zur Statusabfrage eingesetzt wird. Hier muss die UPnP-Abfrage freigeschaltet (und die UPnP-Steuerung sollte aus den oben genannten Gründe deaktiviert) werden.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SdUqnV_ekLI/AAAAAAAAAAk/flJqFahSuTM/s1600-h/upnp.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 192px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SdUqnV_ekLI/AAAAAAAAAAk/flJqFahSuTM/s320/upnp.png" alt="" id="BLOGGER_PHOTO_ID_5320205390214762674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bei gleicher Gelegenheit sollte man mit „System – Zugangsschutz“ ein Passwort für die Web-Schnittstelle definieren – standardmäßig ist leider kein Passwort definiert.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wCX5P_aGQzo/SdUrKfyWsxI/AAAAAAAAAAs/oc-efpHBMeU/s1600-h/pass.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 203px;" src="http://3.bp.blogspot.com/_wCX5P_aGQzo/SdUrKfyWsxI/AAAAAAAAAAs/oc-efpHBMeU/s320/pass.png" alt="" id="BLOGGER_PHOTO_ID_5320205994139497234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Probleme bei der Abfrage mit upnp2mrtg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Leider schlägt der Aufruf von &lt;span style="font-family:courier new;"&gt;upnp2mrtg&lt;/span&gt; fehl. Die Standardwerte für HOST („firtz.box“) und PORT (49000) passen nicht zur NetCologne-Box.&lt;br /&gt;&lt;br /&gt;Der HOST beim NetCologne-Router heißt „netconnect.box“ (oder man verwendet die entsprechende IP-Adresse, standardmäßig wird „192.168.0.1“ verwendet).&lt;br /&gt;Port 49000 ist beim NetCologne-Router jedoch geschlossen. Ein Port-Scan zeigt, dass Port 49300 offen ist (dieser Wert liegt zumindest in der Nähe von 49000).&lt;br /&gt;Jeses UPnP-Gerät sendet aber auch sog. SSDP-Notify-Pakete, um sich bekannt zu machen. Mit Wireshark können diese Pakete aufgezeichnet und analysiert werden:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SdUrTsmqSPI/AAAAAAAAAA0/ThT9GXPIFZ8/s1600-h/wire.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 282px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SdUrTsmqSPI/AAAAAAAAAA0/ThT9GXPIFZ8/s320/wire.png" alt="" id="BLOGGER_PHOTO_ID_5320206152198932722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Der Inhalt dieser Pakete bestätigt Port 49300 als UPnP-Port. Aber der entsprechend modifizierte Aufruf von upnp2mrtg:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo upnp2mrtg -a netconnect.box -p 49300&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;liefert kein Ergebnis.&lt;br /&gt;&lt;br /&gt;Der Grund hierfür – so fand ich bei der Programmierung des Tools ng-upnp2mrtg heraus – liegt darin, dass der NetCologne-Router auf CR LF als Zeilenende-Zeichen besteht – die FritzBox begnügt sich auch mit dem Unix-Standardwert LF.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unterschiede ng-upnp2mrtg.py / upnp2mrtg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;upnp2mrtg&lt;/span&gt; ist ein Bash-Script, während&lt;span style="font-family:courier new;"&gt; ng-upnp2mrtg.py&lt;/span&gt; ein Python-Script ist. Python ist heutzutage auf jedem Linux-System standardmäßig installiert. Das ng-Script ist genügsam und nutzt nur die Python-Standardbibliotheken.&lt;br /&gt;&lt;br /&gt;Wie in einem der nächsten Blog-Postings gezeigt braucht man zur Abfrage eines bestimmten Router-Werts nur vier Parameter. Diese scheinen sich von Router zu Router geringfügig zu unterscheiden. Hat man diese Information erst einmal ermittelt, lässt sich das Python-Programm leicht an andere Geräte anpassen. Sollten Sie das Programm mit anderen Router-Typen erfolgreich einsetzen, lassen Sie es mich wissen.&lt;br /&gt;&lt;br /&gt;Die jetzige Version des Skripts ng-upnp2mrtg enthält neben den Parametern für den NetCologne-Router auch die für eine Fritzbox. Mangels Internetverbindung über eine FritzBox kann ich sie leider nicht testen. Die Auswahl erfolgt zurzeit noch durch ein- und auskommentieren am Ende des Skripts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ng-upnp2mrtg - Was Sie brauchen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mrtg&lt;/span&gt;: Dieses Programm sollte über die Repositories Ihrer Distribution erhältlich sein. Ansonsten finden Sie es &lt;a href="http://oss.oetiker.ch/mrtg/download.en.html"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ng-upnp2mrtg.py&lt;/span&gt;: Das Skript läuft unter Python, was heute auf jedem Linux-System installiert sein sollte, und braucht keine besonderen Bibliotheken. Im Augenblick ist es &lt;a href="http://uebra.de/src/ng-upnp2mrtg.py"&gt;hier&lt;/a&gt; abrufbar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mrtg.cfg&lt;/span&gt;: Konfigurationsdatei für mrtg angepasst an ng-upnp2mrtg.py, Im Augenblick &lt;a href="http://uebra.de/src/mrtg.cfg"&gt;hier&lt;/a&gt;  zu bekommen.&lt;br /&gt;&lt;br /&gt;Ich werde versuchen das Skript bei einem der OpenSource-Projekt-Sites als Projekt anzumelden. Die Dateien und neuere Versionen werden dann dort abrufbar sein.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation von ng-upnp2mrtg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Für die folgenden Schritte brauchen Sie Root-Rechte:&lt;br /&gt;&lt;br /&gt;Passen Sie oben im Skript ng-upnp2mrtg.py die Variablen &lt;span style="font-family:courier new;"&gt;HOST&lt;/span&gt; und &lt;span style="font-family:courier new;"&gt;PORT&lt;/span&gt; an.&lt;br /&gt;Kopieren Sie das Skript nach &lt;span style="font-family:courier new;"&gt;/usr/local/bin&lt;/span&gt; und machen Sie es ausführbar&lt;br /&gt;Die Konfigurationsdatei mrtg.cfg kommt nach &lt;span style="font-family:courier new;"&gt;/etc&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cp -a ng-upnp2mrtg.py /usr/local/bin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;chmod 755 /usr/local/bin/ng-upnp2mrtg.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cp -a mrtg.cfg /etc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Für den regelmäßige Aufruf von mrtg sorgt der folgende crontab-Eintrag:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;0-59/5 * * * *  env LANG=C /usr/bin/mrtg --logging /var/log/mrtg.log&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Ganze wurde getestet mit Ubuntu 8.04, mrtg 2.14.7, Python 2.5.2.&lt;br /&gt;Schwierigkeiten bei der Übernahme auf andere System sind eigentlich nicht zu erwarten... aber das sagt man ja vorher immer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-4236615586555731292?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/4236615586555731292/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=4236615586555731292' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4236615586555731292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/4236615586555731292'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/04/netcologne-premium-modem-und-die.html' title='NetCologne Premium-Modem und die Statusabfrage via UPnP'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wCX5P_aGQzo/SdUqnV_ekLI/AAAAAAAAAAk/flJqFahSuTM/s72-c/upnp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-2118060788525668549</id><published>2009-02-22T21:06:00.003+01:00</published><updated>2009-02-22T21:14:09.988+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sicherheit'/><title type='text'>Debian's OpenSSL-Lücke – die nächste Stufe</title><content type='html'>&lt;a href="http://www.willhackforsushi.com/"&gt;Joshua Wright&lt;/a&gt; beschreibt die Dekodierung SSL-verschlüsselter Kommunikation.&lt;br /&gt;&lt;br /&gt;Die Debian OpenSSL-&lt;a href="http://lists.debian.org/debian-security-announce/2008/msg00152.html"&gt;Schwachstelle&lt;/a&gt; hatte Anfang 2008 im IT-Sektor für große Aufregung gesorgt. Ein Patch war bei der Linux-Distribution Debian dafür verantwortlich, dass die entsprechenden Systeme fast eineinhalb Jahre lang Schlüsselpaare nur aus einem sehr überschaubaren Pool ausgaben. Diese Schlüssel kommen u.a. bei der Verschlüsselung von Web-Kommunikation (https:) zum Einsatz.&lt;br /&gt;&lt;br /&gt;Auch wenn die meisten Systeme mittlerweile aktualisiert sein dürften, bestand und besteht die weitere Aufgabe darin, keines der von diesen Systemen erzeugten schwachen Schlüsselpaare auf einem aktiven Webserver zu vergessen.&lt;br /&gt;&lt;br /&gt;Die „verhältnismäßig“ geringe Anzahl möglicher Schlüsselpaare erlaubt es, diese vorauszuberechnen, und einen Surfer zu warnen, wenn ein solcher Schlüssel von einer Website verwendet wird. Eine entsprechende &lt;a href="http://codefromthe70s.org/sslblacklist.aspx"&gt;Erweiterung&lt;/a&gt; steht für Firefox-Benutzer schon seit längerem zur Verfügung.&lt;br /&gt;&lt;br /&gt;Joshua Wright &lt;a href="http://www.willhackforsushi.com/Home/Entries/2009/2/3_Decrypting_DebIan-Vulnerable_SSH_Traffic.html"&gt;beschreibt&lt;/a&gt; nun, wie der Inhalt einer mitgeschnittenen verschlüsselten SSL-Verbindung wieder dekodiert werden kann, wenn derart schwache Schlüssel zum Einsatz kamen.&lt;br /&gt;&lt;br /&gt;Es ist zu hoffen, dass nicht allzu viele Verbindungen mitgeschnitten wurden, in der Hoffnung sie irgendwann einmal dekodieren zu können.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-2118060788525668549?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/2118060788525668549/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=2118060788525668549' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/2118060788525668549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/2118060788525668549'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/02/debians-openssl-lucke-die-nachste-stufe.html' title='Debian&apos;s OpenSSL-Lücke – die nächste Stufe'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1133802111281560341.post-5734197390126888263</id><published>2009-02-21T00:41:00.000+01:00</published><updated>2009-02-21T00:57:55.674+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multimedia'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Touch Me, Tux</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wCX5P_aGQzo/SZ9DcX2NXUI/AAAAAAAAAAc/Qhi_PCd627U/s1600-h/TouchMe.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_wCX5P_aGQzo/SZ9DcX2NXUI/AAAAAAAAAAc/Qhi_PCd627U/s320/TouchMe.jpg" alt="" id="BLOGGER_PHOTO_ID_5305033040782515522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Das &lt;a href="http://www.technaxx.de/"&gt;Technaxx&lt;/a&gt; TOUCHME ist ein portabler Multimedia-Player mit einem 2,8“ Farb-Touchscreen. Es kann Audio (MP3, WMA), Video (MPEG4 AVI) und Bilder (JPG, BMP) wiedergeben.&lt;br /&gt;&lt;br /&gt;Es hat eine USB 2.0-Schnittstelle und ist mit einer MicroSD-Karte erweiterbar.&lt;br /&gt;&lt;br /&gt;Der Hauptbildschirm ist dem Handy einer bekannten amerikanischen Firma nachempfunden. Die Icons sind jedoch statisch und auch sonst kommt die Benutzerführung nicht an das Vorbild heran.&lt;br /&gt;&lt;br /&gt;Mit Linux lässt sich das Gerät aber hervorragend betreiben.&lt;br /&gt;&lt;br /&gt;Es meldet sich als normaler USB-Massenspeicher an, und man kann die Dateien in der gewohnten Art und Weise kopieren und löschen. Kein DRM, nur Formate, die man unter Linux auch erstellen kann.&lt;br /&gt;&lt;br /&gt;Das mitgelieferte “Konvertierungs-Tool“ ist natürlich ein Windows-Programm. Ein Blick mit dem Hex-Editor auf die damit erzeugten Dateien zeigt, dass diese mit mencoder erstellt wurden, ein unter Linux weit verbreiteter Open-Source-Videokonverter.&lt;br /&gt;&lt;br /&gt;Das Windows-Konvertierungs-Tool ist also nichts anderes als eine GUI für &lt;span style="font-weight: bold;"&gt;mencoder&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Schnell ein kleines Windowsprogramm geschrieben, dessen Aufgabe es war, die Aufrufparameter anzeigen, und dem Konvertierungs-Tool anstatt mencoder untergeschoben, schon standen die Parameter fest:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mencoder -noodml INPUTFILE -of avi -o OUTPUTFILE -ofps 20 -vf-add scale=SCALEX:SCALEY -vf-add expand=320:240:-1:-1:1 -srate 44100 -ovc xvid -xvidencopts bitrate=VIDEOBITRATE:max_bframes=0:quant_type=h263:me_quality=4 -oac lavc -lavcopts acodec=mp2:abitrate=AUDIOBITRATE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je nach gewünschter Qualität für VIDEOBITRATE die Werte 450, 500 oder 600 und für AUDIOBITRATE die Werte 64 oder 128 einsetzen.&lt;br /&gt;&lt;br /&gt;SCALEX und SCALEY sind die Höhe und Breite in Pixel, auf die das Video herunter gerechnet werden muss, um unverzerrt angezeigt zu werden. Bei 4:3-Material sind das 320:240, bei 16:9 muss hier 320:180 eingesetzt werden („expand“ fügt dann die schwarzen Ränder hinzu).&lt;br /&gt;&lt;br /&gt;Die erzeugte Datei &lt;span style="font-weight: bold;"&gt;muss&lt;/span&gt; einen Stereo-Track enthalten. Andernfalls kommt es bei der Wiedergabe zu seltsamen Effekten.&lt;br /&gt;&lt;br /&gt;Ich kodiere jetzt schon seit längerer Zeit mit diesen Parametern erfolgreich kleine Clips z.B. von YouTube für den Player. Längere Videos sind zwar auch möglich, die prellenden Vor- und Rückspultasten (On-Screen) machen die Wiedergabe aber zur Geduldsprobe.&lt;br /&gt;&lt;br /&gt;Podcasts kann man mit dem Player natürlich auch wiedergeben. Der Player merkt sich beim Ausschalten aber leider nicht, an welcher Stelle man war. Für Songs also geeignet, für längere Audiodateien leider nicht.&lt;br /&gt;&lt;br /&gt;Bilder sollte man vorher skalieren. Der Player kann das zwar auch, nimmt sich aber Zeit dafür.&lt;br /&gt;&lt;br /&gt;Ich habe diesen Player vor über einem Jahr bei einer Supermarktkette erworben. Wenn Geräte bereits dort verkauft werden, zerschlagen sich jegliche Hoffnung auf Updates – Schade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1133802111281560341-5734197390126888263?l=tuxpool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxpool.blogspot.com/feeds/5734197390126888263/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1133802111281560341&amp;postID=5734197390126888263' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5734197390126888263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1133802111281560341/posts/default/5734197390126888263'/><link rel='alternate' type='text/html' href='http://tuxpool.blogspot.com/2009/02/touch-me-tux.html' title='Touch Me, Tux'/><author><name>Michael</name><uri>http://www.blogger.com/profile/04824867061743067537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wCX5P_aGQzo/SZ9DcX2NXUI/AAAAAAAAAAc/Qhi_PCd627U/s72-c/TouchMe.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
