<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkANRXg4fip7ImA9WhRQFE0.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276</id><updated>2011-12-08T22:19:54.636-05:00</updated><category term="install" /><category term="xvid" /><category term="htmlentities" /><category term="wiimote" /><category term="solution" /><category term="finance" /><category term="gentoo" /><category term="collaboration" /><category term="shopping" /><category term="astrology" /><category term="horror" /><category term="phone" /><category term="sed" /><category term="roku" /><category term="survival" /><category term="diatribe" /><category term="psychology" /><category term="iphone" /><category term="netflix" /><category term="rails" /><category term="species" /><category term="video" /><category term="nanotechnology" /><category term="autobiography" /><category term="dvr" /><category term="vim" /><category term="review" /><category term="cablebox" /><category term="c++" /><category term="rant" /><category term="notebook" /><category term="anthropology" /><category term="lame" /><category term="therapy" /><category term="scripting" /><category term="java" /><category term="ondemand" /><category term="pychecker" /><category term="dts" /><category term="economy" /><category term="automount" /><category term="fabrication" /><category term="store" /><category term="selfhelp" /><category term="mythweb" /><category term="ffmpeg" /><category term="gsm" /><category term="bash" /><category term="multimedia" /><category term="wordpress" /><category term="t21" /><category term="c" /><category term="cart" /><category term="t22" /><category term="thinkpad" /><category term="numerology" /><category term="phpinfo" /><category term="j" /><category term="opinion" /><category term="magenta" /><category term="ac3" /><category term="mac" /><category term="pyflakes" /><category term="mp3" /><category term="fix" /><category term="ubuntu" /><category term="ruby" /><category term="setup" /><category term="education" /><category term="technology" /><category term="loop" /><category term="pylint" /><category term="restaurant" /><category term="apple" /><category term="perl" /><category term="amr" /><category term="savage" /><category term="os x" /><category term="wine" /><category term="command" /><category term="twit" /><category term="osx" /><category term="climate" /><category term="apl" /><category term="green" /><category term="barbecue" /><category term="a52" /><category term="ibm" /><category term="shell" /><category term="python" /><category term="amazon" /><category term="k" /><category term="windows" /><category term="nfs" /><category term="wind" /><category term="science" /><category term="apache" /><category term="linux" /><category term="driver" /><category term="CLI" /><category term="revision3" /><category term="portage" /><category term="liberty" /><category term="usb" /><category term="kubuntu" /><category term="php" /><category term="howto" /><category term="programming" /><category term="firewire" /><category term="flv" /><category term="ssh" /><category term="communication" /><category term="mythtv" /><category term="book" /><category term="3gp2" /><category term="zen cart" /><category term="x" /><category term="xorg" /><category term="propaganda" /><category term="futureshock" /><category term="energy" /><category term="3gp" /><category term="autofs" /><category term="administration" /><category term="apc" /><category term="fiction" /><category term="sociology" /><category term="solar" /><category term="problem" /><category term="money" /><title>freegnu</title><subtitle type="html">and other stuff too</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://freegnu.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/freegnu" /><feedburner:info uri="freegnu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CE4NQno6fip7ImA9WhRTGEk.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-2632106899733299879</id><published>2011-04-06T10:53:00.005-04:00</published><updated>2011-11-09T07:49:53.416-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T07:49:53.416-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="diatribe" /><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>A Diatribe on Being Humble While Misunderstanding Incompetently</title><content type="html">I do not subscribe to the I'm in charge so I feel powerful mentality. In fact, I feel the opposite about the administrator and programmer role.&lt;div&gt;&lt;br /&gt;I take the role names more literally in their humblest interpretation. An administrator is more like just a lowly administrator mired in the details. A programmer is more like just a computer in the calculator sense of the word. Both are tools that business minded entrepreneurs can make good use of.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That is not to say that I think little of what I do when I am in those roles.  But more of a right sizing of my ego and attitudes toward my work and how I interact with others. By thinking humbly I can allow myself the freedom to expect more of others and to allow myself to look for the solutions to business problems outside of the programming solution straight jacket.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;There are certain conclusions I have come to that have helped me to solve what are invariably business problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Firstly, there are no little people AKA users. There are only clients and customers who are invariably right ;)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Secondly, the people who actually use your programs on a daily basis are the one's who are going to decide whether your program is truly useful or not. Bouncing your ideas off of them and getting their feedback is only going to help you to deliver what is needed rather than what was in the specification.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thirdly, it is easier for you to replicate a feature in a location convenient for the client(not user, user is the derogatory of client or customer) than to have that client click through to the location you have hidden the feature. Click of O(1) as opposed to Click of O(n), as n goes to infinity. n being the number of times the client has to click to find the feature that they want available one click away.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fourthly, asking people outside of the development team to be responsible for their work is not a cardinal sin. If a graphic designer delivers images that are not in the right palette or format or pixel size, it is not your job to write a software solution to fix. You simply need to point out the problem and do a little hand holding to explain the problem and suggest a non-programmatic solution. This point bears repeating. If the client is unable to to access your website because they are using a crappy browser from the 90's don't change your code to handle that browser. Simply point out the problem and suggest a solution. I'm sure this could be loosely interpreted as telling the client how high to shove it. But I am only reiterating my point which is asking non-techie's to do their job correctly and responsibly is ok, acceptable, and an all around good thing.The only way people will act competent is if they are asked nicely to be competent and shown how to be competent.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fifthly and lastly, there are tons of incompetent people out there. You, including me, are probably one of them. It's not the end of the world. We all sometimes think if someone doesn't know what we know then they are incompetent. Trust me this is flawed logic. As a simple proof to yourself, tell me what number I am thinking of right now. Look now I know something you don't know. Should I conclude you are incompetent with numbers and math? It's only one number should I extrapolate that to mean maybe you will have trouble with more than one number? Like addition, subtraction, multiplication, and division. Surely you suck at guessing games and logical thinking. Otherwise you would have guessed it already. This may seem like a trumped up example. Which it is. But it is also true that humans are bad predictors of almost anything. Especially when they are incompetent enough to think they know more than you or conversely put, when you think you know more than someone else. It's a paradox that you see around you every day. Why does management seem so incompetent? Is it because they are incompetent or are you so incompetent that you can't understand what you don't understand? Watch out for this one. Everybody does it including you. That is why it is known as a paradox. It is also why I use a number guessing game as an example. No one thinks a "What number am I thinking of guessing?" game to be fair except children.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-2632106899733299879?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/2632106899733299879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=2632106899733299879" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2632106899733299879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2632106899733299879?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/b4CU_2Yk82g/diatribe-on-being-humble-while.html" title="A Diatribe on Being Humble While Misunderstanding Incompetently" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2011/04/diatribe-on-being-humble-while.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQGSXw5fyp7ImA9WhdXGEk.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-4779779983210408701</id><published>2010-08-07T06:56:00.009-04:00</published><updated>2011-08-31T22:32:08.227-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T22:32:08.227-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>The Expectation of Lack of Privacy in Python</title><content type="html">One feature of Python that I thankfully rarely have to think of is the whole private, protected, public meme that seems to always popup in programming languages. Programmers coming from other programming languages always want to know how they can make an object's properties private.
&lt;br /&gt;
&lt;br /&gt;Well, besides that fact that black boxes are only good for figuring out what went wrong after the crash. I'd have to say that the whole privacy meme in programming stems from the same sort of administrator == all powerful == programmer way of thinking. Responsibilities are not entitlements. Responsibilities are work.
&lt;br /&gt;
&lt;br /&gt;Here is an example I wrote to clear up what I felt was a miscommunication about using the underscore to create private variables in Python:
&lt;br /&gt;
&lt;br /&gt;Here is a short example I wrote that demonstrates my point about property getters and setters. I have tested cutting and pasting the following into an interactive python 2.5.2 session launched by typing python on the command line without any parameters. The # commented lines should match the output line above it. I hope this clarifies any miscommunication we may have had.
&lt;br /&gt;&lt;code&gt;
&lt;br /&gt;class One(object):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def __init__(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._x = value
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def getx(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self._x ** 2
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def setx(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._x = value + 1
&lt;br /&gt;&amp;nbsp;&amp;nbsp;x = property(getx, setx)
&lt;br /&gt;
&lt;br /&gt;class Two(object):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def __init__(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._my_x = value
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def getx(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" directly accessing a "private" member of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self._my_x._x
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def setx(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" directly setting a "private" member of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._my_x._x = value + 2
&lt;br /&gt;&amp;nbsp;&amp;nbsp;# Not defining a setter for the polite_x property makes it read only
&lt;br /&gt;&amp;nbsp;&amp;nbsp;@property
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def polite_x(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" using the exposed property of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self._my_x.x
&lt;br /&gt;&amp;nbsp;&amp;nbsp;x = property(getx, setx)
&lt;br /&gt;
&lt;br /&gt;one = One(10)
&lt;br /&gt;two = Two(one)
&lt;br /&gt;one._x
&lt;br /&gt;#10
&lt;br /&gt;
&lt;br /&gt;one.x
&lt;br /&gt;#100
&lt;br /&gt;
&lt;br /&gt;one.x = 10
&lt;br /&gt;one._x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;one.x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two._my_x._x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;two._my_x.x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two.x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;two.polite_x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two.x = 10
&lt;br /&gt;two.polite_x
&lt;br /&gt;#144
&lt;br /&gt;
&lt;br /&gt;two.x
&lt;br /&gt;#12
&lt;br /&gt;
&lt;br /&gt;one._x
&lt;br /&gt;#12
&lt;br /&gt;
&lt;br /&gt;two.polite_x = 1
&lt;br /&gt;#Traceback (most recent call last):
&lt;br /&gt;#  File "&amp;lt;stdin&amp;gt;", line 1, in &amp;lt;module&amp;gt;
&lt;br /&gt;#AttributeError: can't set attribute
&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;I realized 30 seconds after I sent the above example. By looking up the meaning of the underscore and double underscore. That the communication problem was about the underscore as opposed to the double underscore. I was talking about the single underscore because I was asked about the underscore and was only told underscore as feedback when I tried to clarify by asking whether they were referring to the double or single underscore. Which should have been my first clue that I may have my answer judged by someone that didn't fully understand the question they were asking at the time. Which is a big no no. Unless you want to be seen as incompetent because you are being judged by someone who doesn't understand the questions they are asking. And may not be able to understand the answers to those questions. I am loath to admit it but I was just as culpable in this misunderstanding as my understanding of the double underscore was incomplete at that moment. As my mistaken derision of the double underscore came from the accessibility of members like __repr__ and __str__ and __dict__ and __len__. Class members with a double underscore on both sides of the name are system methods and are not meant or implied to being private at all. My lack of interest in making any of my code private was probably the real source of my having no real interest in reading past the disclaimer in the Python documentation which starts with:
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote&gt;
&lt;br /&gt;9.6 Private Variables
&lt;br /&gt;“Private” instance variables that cannot be accessed except from inside an object, don’t exist in Python.
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;Thus my second email missive of the morning. Making my point all over again using the double underscore. Luckily :). Thank you benevolent dictator for thumbing your nose at private variables!
&lt;br /&gt;
&lt;br /&gt;The private members rewritten with double underscores make those members seem enforceably private. This is because of the exception raised when trying to access those members outside of object and class methods. But this is a misnomer as leading double underscores are actually a name mangling scheme used to hide those members from name collisions with child classes. They can still be accessed directly.
&lt;br /&gt;
&lt;br /&gt;Here is the same example written with "private" members that generate the same results and allows the same access. Despite the miscommunication of apparent privacy. This is because the double underscore's real purpose is for predictable name mangling not privacy.
&lt;br /&gt;&lt;code&gt;
&lt;br /&gt;class One(object):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def __init__(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.__x = value
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def getx(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.__x ** 2
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def setx(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.__x = value + 1
&lt;br /&gt;&amp;nbsp;&amp;nbsp;x = property(getx, setx)
&lt;br /&gt;
&lt;br /&gt;class Two(object):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def __init__(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.__my_x = value
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def getx(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" directly accessing a "private" member of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.__my_x._One__x
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def setx(self, value):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" directly setting a "private" member of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.__my_x._One__x = value + 2
&lt;br /&gt;&amp;nbsp;&amp;nbsp;# Not defining a setter for the polite_x property makes it read only
&lt;br /&gt;&amp;nbsp;&amp;nbsp;@property
&lt;br /&gt;&amp;nbsp;&amp;nbsp;def polite_x(self):
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;""" using the exposed property of another class """
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.__my_x.x
&lt;br /&gt;&amp;nbsp;&amp;nbsp;x = property(getx, setx)
&lt;br /&gt;
&lt;br /&gt;one = One(10)
&lt;br /&gt;two = Two(one)
&lt;br /&gt;one._One__x
&lt;br /&gt;#10
&lt;br /&gt;
&lt;br /&gt;one.x
&lt;br /&gt;#100
&lt;br /&gt;
&lt;br /&gt;one.x = 10
&lt;br /&gt;one._One__x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;one.x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two._Two__my_x._One__x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;two._Two__my_x.x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two.x
&lt;br /&gt;#11
&lt;br /&gt;
&lt;br /&gt;two.polite_x
&lt;br /&gt;#121
&lt;br /&gt;
&lt;br /&gt;two.x = 10
&lt;br /&gt;two.polite_x
&lt;br /&gt;#144
&lt;br /&gt;
&lt;br /&gt;two.x
&lt;br /&gt;#12
&lt;br /&gt;
&lt;br /&gt;one._One__x
&lt;br /&gt;#12
&lt;br /&gt;
&lt;br /&gt;two.polite_x = 1
&lt;br /&gt;#Traceback (most recent call last):
&lt;br /&gt;#  File "&amp;lt;stdin&amp;gt;", line 1, in &amp;lt;module&amp;gt;
&lt;br /&gt;#AttributeError: can't set attribute
&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-4779779983210408701?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/4779779983210408701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=4779779983210408701" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4779779983210408701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4779779983210408701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/XiPNhXRyB0k/expectation-of-lack-of-privacy-in.html" title="The Expectation of Lack of Privacy in Python" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2010/08/expectation-of-lack-of-privacy-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cFSHY9eSp7ImA9WhZSF0o.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-1251461304418629484</id><published>2010-08-06T15:44:00.011-04:00</published><updated>2011-04-02T16:10:19.861-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-02T16:10:19.861-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Bit Flipping in Python</title><content type="html">In Python you can access bits directly with the &amp;, |, ^, ~, &lt;&lt;, &gt;&gt; operators on integer objects.&lt;br /&gt;&lt;br /&gt;An example bit transformation might be one that moves all of the set bits in a 12 bit number to the left and all of the unset bits in the same 12 bit number to the right.&lt;br /&gt;&lt;br /&gt;For example the 12 bit number 101101000001 would be transformed into the 12 bit number 111110000000 using that transformation.&lt;br /&gt;&lt;br /&gt;This example bit manipulation can be concisely written in Python as:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;n1 = int("101101000001", 2)&lt;br /&gt;bc = sum(1 for i in range(12) if n1 &amp; (1 &lt;&lt; i))&lt;br /&gt;n2 = int(("1" * bc) + ("0" * (12 - bc)))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In Python 2.6 and later this example can more concisely be written as:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;n1 = 0b101101000001&lt;br /&gt;bc = sum(1 for i in range(12) if n1 &amp; (1 &lt;&lt; i))&lt;br /&gt;n2 = sum(1 &lt;&lt; i for i in range(11, (11 - bc), -1))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The generic 12 bit manipulation can be more re-usably written as:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# The 12 bits&lt;br /&gt;b12 = tuple(1 &lt;&lt; i for i in range(11, -1, -1))&lt;br /&gt;&lt;br /&gt;# There are only 13 solutions&lt;br /&gt;result_numbers = tuple(sum(b12[i] for i in range(c)) for c in range(13))&lt;br /&gt;result_strings = tuple(("1" * i) + ("0" * (12 - i)) for i in range(13))&lt;br /&gt;&lt;br /&gt;original_number = int("101101000001", 2)&lt;br /&gt;bit_count = sum(1 for i in range(12) if original_number &amp; b12[i])&lt;br /&gt;transformed_number = result_numbers[bit_count]&lt;br /&gt;print result_strings[bit_count]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The Python 2.6 and later version is:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# The 12 bits&lt;br /&gt;b12 = tuple(1 &lt;&lt; i for i in range(11, -1, -1))&lt;br /&gt;&lt;br /&gt;# There are only 13 solutions&lt;br /&gt;result_numbers = tuple(sum(b12[i] for i in range(c)) for c in range(13))&lt;br /&gt;result_strings = tuple(bin(i) for i in result_numbers)&lt;br /&gt;&lt;br /&gt;original_number = 0b101101000001&lt;br /&gt;bit_count = sum(1 for i in range(12) if original_number &amp; b12[i])&lt;br /&gt;# Updated 2011-01-08&lt;br /&gt;# in python 2.7 and later the above can be further optimized&lt;br /&gt;# using range(original_number.bit_length) in place of range(12)&lt;br /&gt;transformed_number = result_numbers[bit_count]&lt;br /&gt;print result_strings[bit_count]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;There is no need to define a function call or set of function calls. Bit manipulation easily lends itself to mapping list indexes to result sets that can be prebuilt to aid in readability and execution speed.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-1251461304418629484?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/1251461304418629484/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=1251461304418629484" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1251461304418629484?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1251461304418629484?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/LRDjYC5e9Xc/bit-flipping-in-python.html" title="Bit Flipping in Python" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2010/08/bit-flipping-in-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDQXs8eyp7ImA9WhZREU0.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-8818974670780680137</id><published>2010-02-17T15:21:00.008-05:00</published><updated>2011-04-06T11:22:50.573-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-06T11:22:50.573-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>python no overhead debugger on demand</title><content type="html">One of the best ad-hock troubleshooting ways to figure out what caused an exception post mortem.&lt;br /&gt;&lt;br /&gt;Run:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;python -i your_script.py&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After the exception you will be left at the python interpreter prompt staring at your exception.&lt;br /&gt;&lt;br /&gt;Type:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import pdb&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pdb.pm()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And you will be put into the context of the stack of the last exception. This means you can print/examine the local variables at the point of failure after the failure has occurred without having to change a line of code or import pdb in advance.&lt;br /&gt;&lt;br /&gt;Another method that requires a little bit of preparation is to put the &lt;span class="Apple-style-span" style="text-decoration: line-through;"&gt;import pdb and&lt;/span&gt; pdb.set_trace() in a signal handler trap. *Moved the import of pdb out of the signal handler as imports in functions are deprecated. That way you can do a kill -SIGNAL PID or if the signal you trap is INT you can just Ctrl-C to get dropped into the debugger at any point. The signal handler technique is good for testing release candidates and released code because the signal handler doesn't create any runtime overhead.&lt;br /&gt;&lt;br /&gt;Signal handler example. Debugger starts with Ctrl-C:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import pdb&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import signal&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def  int_handler(signal, frame):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;pdb.set_trace()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if __name__ == "__main__":&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;signal.signal(signal.SIGINT, int_handler)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Put that at the top of your script and you can start debugging your script at any point by typing Ctrl-C. Resume programe execution by typing exit at the Pdb prompt.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-8818974670780680137?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://www.reddit.com/r/Python/comments/avb9w/a_quick_intro_to_the_python_debugger/c0jn4w4" title="python no overhead debugger on demand" /><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/8818974670780680137/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=8818974670780680137" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/8818974670780680137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/8818974670780680137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/lQVfbb1cV0M/python-no-overhead-debugger-on-demand.html" title="python no overhead debugger on demand" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2010/02/python-no-overhead-debugger-on-demand.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcNR3s8fSp7ImA9Wx5aE04.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-3859900083348628398</id><published>2009-12-22T12:47:00.002-05:00</published><updated>2010-11-09T16:28:16.575-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-09T16:28:16.575-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="revision3" /><category scheme="http://www.blogger.com/atom/ns#" term="roku" /><category scheme="http://www.blogger.com/atom/ns#" term="netflix" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon" /><category scheme="http://www.blogger.com/atom/ns#" term="twit" /><category scheme="http://www.blogger.com/atom/ns#" term="ondemand" /><title>My Review of Roku HD Player</title><content type="html">I wouldn't have let Roku post this to my blog except I do approve of this message.&lt;br /&gt;&lt;div class="hreview"&gt;&lt;div class="item"&gt;&lt;p&gt;&lt;a href="http://www.roku.com/roku-products"&gt;Originally submitted at Roku&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="margin-top:0"&gt;The best-selling HD Player (as known as Netflix Player by Roku) plays High Definition video and connects to surround sound audio.&lt;/p&gt;&lt;/div&gt;&lt;a href="http://www.roku.com/roku-products" style="display: none;" class="url fn"&gt;&lt;span class="fn"&gt;Roku HD Player&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br clear="left"&gt;&lt;p&gt;&lt;strong class="summary"&gt;Only needs Youtube and Hulu to be perfect&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;By &lt;strong&gt;Danyel&lt;/strong&gt; from &lt;strong&gt;Bay Ridge&lt;/strong&gt; on &lt;strong&gt;&lt;abbr title="20091222T1200-0800" class="dtreviewed" style="border: none; text-decoration: none;"&gt;12/22/2009&lt;/abbr&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;div style="margin: 0.5em 0; height: 15px; width: 83px; background-image: url(http://images.powerreviews.com/images/stars_small.gif); background-position: 0px -180px;" class="prStars prStarsSmall"&gt;&amp;nbsp;&lt;/div&gt;&lt;/p&gt;&lt;div style="display: none"&gt;&lt;span class="rating"&gt;5&lt;/span&gt;out of 5&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros: &lt;/strong&gt;Great value, Built in Wi-Fi, Easy to use, Compact, Video selection, Easily movable, Easy to set up, High quality picture, Reliability&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Best Uses: &lt;/strong&gt;Bedroom, Living room, Traveling, Friends House&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Describe Yourself: &lt;/strong&gt;Power User, Technophile, Early adopter&lt;/p&gt;&lt;p style="margin-top:1em" class="description"&gt;Move it from living room to bedroom to finish watching in bed.&lt;/p&gt;&lt;p style="margin-top:0.5em"&gt;(&lt;a href="http://www.powerreviews.com/legal/terms_of_use.html" rel="license"&gt;legalese&lt;/a&gt;)&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-3859900083348628398?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/3859900083348628398/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=3859900083348628398" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/3859900083348628398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/3859900083348628398?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/4d3cnFML670/my-review-of-roku-hd-player.html" title="My Review of Roku HD Player" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2009/12/my-review-of-roku-hd-player.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFRX48eSp7ImA9WxFWFE4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-4328797039093439936</id><published>2009-07-22T06:30:00.003-04:00</published><updated>2010-06-01T19:53:34.071-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-01T19:53:34.071-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pyflakes" /><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="pylint" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="pychecker" /><title>Python File Type Plugin for Vim - Part 1</title><content type="html">* Made a correction below. Using the ~/.vim/ftplugin directory for a file type plugin causes the plugin to be reloaded repeatedly causing any autocommands to be appended for BufWrite actions. This causes multiple executions of every autocommand every time you save the file.  A better location is the ~/.vim/plugin directory. Where the plugin is loaded once at startup. I have changed the location below. *&lt;br /&gt;
&lt;br /&gt;
I wanted to add some IDE style conveniences to my preferred editor, console Vim. Rather than reinventing the wheel I decided to search the Internet and start with what was already out there. I found a bunch of very useful scripts and snippets. In part 1 I am documenting some of what I found here by publishing a snippet that I have only made minor changes to to make it useful for my needs.&lt;br /&gt;
&lt;br /&gt;
This script needs to be put in a file named python.vim and saved in ~/.vim/plugin. If the directory does not exist it needs to be created. The scripts create the pyflakes, pylinks, and pychecker commands that can be used at the vim command prompt, ':'. The pylint, pyflakes, pychecker packages will have to be installed as prerequisites for using these commands.&lt;br /&gt;
&lt;br /&gt;
All three commands act on the current buffer's file name. Running one of the commands at the vim command prompt will open a Vim quickfix window which will seem familiar to anyone who has used a graphical IDE for development.&lt;br /&gt;
&lt;br /&gt;
You can press c to close the quickfix window when it has the focus.  You can double click with a mouse under X or press enter to go to the error or warning associated with the current quickfix line.  This will take you to the line referred to by that message. You will have to restart vim if you have already loaded a python file during the currently loaded Vim session.&lt;br /&gt;
&lt;br /&gt;
Here is the code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;function! &lt;sid&gt;PythonGrep(tool)
  set lazyredraw
  " Close any existing cwindows.
  cclose
  let l:grepformat_save = &amp;amp;grepformat
  let l:grepprogram_save = &amp;amp;grepprg
  set grepformat&amp;amp;vim
  set grepformat&amp;amp;vim
  let &amp;amp;grepformat = '%f:%l:%m'
  if a:tool == "pylint"
    let &amp;amp;grepprg = 'pylint --output-format=parseable --reports=n --indent-string="        "'
  elseif a:tool == "pychecker"&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;    let &amp;amp;grepprg = 'pychecker --quiet -q'&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  elseif a:tool == "pyflakes"&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;     let &amp;amp;grepprg = 'pyflakes'&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  else&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;    echohl WarningMsg&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;    echo "PythonGrep Error: Unknown Tool"&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;    echohl none&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  endif&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  if &amp;amp;readonly == 0 | update | endif&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  silent! grep! %&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  let &amp;amp;grepformat = l:grepformat_save&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  let &amp;amp;grepprg = l:grepprogram_save&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  let l:mod_total = 0&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  let l:win_count = 1&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  " Determine correct window height&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  windo let l:win_count = l:win_count + 1&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  if l:win_count &amp;lt;= 2 | let l:win_count = 4 | endif&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  windo let l:mod_total = l:mod_total + winheight(0)/l:win_count |&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  \ execute 'resize +'.l:mod_total&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  " Open cwindow&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  execute 'belowright cw '.l:mod_total&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;  nnoremap &lt;buffer&gt; &lt;silent&gt; c :cclose&lt;/silent&gt;&lt;/buffer&gt;&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;&lt;buffer&gt;&lt;silent&gt;&lt;cr&gt;  set nolazyredraw&lt;/cr&gt;&lt;/silent&gt;&lt;/buffer&gt;&lt;/sid&gt;&lt;/pre&gt;&lt;pre&gt;&lt;sid&gt;&lt;buffer&gt;&lt;silent&gt;&lt;cr&gt;  redraw!
endfunction

command! Pyflakes call &lt;sid&gt;PythonGrep('pyflakes')
command! PyFlakes call &lt;sid&gt;PythonGrep('pyflakes')
command! Pychecker call &lt;sid&gt;PythonGrep('pychecker')
command! PyChecker call &lt;sid&gt;PythonGrep('pychecker')
command! Pylint call &lt;sid&gt;PythonGrep('pylint')
command! PyLint call &lt;sid&gt;PythonGrep('pylint')

" These three are successively more informative and aggressive in their
" warnings with pyflakes as the least noisy. Only uncomment one.
"autocmd BufWrite *.{py} :Pyflakes
autocmd BufWrite *.{py} :Pychecker
"autocmd BufWrite *.{py} :Pylint
&lt;/sid&gt;&lt;/sid&gt;&lt;/sid&gt;&lt;/sid&gt;&lt;/sid&gt;&lt;/sid&gt;&lt;/cr&gt;&lt;/silent&gt;&lt;/buffer&gt;&lt;/sid&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
In Vim a single double quote, ", is considered the beginning of a comment for the rest of the line.&lt;br /&gt;
&lt;br /&gt;
The benefit of having the autocmd run one of the Python lint programs every time you save the file is that you can never get too far from sane working code as any errors and warnings pop up.  This, in your face, style of development can keep you from pulling your hair out over something as simple as a semicolon or comma typo and can also warn you about more complex problems and proper coding style.&lt;br /&gt;
&lt;br /&gt;
More to follow. I will try to combine the output of the three commands as their output doesn't seem to overlap for the most part.  And the noisier programs (pychecker and pylint) don't appear to give the same advice when it comes to warnings. pylinker is by far the noisiest of them all but all it's warnings are configurable.&lt;br /&gt;
&lt;br /&gt;
Warning: If you are using tabs for indenting you will have to modify the pylint parameter '--indent-string='.  Set it to the empty string for tabs, or the actual number of spaces used for indenting. In my code above I have it set for 8 spaces which is project specific.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-4328797039093439936?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/4328797039093439936/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=4328797039093439936" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4328797039093439936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4328797039093439936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/lSKbeqHkkjU/python-file-type-plugin-for-vim-part-1.html" title="Python File Type Plugin for Vim - Part 1" /><author><name>freegnu</name><uri>http://www.blogger.com/profile/13789503355246876159</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><feedburner:origLink>http://freegnu.blogspot.com/2009/06/python-file-type-plugin-for-vim-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkICR3g-fSp7ImA9WxFWFE4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-5227427817513781223</id><published>2009-04-02T18:27:00.005-04:00</published><updated>2010-06-01T19:22:46.655-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-01T19:22:46.655-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="apl" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Step One: Insert Foot in Mouth</title><content type="html">This is a follow up to my &lt;a href="http://freegnu.blogspot.com/2009/02/your-fancy-language-is-burdensome-and.html"&gt;Your Fancy Language is Burdensome and Dangerous&lt;/a&gt; post.&lt;br /&gt;
&lt;br /&gt;
Python and Ruby don't have the APL array/vector/matrix syntax built in to the core language.  But a little nudge from someone made me do the little bit of research I should have done before I wrote &lt;a href="http://freegnu.blogspot.com/2009/02/your-fancy-language-is-burdensome-and.html"&gt;that&lt;/a&gt; post.  And I rediscovered that I did not originate the idea that these languages need array/matrix math syntax thought.&lt;br /&gt;
&lt;br /&gt;
There is a gem for Ruby called NArray and an egg for Python called Numpy that not only add array syntax but also coherent coercion rules and the ability to apply functions across arrays without calling map.  I'm glad I found it because they are easy as pie to use and do exactly what I wanted and a heck of a lot more.&lt;br /&gt;
&lt;br /&gt;
Check out this Python example:&lt;br /&gt;
&lt;br /&gt;
from numpy import *&lt;br /&gt;
a = array([1,2,3])&lt;br /&gt;
b = array([4,5,6])&lt;br /&gt;
print a+b  #equals array([5,7,9])&lt;br /&gt;
print (a+b)/4&lt;br /&gt;
print (a+b)%6&lt;br /&gt;
&lt;br /&gt;
Outputs&lt;br /&gt;
[5,7,9]&lt;br /&gt;
[1,1,2]&lt;br /&gt;
[5,1,3]&lt;br /&gt;
&lt;br /&gt;
As you can see Numpy also replicates the integer type bug/feature which is very C like but is being dropped in Python 3000 in favor of coercing integers to float on divide.  You can typecast the divisor to float to get floating point division and float results.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-5227427817513781223?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/5227427817513781223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=5227427817513781223" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5227427817513781223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5227427817513781223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/hoR2majav28/step-one-insert-foot-in-mouth.html" title="Step One: Insert Foot in Mouth" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/04/step-one-insert-foot-in-mouth.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCQ3w7eCp7ImA9WxVbF00.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-6520269211660776432</id><published>2009-03-24T07:27:00.001-04:00</published><updated>2009-04-02T17:39:22.200-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-02T17:39:22.200-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>Vim auto completion</title><content type="html">I responded to a comment on the &lt;a href="http://dailyvim.blogspot.com/2009/03/out-of-box-autocompletion.html"&gt;Daily Vim&lt;/a&gt; about auto completion.  I decided to post it here as well as the comment ended up being kind of long.  The comment by Casey asks if there is a way to turn off omni auto completion for perl as it goes through the entire POD collection evey time.  I provide several solutions.  Read the original article for a quicj intro to auto completion in insert mode in Vim.&lt;br /&gt;&lt;br /&gt;The original article points out that there is built in auto completion in Vim.  All you have to do is use it is type Ctrl-x Ctrl-o in insert mode and vim will try to complete what you have started typing or pop up a list of all completions if the cursor is not immediately preceded by anything.&lt;br /&gt;&lt;br /&gt;Original comment follows:&lt;br /&gt;&lt;br /&gt;Try this command to change the auto completion to the simpler syntax highlighting hints as the auto completer.&lt;br /&gt;&lt;br /&gt;:setlocal omnifunc=syntaxcomplete#Complete&lt;br /&gt;&lt;br /&gt;If that is what you always want for Perl add this to your .vimrc after all your other auto commands.&lt;br /&gt;&lt;br /&gt;autocmd Filetype perl  setlocal omnifunc=syntaxcomplete#Complete&lt;br /&gt;&lt;br /&gt;If you want syntax completion rather than omni completion for all file types use * for the file type.  If you want to fail over to syntax completion for file types that don't have omni completion put this in your .vimrc after your other auto commands.&lt;br /&gt;&lt;br /&gt;if has("autocmd") &amp;&amp; exists("+omnifunc")&lt;br /&gt;    autocmd Filetype *&lt;br /&gt;        \   if &amp;omnifunc == "" |&lt;br /&gt;        \           setlocal omnifunc=syntaxcomplete#Complete |&lt;br /&gt;        \   endif&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;You can also do something a little more complex which just disable the perlPOD part of the perl filetype omni complete.&lt;br /&gt;&lt;br /&gt;Try this command:&lt;br /&gt;&lt;br /&gt;let g:omni_syntax_group_exclude_perl = 'perlPOD'&lt;br /&gt;&lt;br /&gt;generically it's:&lt;br /&gt;&lt;br /&gt;let g:omni_syntax_group_exclude_{filetype} = 'comma,separated,list'&lt;br /&gt;&lt;br /&gt;And you can get the complete list of syntax groups while in a file with the filetype in question with this command:&lt;br /&gt;&lt;br /&gt;:syntax list&lt;br /&gt;&lt;br /&gt;Then just add that command to your .vimrc to make it permanent.&lt;br /&gt;&lt;br /&gt;Check out this help topic for more info:&lt;br /&gt;&lt;br /&gt;:h ft-syntax-omni&lt;br /&gt;&lt;br /&gt;*Updated&lt;br /&gt;&lt;br /&gt;And for the complete low down on the idiosyncrasies of each filetype check out: &lt;br /&gt;&lt;br /&gt;:h compl-omni-filetypes&lt;br /&gt;&lt;br /&gt;And here's another tip I picked up Ctrl-o : in insert mode will allow you to run a command and then return to insert mode.  Neatly avoiding the Esc : ... i or a syndrome.&lt;br /&gt;&lt;br /&gt;*Updated again&lt;br /&gt;&lt;br /&gt;FYI Pressing Ctrl-o in insert mode puts you in normal mode for one command.  You are not limited to using : to get to the ex command line.  You can use p to put or y to yank etc.&lt;br /&gt;&lt;br /&gt;*Further updates&lt;br /&gt;&lt;br /&gt;For those times when you just want to save keystrokes or avoid typos:&lt;br /&gt;&lt;br /&gt;Ctrl-P completes from previous words in document&lt;br /&gt;Ctrl-N completes from following words in document&lt;br /&gt;Ctrl-X Ctrl-F completes file names&lt;br /&gt;0 Ctrl-D removes all indent for the current line&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-6520269211660776432?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/6520269211660776432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=6520269211660776432" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/6520269211660776432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/6520269211660776432?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/irXpZEvnpfE/vim-auto-completion.html" title="Vim auto completion" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/03/vim-auto-completion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8CRXg4eip7ImA9WxVVEU4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-2773196414099591402</id><published>2009-03-03T21:04:00.004-05:00</published><updated>2009-03-03T21:14:24.632-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T21:14:24.632-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="climate" /><category scheme="http://www.blogger.com/atom/ns#" term="money" /><category scheme="http://www.blogger.com/atom/ns#" term="wind" /><category scheme="http://www.blogger.com/atom/ns#" term="collaboration" /><category scheme="http://www.blogger.com/atom/ns#" term="solar" /><category scheme="http://www.blogger.com/atom/ns#" term="species" /><category scheme="http://www.blogger.com/atom/ns#" term="green" /><category scheme="http://www.blogger.com/atom/ns#" term="survival" /><category scheme="http://www.blogger.com/atom/ns#" term="education" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="finance" /><category scheme="http://www.blogger.com/atom/ns#" term="liberty" /><category scheme="http://www.blogger.com/atom/ns#" term="fabrication" /><title>I think bio-engineering and habitat engineering are smarter</title><content type="html">I posted this in the comments section of a science post about the current thinking that the only solution to climate change is climate engineering. I think that is a back idea.  Not just because it encourages the fantasy of terraforming other planets and wild irrational space travel.  But also because it's a wrong headed idea based on a premise that we don't have the technology to survive and thrive in any environment.  It is only in our best interests to do so. My TEDTalks.com fueled diatribe follows.&lt;br /&gt;&lt;br /&gt;Geo-engineering is a bad idea and a waste of resources that should be going to bio-engineering and habitat engineering research, development, and manufacturing. The threats to our existence on our planet are much farther ranging than climate change. Climate change is a natural process. Ice ages are where the glaciers that created the great lakes and that have recently melted away in places came from. We've got a swing by the gravitational force of the black hole at the center of our galaxy through direct alignment with our Sun. Which should be an interesting demonstration of just how powerful the magnetic and gravitational field of a black hole at that distance is when focused through the gravitational field as powerful as our Suns. We've got the possiblities of several disasters that are happen on a cyclical basis around that same time. The two super volcanoes. One right here in or I should say that is Yellowstone Park. The occasional reversal, polarity flipping, and 1000 year disappearances of the earths magnetic field that coincidently keeps the Sun from burning off our atmosphere. There is also the Atlantic shelf that should wipe the Americas clear of anything not bedrock if it shifts significantly. And that is not even mentioning the many unmonitored solar objects which could really ruin our day or the fact that the moon is slowly floating away and will have a massive effect on our climate.&lt;br /&gt;&lt;br /&gt;My point is that if we are planning to survive beyond our infancy. Yes I say infancy because it is infantile to chase after the idea of money as a life goal. And yes I say idea because that is all money or any possession is. I say let us come up with a plan that lays out exactly what kind of technology we would need to survive all of these events. No, not survive, but thrive in the face of all of these events and more. The "rich" are holding back the future because it is unprofitable to them to have everyone off the grid and living free. If you could satisfy all of your energy needs from the Sun via locally and communally generated windpower, water power, sea power, thermoelectric, magnetosphere, solar collector, or what have you. And you dealt with others as equals. Everyone being responsible for themselves and the world as a whole without arbitrary governance by ignorance encouraged by profiteers. And you were educated about the realities of our ability to harness even the simplest of technologies to solve all of our problems like drought, famine, hunger, transportation, shelter, communication, and survival. You would no longer be a consumer. In fact for the cost of a car (~$20,000) you could buy all the equipment need to setup a microfactory and be a manufacturer. Check out http://www.fabathome.com/ and http://www.ted.com/index.php/talks/neil_gershenfeld_on_fab_labs.html Or check out the virtues of collaboration over institutions http://www.ted.com/index.php/talks/clay_shirky_on_institutions_versus_co... And check out 6 ways mushroms can save the world http://www.ted.com/index.php/talks/paul_stamets_on_6_ways_mushrooms_can_... Or open source architecture http://www.ted.com/index.php/talks/cameron_sinclair_on_open_source_archi... We need to collaborate on using the technology that is already available to build the technology needed to thrive during extreme adversity. We must evolve beyond the womb of the Earth. To do so we don't need to travel to other planets and terraform them to match our requirements. What we need is to evolve by raising the bar and saying we aren't dependent on a very fragile environment to survive. We have the technology we need the will.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-2773196414099591402?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/2773196414099591402/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=2773196414099591402" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2773196414099591402?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2773196414099591402?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/kqpP6yijyJ8/i-think-bio-engineering-and-habitat.html" title="I think bio-engineering and habitat engineering are smarter" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/03/i-think-bio-engineering-and-habitat.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkANRXo4fSp7ImA9WxVWEE0.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-4043331055503712590</id><published>2009-02-18T19:52:00.000-05:00</published><updated>2009-02-18T19:53:14.435-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-18T19:53:14.435-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="j" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="k" /><category scheme="http://www.blogger.com/atom/ns#" term="apl" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="c" /><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><title>Your Fancy Language is Burdensome and Dangerous</title><content type="html">I found this quote about the &lt;a href="http://en.wikipedia.org/wiki/PL/I"&gt;PL/I&lt;/a&gt; language in Wikipedia to be very poignant today. The quote's sentiment and the PL/I language are from the 1960's.&lt;br /&gt;&lt;blockquote&gt;PL/I is considered by some to be a turning point where it was found that large languages with a lot of complexity that allow programmers to do almost anything (such as coerce types with no semantic relationship to one another) are burdensome and dangerous rather than "more powerful."&lt;/blockquote&gt;&lt;br /&gt;It echoes my low opinion of most of the toy languages that seem to be escapees from a Compiler 101 college course masquerading as the cure for the inability of some people to program. I find it to be very relevant to the object oriented mass hysteria and popularity of the latest scripting languages of the moment.&lt;br /&gt;&lt;br /&gt;My opinion of C++ with the STL and templates and generic algorithms and iterators and iostreams is lower than my original opinion of C++ before it became standardized. What problem does all that junk solve. More to the point, what problem did object oriented programming ever solve beyond speed to delivery?&lt;br /&gt;&lt;br /&gt;Object oriented programming is a morass and a tar pit. It's the all promise and no delivery. It eats up 90% of your programming time forcing you to write witty little programming ditties when you should be writing elegant, concise solutions that aren't 90% object oriented overhead.&lt;br /&gt;&lt;br /&gt;Object oriented code hides not only the method invocation but also confuses the issue as to which method is actually called.  Multiple inheritance in C++ and other languages demonstrated that the only part of multiple inheritance worth saving in other new object oriented implementations was the interface definition which is basically a template which is basically a macro. It saves you the onerous task of cutting and pasting. In C it's called a macro and it's frowned upon because it obfuscates what the final code does and looks like.&lt;br /&gt;&lt;br /&gt;In summary. First write code quickly using only 10% of your programming time. Second scratch head and guesstimate what your code actually does and what are it's unintended consequences.  Third hope there aren't any bugs that make your invisible untraceable code do something you didn't intend and use more resources then are necessary to do it.&lt;br /&gt;&lt;br /&gt;I'm not saying I don't appreciate Python, Ruby, Perl, C++, Java, and the like. I'm just saying it's not that hard to write the little bit of code it takes to implement most software projects.  Especially since the main benefit of most new languages is their extensive built in libraries. Not that you couldn't do the same thing in C by including the proper headers and linking in the proper libraries. &lt;br /&gt;&lt;br /&gt;To be brutally honest I think in assembler so even C seems a bit like unnecessary overhead and a bunch of macros hiding the actual code. &lt;br /&gt;&lt;br /&gt;I've been reading up on a couple of APL like programming languages J and K but after reading some of the original code for the original J implementation all I see it a bunch of nested for loops creating everything on the stack and avoiding calls to the C standard library to allocate memory.&lt;br /&gt;&lt;br /&gt;Now I like APL and I hope to write my own version of it one day because it solves a real programming problem through it's expressiveness.  The problem it solves is how to communicate complex and simple vector and matrix operations programmatically to a computer without having to jam a for loop into your equation. The analogy would be the poor man's version tacked on to most of the recent programming languages with list comprehensions and regular expressions.  Which are not the same thing.&lt;br /&gt;&lt;br /&gt;There are some nice examples of &lt;a href="http://en.wikipedia.org/wiki/K_programming_language"&gt;K&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/J_programming_language"&gt;J&lt;/a&gt; at Wikipedia. I'm not recommending checking out APL as anything other than an educational exercise. I could kick myself for not learning it sooner as it shows how a well thought out programming language was written way back in time that blows the doors off all the fancy flavor of the year languages which waste our time by forcing us programmers to learn an unending stream of new syntax with exceptions that can't even express programming logic as simply and concisely as the A language, APL(A Programming Language) could more than half a century before.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-4043331055503712590?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/4043331055503712590/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=4043331055503712590" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4043331055503712590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4043331055503712590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/6nWA3LUVN_g/your-fancy-language-is-burdensome-and.html" title="Your Fancy Language is Burdensome and Dangerous" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/02/your-fancy-language-is-burdensome-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQHcycSp7ImA9WxVREk4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-7908890094629636318</id><published>2009-01-17T19:01:00.004-05:00</published><updated>2009-01-17T19:24:31.999-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-17T19:24:31.999-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="os x" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="wine" /><title>How to Mount an Old CDROM Disk on Mac OS X</title><content type="html">I had a little trouble with a really old &lt;a href="http://www.pcplus.co.uk/"&gt;PCPlus&lt;/a&gt; DVD on my Mac OS X Mac Book Pro.  I wanted to try to install some old Windows 95/98 compilers and software using Wine so I could do some Wine compatible Windows development on the cheap.  The old PCPlus DVD had a complete copy of Borland C++ Builder and Delphi and an old copy of IE4 and IE5 among other oldies that are hard to find without massive trojan infestations on the net these days.  These ancient versions are often the perfect solution to the problem of finding software that works on Wine and doesn't have an onerous disk space and .net requirement.&lt;br /&gt;&lt;br /&gt;The problem is I can't see all the files on the DVD.  I've seen this problem before and known that it has something to do with the Joliet File System extension.  Luckily there is a quick fix.  A quick check of the man page for mount and then mount_cd9660 shows that the -r and -j options to mount_cd9660 allow the mounting of ISO 9660 file systems while ignoring the Rock Ridge and Joliet specific extensions.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;umount /dev/disk1&lt;br /&gt;mkdir ~/DISK_LABEL&lt;br /&gt;/sbin/mount_cd9660 -r -j /dev/disk1 ~/DISK_LABEL&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And voila! All the files are there and all the files are mapped to uppercase.  No sudo is required with this method.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-7908890094629636318?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/7908890094629636318/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=7908890094629636318" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7908890094629636318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7908890094629636318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/juTeqrSpSGg/how-to-mount-old-cdrom-disk-on-mac-os-x.html" title="How to Mount an Old CDROM Disk on Mac OS X" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/01/how-to-mount-old-cdrom-disk-on-mac-os-x.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMCQ3Y-fip7ImA9WxVTGEQ.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-2972375461638855852</id><published>2009-01-02T06:48:00.002-05:00</published><updated>2009-01-02T06:57:42.856-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-02T06:57:42.856-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="green" /><title>The Story of Stuff</title><content type="html">This is a must see.  It connects all the dots in the global economy.  I saw this video over a year ago on Terra Nova.  It is now an approachable interactive evolving educational website.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-2972375461638855852?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://www.storyofstuff.com/" title="The Story of Stuff" /><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/2972375461638855852/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=2972375461638855852" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2972375461638855852?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/2972375461638855852?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/9EgxDL1DJ54/story-of-stuff.html" title="The Story of Stuff" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2009/01/story-of-stuff.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCQXc_fyp7ImA9WxRWFE0.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-1859277424941715722</id><published>2008-10-30T15:37:00.004-04:00</published><updated>2008-10-30T17:31:00.947-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-30T17:31:00.947-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="apc" /><category scheme="http://www.blogger.com/atom/ns#" term="shopping" /><category scheme="http://www.blogger.com/atom/ns#" term="phpinfo" /><category scheme="http://www.blogger.com/atom/ns#" term="store" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="magenta" /><category scheme="http://www.blogger.com/atom/ns#" term="cart" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="zen cart" /><title>Apache2 PHP config</title><content type="html">I am installing a couple of shopping cart online stores AKA commerce packages in order to evaluate them for use in an online store I'm setting up.  I did a little research and decided based on features and the one deal breaker required feature, Google Checkout, on two commerce packages. The first is &lt;a href="http://www.magentocommerce.com" title="Zen Cart"&gt;Zen Cart&lt;/a&gt; and the second is &lt;a href="http://www.magentocommerce.com" title="Magenta"&gt;Magenta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the commerce packages noted that one of the extension modules required enabling PHP short_tags. I had previously disabled php short_tags because it was preventing the use of the xml declaration tag at the top of my html files.&lt;br /&gt;&lt;br /&gt;I use XHTML 1.1 for all my HTML work. Converting every document I do significant work on to XHTML 1.1. So turning back on PHP short_tags in my HTML files was not an option.&lt;br /&gt;&lt;br /&gt;Luckily that was not necessary. I have enabled the PHP handler for .html and .xhtml files in my php5.conf located in /etc/apache2/conf.d/.  I have a few other PHP related configuration statements that are wrapped by an if module mod_php statement.&lt;br /&gt;&lt;br /&gt;I created a Files section within that if module mod_php that disables short tags only within .html and .xhtml files. Like so:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;IfModule mod_php5.c&amp;gt;&lt;br /&gt;  AddHandler application/x-httpd-php .html .xhtml&lt;br /&gt;  &amp;lt;Files ~ &amp;quot;\.x?html$&amp;quot;&amp;gt;&lt;br /&gt;    php_flag short_open_tag off&lt;br /&gt;  &amp;lt;/Files&amp;gt;&lt;br /&gt;  Alias /phpinfo /var/www/phpinfo.php&lt;br /&gt;  Alias /apcinfo /usr/share/php/apc.php&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I also have a couple of aliases in there that make useful system info URLs available automatically on all web hostnames. The PHP Alternative Cache, APC, has builtin PHP login security. I'm going to add PHP authentication to the phpinfo and post the code.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-1859277424941715722?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/1859277424941715722/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=1859277424941715722" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1859277424941715722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1859277424941715722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/wZvfxAfggTQ/apache2-php-config.html" title="Apache2 PHP config" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/10/apache2-php-config.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ESH44fCp7ImA9WxRWFE0.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-4214695843807981300</id><published>2008-10-30T12:18:00.005-04:00</published><updated>2008-10-30T18:15:09.034-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-30T18:15:09.034-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wordpress" /><category scheme="http://www.blogger.com/atom/ns#" term="problem" /><category scheme="http://www.blogger.com/atom/ns#" term="htmlentities" /><category scheme="http://www.blogger.com/atom/ns#" term="solution" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="sed" /><category scheme="http://www.blogger.com/atom/ns#" term="fix" /><title>Yikes backslash zero on wordpress.com</title><content type="html">I started a new blog at wordpress.com, &lt;a href="http://onelinercode.wordpress.com/" title="One Liner Code"&gt;One Liner Code&lt;/a&gt;. I was reviewing my posts when I realized that my &lt;a href="http://onelinercode.wordpress.com/2008/10/21/sed-one-liners-begin-with-e/" title="sed example"&gt;sed example&lt;/a&gt; didn't make sense to me. I didn't understand how I could have messed up such a simple example in the language that most easily lends itself to one liners. I thought I had double checked all of my examples and made sure they were running right. Turns out the html code looked fine. There was a preprocessor stepping in between me and my sed Hello World post. It was turning my backslash zero into a null.&lt;br /&gt;&lt;br /&gt;I whipped out my handy dandy php evaluator and encountered failure using the htmlentities() string function. php wouldn't give me the htmlentity code for characters that didn't need them. I decided to switch it up and get the charactor code using a ruby one liner:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ruby -e '"0".each_byte {|i| p i}'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I could have also used a php one liner like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;php -r 'echo ord("0")."\n";'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The quick fix \&amp;amp;#48; allowed the post preprocessor to accept the backslash zero and turn it into the correct character representation.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-4214695843807981300?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/4214695843807981300/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=4214695843807981300" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4214695843807981300?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4214695843807981300?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/svezuEVXQWA/yikes-backslash-zero-on-wordpresscom.html" title="Yikes backslash zero on wordpress.com" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/10/yikes-backslash-zero-on-wordpresscom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIDSH44eip7ImA9WxRQFEU.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-3886156681314750361</id><published>2008-09-09T14:59:00.006-04:00</published><updated>2008-10-08T12:16:19.032-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-08T12:16:19.032-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>iPhone Gurgling Water Noises and Dropped Calls</title><content type="html">Updated 2008-10-08:&lt;br /&gt;I traced the source of the problem back to smsnotify.  The daemon shell script runs through a tight loop repeatedly checking the voicemail and sms sqlite databases using the sqlite3 command.  I edited the script and put some bigger time delays between queries to the databases and a growing delay between vibrating alerts. The smsnotify default time delays can be a little disconcerting when you get a voicemail or SMS while on a call.  It also creates a problem when you put down your phone and leave it for an hour. A single voicemail or sms will run down your battery and wake you from your sleep with incessant vibration alerts every 10 seconds.&lt;br /&gt;&lt;br /&gt;Here is my version of the smsnotify.sh script.  The original post follows it.:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;#set -Tvx&lt;br /&gt;&lt;br /&gt;SMSNOTIFY_PATH=/usr/local/smsnotify&lt;br /&gt;SMSNOTIFY_SECONDS=30&lt;br /&gt;SMSNOTIFY_COUNT=0&lt;br /&gt;VMNOTIFY_SECONDS=30&lt;br /&gt;VMNOTIFY_COUNT=0&lt;br /&gt;&lt;br /&gt;while test 1&lt;br /&gt;do&lt;br /&gt;   if [ `echo 'select count(*) from message where \&lt;br /&gt;       flags=0;' | sqlite3 \&lt;br /&gt;       /var/mobile/Library/SMS/sms.db` -gt 0 ]&lt;br /&gt;   then&lt;br /&gt; if [ $SMSNOTIFY_COUNT -lt 2 ]&lt;br /&gt; then&lt;br /&gt;           SMSNOTIFY_SECONDS=10&lt;br /&gt;       elif [ $SMSNOTIFY_COUNT -lt 4 ]&lt;br /&gt; then&lt;br /&gt;           SMSNOTIFY_SECONDS=100&lt;br /&gt;       elif [ $SMSNOTIFY_COUNT -lt 5 ]&lt;br /&gt; then&lt;br /&gt;           SMSNOTIFY_SECONDS=1000&lt;br /&gt;       elif [ $SMSNOTIFY_COUNT -lt 6 ]&lt;br /&gt; then&lt;br /&gt;           SMSNOTIFY_SECONDS=2000&lt;br /&gt;       else&lt;br /&gt;           SMSNOTIFY_SECONDS=9000&lt;br /&gt;       fi&lt;br /&gt;       #Each parameter to vibrate is 1 more &lt;br /&gt;       #vibration, so vibrate 3 times&lt;br /&gt;       $SMSNOTIFY_PATH/vibrate 1 1&lt;br /&gt;       let SMSNOTIFY_COUNT+=1&lt;br /&gt;   else&lt;br /&gt;       SMSNOTIFY_SECONDS=30&lt;br /&gt;       SMSNOTIFY_COUNT=0&lt;br /&gt;   fi&lt;br /&gt;   /bin/sleep $SMSNOTIFY_SECONDS&lt;br /&gt;&lt;br /&gt;   if [ `echo 'select count(*) from voicemail \&lt;br /&gt;       where flags &amp;amp; 1 == 0;' | sqlite3 \&lt;br /&gt;       /var/mobile/Library/Voicemail/voicemail.db` -gt 0 ]&lt;br /&gt;   then&lt;br /&gt; if [ $VMNOTIFY_COUNT -lt 2 ]&lt;br /&gt; then&lt;br /&gt;           VMNOTIFY_SECONDS=10&lt;br /&gt;       elif [ $VMNOTIFY_COUNT -lt 4 ]&lt;br /&gt; then&lt;br /&gt;           VMNOTIFY_SECONDS=100&lt;br /&gt;       elif [ $VMNOTIFY_COUNT -lt 5 ]&lt;br /&gt; then&lt;br /&gt;           VMNOTIFY_SECONDS=1000&lt;br /&gt;       elif [ $VMNOTIFY_COUNT -lt 6 ]&lt;br /&gt; then&lt;br /&gt;           VMNOTIFY_SECONDS=2000&lt;br /&gt;       else&lt;br /&gt;           VMNOTIFY_SECONDS=9000&lt;br /&gt;       fi&lt;br /&gt;       #vibrate 2 times&lt;br /&gt;       $SMSNOTIFY_PATH/vibrate 1&lt;br /&gt; let VMNOTIFY_COUNT++&lt;br /&gt;   else&lt;br /&gt;       VMNOTIFY_SECONDS=30&lt;br /&gt;       VMNOTIFY_COUNT=0&lt;br /&gt;   fi&lt;br /&gt;   /bin/sleep $VMNOTIFY_SECONDS&lt;br /&gt;&lt;br /&gt;   #This program sleeps for 5 seconds then checks &lt;br /&gt;   #how long it's been sleeping.  If it's been more &lt;br /&gt;   #than 10 seconds the phone has slept and it exits, &lt;br /&gt;   #allowing the loop to continue&lt;br /&gt;   #$SMSNOTIFY_PATH/waitforsleep&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;# vim:ai:et:sw=4:sts=4:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I've been having all kinds of iPhone trouble acquiring signal, dropping calls, and the signal going in and out.  My voice sounded incoherent and was always accompanied by the gurgling sound of electronic water.&lt;br /&gt;&lt;br /&gt;The problem was of my own creation. I had jail broken my phone and installed all kinds of apps that had launched many server processes.  Most of the server processes failed to stop with a simple:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;su -c 'launchctl stop com.sourceforge.netatalk.afpd'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I ended up having to do a:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;su -c 'for i in /Library/LaunchDaemons/*;&lt;br /&gt;do launchctl unload $i;done'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I did the same for the ones installed in /System/Library/LaunchDaemons. I just limited the file glob expression to the services I wanted to unload as a plain * would probably force me to have to restore my iPhone. i.e. I used com.apple.mDNS* and other more specific file globbing expressions.&lt;br /&gt;&lt;br /&gt;Since all of my calls had garbled audio quality my first phone call verified that I had fixed the problem.  Also the fact that I had a crystal clear conversation with only one bar was the proof I needed.  As I hadn't been able to get my iPhone to dial most of the time with 3 bars.&lt;br /&gt;&lt;br /&gt;The only caveat is that inorder to renable these services you have to load the profiles again rather than doing a simple stop and then start.  I'll have to look into how those .plist files should be written so that the start and stop work properly and maybe even have  launchd do the listening for some of the services rather than having all of those services running unnecessarily.&lt;br /&gt;&lt;br /&gt;Hope this helps. It saved me from carrying a separate phone just for conversations.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-3886156681314750361?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/3886156681314750361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=3886156681314750361" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/3886156681314750361?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/3886156681314750361?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/TWMIjgf4tgI/iphone-gurgling-water-noises-and.html" title="iPhone Gurgling Water Noises and Dropped Calls" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/09/iphone-gurgling-water-noises-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCSX08fip7ImA9WxdbEE8.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-7754518002692946661</id><published>2008-08-01T16:34:00.004-04:00</published><updated>2008-08-06T07:27:48.376-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-06T07:27:48.376-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="command" /><category scheme="http://www.blogger.com/atom/ns#" term="ssh" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><category scheme="http://www.blogger.com/atom/ns#" term="CLI" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="scripting" /><title>Automate ssh-agent loading and sharing across logins</title><content type="html">When the keychain package is not available on a platform I usually use a simple script in my .profile or .bash_profile or .bashrc that loads or reuses an existing ssh-agent.&amp;nbsp; This allows me to load an ssh key once and use it in any terminal without any additional effort. Like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# ssh-agent sharing&lt;br /&gt;if [ -e ~/.ssh-agent ]; then&lt;br /&gt;  . ~/.ssh-agent&lt;br /&gt;else&lt;br /&gt;  eval $(ssh-agent|tee ~/.ssh-agent)&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I tried sprucing it up for Terminal on my iPhone because it starts 4 simultaneous terminals at the same time.  My first attempt was a dismal failure. I misguidedly added the following above the previous script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# ssh-agent sharing - failed multiple concurrent launch attempt&lt;br /&gt;if { ps awx |grep ssh-agent ; } then&lt;br /&gt;  if [ -e ~/.ssh-agent ]; then&lt;br /&gt;    . ~/.ssh-agent&lt;br /&gt;  else&lt;br /&gt;    killall ssh-agent&lt;br /&gt;    rm ~/.ssh-agent&lt;br /&gt;  fi&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I ended up finding a relatively simple file locking script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function my_lockfile ()&lt;br /&gt;{&lt;br /&gt;  TEMPFILE="$1.$$"&lt;br /&gt;  LOCKFILE="$1.lock"&lt;br /&gt;  { echo $$ &amp;gt; $TEMPFILE ; } &amp;amp;&amp;gt; /dev/null || {&lt;br /&gt;    echo "You don't have permission to access `dirname $TEMPFILE`"&lt;br /&gt;    return 1&lt;br /&gt;  }&lt;br /&gt;  ln $TEMPFILE $LOCKFILE &amp;gt;&amp;amp; /dev/null &amp;amp;&amp;amp; {&lt;br /&gt;    rm -f $TEMPFILE&lt;br /&gt;    return 0&lt;br /&gt;  }&lt;br /&gt;  kill -0 `cat $LOCKFILE` &amp;gt;&amp;amp; /dev/null &amp;amp;&amp;amp; {&lt;br /&gt;    rm -f $TEMPFILE&lt;br /&gt;    return 1&lt;br /&gt;  }&lt;br /&gt;  echo "Removing stale lock file"&lt;br /&gt;  rm -f $LOCKFILE&lt;br /&gt;  ln $TEMPFILE $LOCKFILE &amp;gt;&amp;amp; /dev/null &amp;amp;&amp;amp; {&lt;br /&gt;    rm -f $TEMPFILE&lt;br /&gt;    return 0&lt;br /&gt;  }&lt;br /&gt;  rm -f $TEMPFILE&lt;br /&gt;  return 1&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Which makes it relatively easy to rewrite the script like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;until my_lockfile ~/.sshagent; do&lt;br /&gt;sleep 1&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;if [ -z "$SSH_AGENT_PID" ]; then&lt;br /&gt;  if [ -e ~/.ssh-agent ]; then&lt;br /&gt;    . ~/.ssh-agent &amp;gt;&amp;amp; /dev/null&lt;br /&gt;  else&lt;br /&gt;    eval $(ssh-agent|tee ~/.ssh-agent) &amp;gt;&amp;amp; /dev/null&lt;br /&gt;  fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if ! ps -p "$SSH_AGENT_PID" &amp;gt;&amp;amp; /dev/null; then&lt;br /&gt;eval $(ssh-agent|tee ~/.ssh-agent) &amp;gt;&amp;amp; /dev/null&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;rm -f ~/.ssh-agent.lock&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The import part is the loop at the beginning of the script and the rm at the end.&lt;br /&gt;I could add in a timeout but the lockfile script is pretty good at cleaning up unused lock files.  Worst case scenario you can Ctrl-C to break out of the startup script.&lt;br /&gt;If you need help with the basics of using ssh keys and the ssh-agent follow this link:&lt;br /&gt;&lt;a href="http://www.webmonkey.com/tutorial/Automate_a_Remote_Login_Using_SSH-Agent"&gt;Automate a Remote Login Using SSH - Webmonkey&lt;/a&gt; &lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-7754518002692946661?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/7754518002692946661/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=7754518002692946661" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7754518002692946661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7754518002692946661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/cQchfqZgM8k/automate-ssh-agent-loading-and-sharing.html" title="Automate ssh-agent loading and sharing across logins" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/08/automate-ssh-agent-loading-and-sharing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ARn8_eSp7ImA9WxdQGEQ.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-5634292502751470118</id><published>2008-06-17T22:10:00.003-04:00</published><updated>2008-06-19T11:54:07.141-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-19T11:54:07.141-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="scripting" /><title>How to make history appendable across multiple concurrent bash shells</title><content type="html">I've been meaning to change the default bash setting in Debian/Ubuntu for saving the command history across multiple concurrent shells.&lt;br /&gt;&lt;br /&gt;Thought I'd document what I ended up doing.&lt;br /&gt;&lt;br /&gt;I added the following to the end of my ~/.bashrc&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# my settings&lt;br /&gt;shopt -s histappend&lt;br /&gt;shopt -s histverify&lt;br /&gt;set -b&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I got a litle carried away and added a couple of extra tweaks to suit my preferences. histverify lets you edit commands recalled from history expansion before executing them. set -b makes background process notification happen in real time rather than waiting for the next shell prompt.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-5634292502751470118?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/5634292502751470118/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=5634292502751470118" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5634292502751470118?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5634292502751470118?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/OECZmDvRviI/how-to-make-history-appendable-across.html" title="How to make history appendable across multiple concurrent bash shells" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/06/how-to-make-history-appendable-across.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMHRX04cSp7ImA9WxdaGEo.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-7946631180350534352</id><published>2008-06-17T19:45:00.007-04:00</published><updated>2008-08-27T19:07:14.339-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-27T19:07:14.339-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ac3" /><category scheme="http://www.blogger.com/atom/ns#" term="xvid" /><category scheme="http://www.blogger.com/atom/ns#" term="mythweb" /><category scheme="http://www.blogger.com/atom/ns#" term="3gp" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="amr" /><category scheme="http://www.blogger.com/atom/ns#" term="a52" /><category scheme="http://www.blogger.com/atom/ns#" term="dts" /><category scheme="http://www.blogger.com/atom/ns#" term="flv" /><category scheme="http://www.blogger.com/atom/ns#" term="gsm" /><category scheme="http://www.blogger.com/atom/ns#" term="ffmpeg" /><category scheme="http://www.blogger.com/atom/ns#" term="mp3" /><category scheme="http://www.blogger.com/atom/ns#" term="mythtv" /><category scheme="http://www.blogger.com/atom/ns#" term="3gp2" /><category scheme="http://www.blogger.com/atom/ns#" term="lame" /><title>ffmpeg with h.264 3gp/amr xvid lame/mp3 a52/ac3 dts aac</title><content type="html">I was going through the source for mythweb to find a good spot to insert code to setup and return VLC VOD links instead of simple http streams.&amp;nbsp; I followed the code for flash video .flv on the fly conversion and streaming with http range based seeking.&amp;nbsp; I was surpised to find a very simple and elegant ffmpeg based&amp;nbsp; CGI script doing all the work.&amp;nbsp; In /var/www/mythweb/modules/stream/handler.pl I found the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    elsif ($ENV{'REQUEST_URI'} =~ /\.flv$/i) {&lt;br /&gt;    # Print the movie&lt;br /&gt;        $ffmpeg_pid = open(DATA,&lt;br /&gt;            "$ffmpeg -y -i ".shell_escape($filename)&lt;br /&gt;            .' -s '.shell_escape("${width}x$height")&lt;br /&gt;            .' -r 24 -f flv -ac 2 -ar 11025&lt;br /&gt;            .' -ab '.shell_escape("${abitrate}k")&lt;br /&gt;            .' -b '.shell_escape("${vbitrate}k")&lt;br /&gt;            .' /dev/stdout 2&amp;gt;/dev/null |'&lt;br /&gt;            );&lt;br /&gt;        unless ($ffmpeg_pid) {&lt;br /&gt;            print header(),&lt;br /&gt;                  "Can't do ffmpeg:  $!";&lt;br /&gt;            exit;&lt;br /&gt;        }&lt;br /&gt;        print header(-type =&amp;gt; 'video/x-flv');&lt;br /&gt;        my $buffer;&lt;br /&gt;        while (read DATA, $buffer, 262144) {&lt;br /&gt;            print $buffer;&lt;br /&gt;        }&lt;br /&gt;        close DATA;&lt;br /&gt;        exit;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pretty cool.  I'm going to use this as a template for generating VLC VOD media on the fly using netcat.  More to follow.&lt;br /&gt;&lt;br /&gt;Anyway what happened is that I realized the flash video was working great but there was no audio.  Playing with ffmpeg on the command line using the parameters above clued me in.  ffmpeg didn't know how to decode AC3 and it also didn't know how to encode mp3.&lt;br /&gt;&lt;br /&gt;I was surpised to find that the Medibuntu ffmpeg was missing some codecs that I know ffmpeg supports.  I looked around the web for a way to compile ffmpeg with the missing codecs.&lt;br /&gt;&lt;br /&gt;I found a bunch of apt-get source ffmpeg style how to's and figured out the DEBIAN_BUILD_OPTIONS="risky" part.&lt;br /&gt;&lt;br /&gt;Had to install fakeroot to make the source by hand.&lt;br /&gt;&lt;br /&gt;Another site had the details for getting AMR/3GP/3GPP/3GP2 AKA AMR narrow band and wide band. Found the how to for ffmpeg for Debian at this &lt;a href="http://www.dassnagar.com/blogge/2008/02/06/ffmpeg-installation"&gt;page&lt;/a&gt;.  And the HOWTO with AMR at this &lt;a href="http://dev.gemin-i.org/wiki/index.php/Ffmpeg_install_instructions"&gt;page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I performed the following:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;sudo apt-get build-dep ffmpeg&lt;br /&gt;sudo aptitude install fakeroot liblame-dev liba52-0.7.4 liba52-dev libdts-dev libfaac0 libfaac0-dev libfaad0 libfaad-dev libxvidcore4 libxvidcore4-dev libx264-57 libx264-dev&lt;br /&gt;apt-get source ffmpeg&lt;br /&gt;wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip&lt;br /&gt;wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip&lt;br /&gt;unzip -q 26104-510.zip&lt;br /&gt;unzip -q 26204-510.zip&lt;br /&gt;cd ffmpeg-0.cvs20070307&lt;br /&gt;mkdir libavcodec/amr_float&lt;br /&gt;mkdir libavcodec/amrwb_float&lt;br /&gt;cd libavcodec/amr_float&lt;br /&gt;unzip -q ../../../26104-510_ANSI_C_source_code.zip&lt;br /&gt;cd ../../libavcodev/amrwb_float&lt;br /&gt;unzip -q ../../../26204-510_ANSI-C_source_code.zip&lt;br /&gt;cd ../..&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Ended up changing the following section in ffmpeg-0.cvs20070307/debian/rules in the source directory from this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;confflags += --enable-gpl --enable-pp --enable-swscaler --enable-pthreads&lt;br /&gt;confflags += --enable-libvorbis --enable-libtheora --enable-libogg --enable-libgsm&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;to this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;confflags += --enable-gpl --enable-pp --enable-swscaler --enable-pthreads&lt;br /&gt;confflags += --enable-libvorbis --enable-libtheora --enable-libogg --enable-libg&lt;br /&gt;confflags += --enable-x264 --enable-liba52 --enable-libdts --enable-amr_nb&lt;br /&gt;confflags += --enable-amr_wb&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And finally I performed the following in the extracted source directory:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;DEBIAN_BUILD_OPTIONS="risky" fakeroot debian/rules binary&lt;br /&gt;cd ..&lt;br /&gt;sudo dpkg -i *.deb&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-7946631180350534352?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/7946631180350534352/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=7946631180350534352" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7946631180350534352?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/7946631180350534352?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/jgQvbjR391Y/ffmpeg-with-h264-3gpamr-xvid-lamemp3.html" title="ffmpeg with h.264 3gp/amr xvid lame/mp3 a52/ac3 dts aac" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/06/ffmpeg-with-h264-3gpamr-xvid-lamemp3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYGQHY9eyp7ImA9WxdQGEQ.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-182110646039075803</id><published>2008-06-06T18:50:00.001-04:00</published><updated>2008-06-19T12:15:21.863-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-19T12:15:21.863-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="mythtv" /><category scheme="http://www.blogger.com/atom/ns#" term="firewire" /><category scheme="http://www.blogger.com/atom/ns#" term="kubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>My Working MythTV Firewire Fix</title><content type="html">Updated post 6/6/2008 - And now it is tested and working&lt;br /&gt;&lt;br /&gt;I finally found a working failsafe fix for my MythTV FireWire setup that doesn't require manual intervention to keep MythTV up and running.  In the MythTV startup script I repeatedly unload and reload the 1394 modules and then test to determine if the the firewire is working by checking for errors from my external channel changing program..&lt;br /&gt;&lt;br /&gt;I changed the following block in /etc/init.d/mythtv-backend&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;su - $USER -c "/usr/bin/mythprime"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;to this&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#until { su - $USER -c "/usr/bin/mythprime"|grep '1\ stbs\ primed'; };do&lt;br /&gt;    while sa3250ch 1 2&gt;&amp;1 | grep oops;do&lt;br /&gt;        modprobe -r dv1394&lt;br /&gt;        modprobe -r video1394&lt;br /&gt;        modprobe -r raw1394&lt;br /&gt;        modprobe -r ohci1394&lt;br /&gt;        modprobe -r ieee1394&lt;br /&gt;        modprobe raw1394&lt;br /&gt;        /bin/sleep 1&lt;br /&gt;    done&lt;br /&gt;#done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I had to less +F /var/log/mythtv/mythbackend.log.  So I could turn off then on the cable box using the power button when the MythTV backend was recording a show.  Nothing else seemed to get the video data flowing.  After getting the initial recording going it seems to work fine with later recordings.  Without the need for manual intervention.  I commented out my cron scripts as the latest version of MythTV seems much more robust and the cronjobs only created confusion when there is a problem that requires intervention.&lt;br /&gt;&lt;br /&gt;In my search for a completely automated solution I ended up changing the driver for my Time Warner supplied SA3250HD firewire to use a 100Mbps connection.&lt;br /&gt;&lt;br /&gt;This is the &lt;span style="text-decoration:line-through"&gt;third fourth &lt;/span&gt;fifth update to the details of my working MythTV firewire setup.  If I have any more updates I'll &lt;span style="text-decoration:line-through"&gt;make a new post&lt;/span&gt;continue to update this post.  &lt;span style="text-decoration:line-through"&gt;Looks good so far.&lt;/span&gt;It's working again.&lt;br /&gt;&lt;br /&gt;Latest change changed again:&lt;br /&gt;I have changed my channel changing binary to a scripted frontend.  I renamed the binary to sa3250ch.bin and made a /usr/local/bin/sa3250ch script like so.  I commented out what it used to do. Just changing the channel and letting the channel changes fail and miss recordings is fine.  When I find the time to find a channel changing script for the SA3250 using p2p I will post it here.:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;#/usr/local/bin/sa3250ch.bin 1&lt;br /&gt;#/usr/local/bin/sa3250ch.bin 1&lt;br /&gt;#/bin/sleep 1&lt;br /&gt;/usr/local/bin/sa3250ch.bin $1&lt;br /&gt;#/bin/sleep 2 &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-182110646039075803?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/182110646039075803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=182110646039075803" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/182110646039075803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/182110646039075803?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/Iz0C0M7uKu0/my-working-mythtv-firewire-fix.html" title="My Working MythTV Firewire Fix" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/05/my-working-mythtv-firewire-fix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUGQ3Y9eip7ImA9WxdRFU4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-8193222590499479234</id><published>2008-05-17T18:38:00.002-04:00</published><updated>2008-06-03T19:03:42.862-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-03T19:03:42.862-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="autofs" /><category scheme="http://www.blogger.com/atom/ns#" term="loop" /><category scheme="http://www.blogger.com/atom/ns#" term="automount" /><category scheme="http://www.blogger.com/atom/ns#" term="nfs" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="kubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Automounting Kubuntu NFS Shares in OS X Leopard</title><content type="html">I discovered this feature in OS X Leopard by accident.  I thought I was sshed into my Kubuntu home server.  I was having some problems with my NFS sharing setup across my MacBook Pro and Kubuntu boxes.  I resolved the problem very easily by editing the nfs defaults file and making sure stats and idmap2 were enabled.&lt;br /&gt;&lt;br /&gt;I was still having problems with a Seagate external USB drive.  I had previously dealt with the problem of the drive going to sleep forever by using sdparm to change the sleep timeout to a day and had a cron script tap the drive twice a day.  But the drive had been getting noticibly louder from constantly spinning.  A little research turned up an elegant fix using udev to set the drive can be restarted /sys filesystem attribute to true on creating the device node for the drive.&lt;br /&gt;&lt;br /&gt;Here's the trick for reference:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;$ cat /etc/udev/rules.d/local.rules&lt;br /&gt;# Seagate FreeAgent allow_restart fix (i/o errors)&lt;br /&gt;SUBSYSTEMS=="scsi",DRIVERS=="sd",ATTRS{vendor}=="Seagate*", ATTRS{model}=="FreeAgent*",RUN+="/bin/sh -c 'echo 1 &gt; /sys/class/scsi_disk/%k/allow_restart'"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now back to problem of the drive not mounting on boot.  I decided to install the autofsd and automount tools.  So that whether or not the  drive showed up at at a different SCSI device address it would mount at the same place.  I also wanted any access to the Seagate external drive to kick off a mount if the Seagate external USB wasn't already mounted and for the filesystem to be umounted when idle.&lt;br /&gt;&lt;br /&gt;Using automount/autofs would kill two problems I was having.  The first problem was that the drive wasn't unmounting before it went to sleep.  Leaving the filesystem locked and mounted to the ghost device.  The second problem was that I couldn't count on the drive being at the same device name.  I'm using the drive as the location of my MythTV recording directory and for my shared network file storage.&lt;br /&gt;&lt;br /&gt;Enabled auto.misc in /etc/auto.master and added these lines to /etc/auto.misc:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;mythtv  -fstype=reiserfs :LABEL=500gusb&lt;br /&gt;ubuntu          -fstype=iso9660,loop,ro :/mythtv/downloads/ubuntu-8.04-desktop-i386.iso&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I tried to get them to mount off the root filesystem but that is apparently a no no for automounting.  At least it didn't work for me.  A little filesystem linking covered that up.  Notice the fine LABEL=&lt;partition_label&gt; device syntax. :)  I added the Ubuntu ISO automounting and sharing so my other Kubuntu boxes could upgrade using the CD over NFS.  I left the autofs loop in there since it is pretty light weight.  It only mounts the image on access and unmounts it while idle.  It inspired me to fiddle with the /etc/auto.master on all the Kubuntu boxes and enable auto.net.  Allowing me to access the shared automounted filesystems with a simple reference to /net/&amp;lt;hostname&amp;gt;/&amp;lt;sharename&amp;gt;.&lt;br /&gt;&lt;br /&gt;The /etc/exports (I decided to export each automount individually because NFS complained in the logs about exporting /misc even though it worked with the crossmount option.):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;/misc/mythtv *.local(rw,async,nohide,no_root_squash,no_subtree_check,insecure) &lt;br /&gt;/misc/ubuntu *.local(rw,async,nohide,no_root_squash,no_subtree_check,insecure)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Which brings me back to my original point of accidentily finding that Mac OS X Leopard is using the proper auto.net script and that it is enabled by default.  Meaning ls /net/&amp;lt;hostname&amp;gt;/&amp;lt;sharename&amp;gt; automounts NFS shares - no configuration needed.  Allowing me to get rid of my netinfo custom automounts located under /mounts in the local netinfo directory.  I then turned my /mythtv directory into a  link using sudo -s and then ln -s /net/&amp;lt;hostname&amp;gt;/misc/mythtv /mythtv (I don't give my everyday account blanket sudo permissions ergo sudo -s first in order to execute a command without explicit sudo rights being granted).&lt;br /&gt;&lt;br /&gt;One final note.  Don't let the Finder make your links for you.  The aliases Finder creates are not soft links and are invisible to the POSIX subsystem and even some Cocoa apps.  Found that out the hard way.  Even scared me for a bit after all that fine setup work.  Nearly wiped the smug look off my face.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-8193222590499479234?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/8193222590499479234/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=8193222590499479234" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/8193222590499479234?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/8193222590499479234?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/ATq9fOOQSAM/automounting-kubuntu-nfs-shares-in-os-x.html" title="Automounting Kubuntu NFS Shares in OS X Leopard" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/05/automounting-kubuntu-nfs-shares-in-os-x.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQFQ3g9cSp7ImA9WxdRFU4.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-1592586613990077733</id><published>2008-05-03T09:20:00.002-04:00</published><updated>2008-06-03T19:05:12.669-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-03T19:05:12.669-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="x" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="setup" /><category scheme="http://www.blogger.com/atom/ns#" term="thinkpad" /><category scheme="http://www.blogger.com/atom/ns#" term="t22" /><category scheme="http://www.blogger.com/atom/ns#" term="install" /><category scheme="http://www.blogger.com/atom/ns#" term="notebook" /><category scheme="http://www.blogger.com/atom/ns#" term="savage" /><category scheme="http://www.blogger.com/atom/ns#" term="ibm" /><category scheme="http://www.blogger.com/atom/ns#" term="kubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="xorg" /><category scheme="http://www.blogger.com/atom/ns#" term="driver" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="t21" /><title>Ubuntu or Kubuntu on a IBM Thinkpad T21 or T22 Video Driver Fix</title><content type="html">I recently upgraded to Ubuntu 8.04 Hardy Heron and experienced problems with Xorg and my savage video card.&amp;nbsp; Traced it back to the AGPSize and AGPMode options for the savage driver.&amp;nbsp; Now have working 3D acceleration aka DRI and AIGLX.&amp;nbsp; I've been missing that since the upgrade to version 7.xx.&amp;nbsp; Turns out AGPSize defaults to a 16MB window which causes a lockup or failure on my IBM Thinkpad T21 and T22 with acceleration turned on.&amp;nbsp; The Thinkpads have only 8MB video ram.&lt;br /&gt;&lt;br /&gt;FYI I actually use Kubuntu but I upgraded all my Kubuntu systems just fine using the Ubuntu CD.&lt;br /&gt;&lt;br /&gt;The working, 3D accelerated xorg.conf from my IBM Thinkpad T22:&lt;br /&gt;&lt;br /&gt;# xorg.conf (X.Org X Window System server configuration file)&lt;br /&gt;#&lt;br /&gt;# This file was generated by dexconf, the Debian X Configuration tool, using&lt;br /&gt;# values from the debconf database.&lt;br /&gt;#&lt;br /&gt;# Edit this file with caution, and see the xorg.conf manual page.&lt;br /&gt;# (Type "man xorg.conf" at the shell prompt.)&lt;br /&gt;#&lt;br /&gt;# This file is automatically updated on xserver-xorg package upgrades *only*&lt;br /&gt;# if it has not been modified since the last upgrade of the xserver-xorg&lt;br /&gt;# package.&lt;br /&gt;#&lt;br /&gt;# If you have edited this file but would like it to be automatically updated&lt;br /&gt;# again, run the following command:&lt;br /&gt;#&amp;nbsp;&amp;nbsp; sudo dpkg-reconfigure -phigh xserver-xorg&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Generic Keyboard"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "kbd"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "XkbRules"&amp;nbsp;&amp;nbsp;&amp;nbsp; "xorg"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "XkbModel"&amp;nbsp;&amp;nbsp;&amp;nbsp; "pc101"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "XkbLayout"&amp;nbsp;&amp;nbsp;&amp;nbsp; "us"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "XkbOptions"&amp;nbsp;&amp;nbsp;&amp;nbsp; "lv3:ralt_switch"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Configured Mouse"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "mouse"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "CorePointer"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "EmulateWheel"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "EmulateWheelButton"&amp;nbsp;&amp;nbsp;&amp;nbsp; "2"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "ZAxisMapping"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "4 5 8 9"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Synaptics Touchpad"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "synaptics"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "SendCoreEvents"&amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Device"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "/dev/psaux"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Protocol"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "auto-dev"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "HorizEdgeScroll"&amp;nbsp;&amp;nbsp;&amp;nbsp; "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Configured Video Device"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "AGPMode"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "2"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "AGPSize"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "8"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "ShadowStatus"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "ShadowFB"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Option&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "NoAccel"&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Configured Monitor"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Screen"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Configured Monitor"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Configured Video Device"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultDepth&amp;nbsp;&amp;nbsp;&amp;nbsp; 16&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Layout"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Screen&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Screen"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #InputDevice&amp;nbsp;&amp;nbsp;&amp;nbsp; "Synaptics Touchpad"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-1592586613990077733?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/1592586613990077733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=1592586613990077733" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1592586613990077733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1592586613990077733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/zwFeasSdf1s/ubuntu-or-kubuntu-on-ibm-thinkpad-t21.html" title="Ubuntu or Kubuntu on a IBM Thinkpad T21 or T22 Video Driver Fix" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/05/ubuntu-or-kubuntu-on-ibm-thinkpad-t21.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8GR389fCp7ImA9WxZaFEo.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-6210750132099666003</id><published>2008-04-29T10:20:00.000-04:00</published><updated>2008-04-29T10:20:26.164-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-29T10:20:26.164-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wiimote" /><title>Johnny Chung Lee</title><content type="html">I'm already using my wiimote to control my MythTV.  But I want to try out some of the projects Johnny Lee has done with the wiimote.&lt;br /&gt;&lt;br /&gt;Video&amp;apos;s of &lt;a href="http://www.cs.cmu.edu/~johnny/projects/wii/"  title="Johnny Chung Lee"&gt;Johnny Chung Lee&lt;/a&gt; demoing innovative and useful applications of the Wii Remote for very low cost available at his website.&lt;br /&gt;&lt;br /&gt;and Johnny Lee's TED Talk:&lt;br /&gt;&lt;br /&gt;&lt;!--cut and paste--&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="432" height="285" id="VE_Player" align="middle"&gt;&lt;param name="movie" value="http://static.videoegg.com/ted2/flash/loader.swf"&gt;&lt;PARAM NAME="FlashVars" VALUE="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/JOHNNYLEE-2008_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true"&gt;&lt;param name="quality" value="high"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="scale" value="noscale"&gt;&lt;param name="wmode" value="window"&gt;&lt;embed src="http://static.videoegg.com/ted2/flash/loader.swf" FlashVars="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/JOHNNYLEE-2008_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true" quality="high" allowScriptAccess="always" bgcolor="#FFFFFF" scale="noscale" wmode="window" width="432" height="285" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-6210750132099666003?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://www.cs.cmu.edu/~johnny/projects/wii/" title="Johnny Chung Lee" /><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/6210750132099666003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=6210750132099666003" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/6210750132099666003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/6210750132099666003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/9H-yA8QmOYQ/johnny-chung-lee.html" title="Johnny Chung Lee" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/04/johnny-chung-lee.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cMRX89fCp7ImA9WxZaGE8.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-1237933137714117736</id><published>2008-04-28T06:03:00.006-04:00</published><updated>2008-05-03T09:24:44.164-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T09:24:44.164-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="futureshock" /><category scheme="http://www.blogger.com/atom/ns#" term="psychology" /><category scheme="http://www.blogger.com/atom/ns#" term="propaganda" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="science" /><category scheme="http://www.blogger.com/atom/ns#" term="sociology" /><category scheme="http://www.blogger.com/atom/ns#" term="green" /><title>A Briefer History of Time</title><content type="html">I am amazed at how many of the practical implications of a correct understanding of the universe and the implications of the Theory of Relativity are completely lost on most science fiction authors.  Either that or most authors are so concerned with the wrong headed idea that space travel and intergalactic communication are necessary that they gloss over the simple facts of physics.&lt;br /&gt;&lt;br /&gt;Time travel to the future is a practical reality.  I've read debates between characters in science fiction books about the effect of the constant acceleration of a gravity well like the earth on stationary objects on it's surface that seemed to be inconclusive.  Well physics defines time as relative and gravity wells as warped space time so guess what living on the Earth's surface is flinging us into the future by the very fact that a gravity well slows down time.  The reach and power of the Earth's warp on space and time is revealed in the orbit of the moon.  The moon is traveling in a straight line.  Space time is so warped by the density of matter at the center of the Earth that space time around the Earth is curved right around into a sphere!  The Earth is flat!  It's a space time plane warped into a sphere.&lt;br /&gt;&lt;br /&gt;The effect is very dramatic when you consider the fact that one second on the surface of the Sun is equivalent to one year on Earth.  Just think of the implications that the Mars Rovers have lasted not just a lot longer than they were designed to last but that they are also on a smaller planet with a smaller space time warp with a smaller slowing of time.  Meaning that even more time has passed for the rovers on Mars than for us on Earth.  Or you consider that voyager 1 has been travelling for over a decade without the benefit of any space time warp to slow down the passage of time for it except for the Sun.  It would be interesting to calculate an estimate of the real length of voyager 1's  journey as experienced by voyager 1 and then translated back into Earth years.&lt;br /&gt;&lt;br /&gt;I'm only halfway through the book and am heartened to read facts about our Universe that support my theory that space travel by humans is a waste of energy.  Any intelligent entity with a basic understanding of physics will know that in order to know anything about the Universe you only need to look inward to the quantum for understanding and outward to the universe for information.&lt;br /&gt;&lt;br /&gt;Makes me wonder why the author encourages space travel and colonization.  When it seems that sustainability and peaceful coexistence is a more reasonable approach to avoiding extinction.  I know there are extinction level events that will require preparation through technological advancement in order to avoid catastrophe.  Like supervolcanoes, super tsunamis, and ice ages.  But in my opinion a more concerted effort with global cooperation is required.  Instead of waiting for Ragnarok or Judgement Day and trying to start the whole process over again on another planet.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-1237933137714117736?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/1237933137714117736/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=1237933137714117736" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1237933137714117736?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/1237933137714117736?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/SCsUMsVKSdc/briefer-history-of-time.html" title="A Briefer History of Time" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/04/briefer-history-of-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEBRXo7eSp7ImA9WxZaE08.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-5645866023299288257</id><published>2008-04-27T15:14:00.002-04:00</published><updated>2008-04-27T15:30:54.401-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-27T15:30:54.401-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="futureshock" /><category scheme="http://www.blogger.com/atom/ns#" term="psychology" /><category scheme="http://www.blogger.com/atom/ns#" term="selfhelp" /><category scheme="http://www.blogger.com/atom/ns#" term="solution" /><category scheme="http://www.blogger.com/atom/ns#" term="therapy" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="autobiography" /><title>I joined Twitter</title><content type="html">That is the new stuff in the upper right corner of my blog.  After submitting to Friendster and resisting the urge or just not feeling the urge to join facebook, myspace, etc. I finally gave in to Twitter.  Twitter is just a chat space that can be real time but is more like a personal log.  If you want to remember what you did yesterday you can just look at your twitter page and hopefully if it was important you wrote something about it.  Since it works from SMS it is also a perfect way to remember things you need to check out wen you get back on-line.&lt;br /&gt;&lt;br /&gt;What I've learned since then is that if you follow tweets from your favorite bloggers that are on twitter you can quickly find a group of like minded or topic specific individuals to chat at and with.  It also adds an ability to my blog to micro-post by having the Twitter module embedded in the side.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-5645866023299288257?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://twitter.com/freegnu" title="I joined Twitter" /><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/5645866023299288257/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=5645866023299288257" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5645866023299288257?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/5645866023299288257?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/hxYx6PmLWjA/i-joined-twitter.html" title="I joined Twitter" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/04/i-joined-twitter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEGSHg5eip7ImA9WxZaE08.&quot;"><id>tag:blogger.com,1999:blog-8099334158764623276.post-4214783877208879288</id><published>2008-04-27T15:12:00.000-04:00</published><updated>2008-04-27T15:13:49.622-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-27T15:13:49.622-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="propaganda" /><category scheme="http://www.blogger.com/atom/ns#" term="energy" /><category scheme="http://www.blogger.com/atom/ns#" term="green" /><category scheme="http://www.blogger.com/atom/ns#" term="economy" /><title>Al Gore 2008 TED Talk Presentation</title><content type="html">Here is a link to the latest from Al Gore.  It's his TED talk.  It's considerably cut down and he's got a disclaimer saying he is invested in green technology.&lt;br /&gt;&lt;br /&gt;http://www.ted.com/talks/view/id/243&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-5690714104790968";
/* 468x15 blog post */
google_ad_slot = "3969771577";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8099334158764623276-4214783877208879288?l=freegnu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://freegnu.blogspot.com/feeds/4214783877208879288/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8099334158764623276&amp;postID=4214783877208879288" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4214783877208879288?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8099334158764623276/posts/default/4214783877208879288?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/freegnu/~3/zWbopxVw-yk/al-gore-2008-ted-talk-presentation.html" title="Al Gore 2008 TED Talk Presentation" /><author><name>DanyelLawson</name><uri>http://www.blogger.com/profile/01014355362548295298</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://3.bp.blogspot.com/_9WIoT0w7jks/SLiHg2xZT_I/AAAAAAAAAF0/p_Ey90PDARQ/S220/Me.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://freegnu.blogspot.com/2008/04/al-gore-2008-ted-talk-presentation.html</feedburner:origLink></entry></feed>

