<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Technology Blog of Peter Manis</title>
	
	<link>http://pyverted.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 20 Mar 2010 22:51:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/pyverted" /><feedburner:info uri="pyverted" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Switching to zsh</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/_NpaJBjVmFI/</link>
		<comments>http://pyverted.com/linux/switching-to-zsh/2010/02/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 20:57:04 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Zsh]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=496</guid>
		<description><![CDATA[I have never looked into using a different shell in Linux, I&#8217;m not entirely sure why, maybe I just liked bash enough.  This past week I started looking into zsh, and liked what I saw.  Last night I migrated my shell files to be 99.9% interchangeable between shells and continue to load what [...]]]></description>
			<content:encoded><![CDATA[<p>I have never looked into using a different shell in Linux, I&#8217;m not entirely sure why, maybe I just liked bash enough.  This past week I started looking into zsh, and liked what I saw.  Last night I migrated my shell files to be 99.9% interchangeable between shells and continue to load what I want without me having to change anything.</p>
<p>This post outlines some changes I made that will allow me to use both bash and zsh with the same startup files, but still have some shell specific settings that will get sourced.  I didn&#8217;t need to move the files to ~/.shellfiles, but I felt having all of them as symlinks instead of some being symlinks to other dotfiles.  Some of the shell specific things are setopt/shopt commands, setting prompts, and history settings.</p>
<p>I am storing the files in ~/.shellfiles, it isn&#8217;t my preferred choice, but it is less likely to be used by something else.  Since I use version control on my home directory I needed to first &#8216;hg rename&#8217; each one of my files to the ~/.shellfiles directory.  After moving the files symlinks needed to be created to the original files.<br />
<span id="more-496"></span></p>
<pre><code>.bash_logout -&gt; .shellfiles/logout
.bash_profile -&gt; .shellfiles/profile
.bashrc -&gt; .shellfiles/rc-shell
.profile -&gt; .shellfiles/profile
.zlogout -&gt; .shellfiles/logout
.zprofile -&gt; .shellfiles/profile
.zshenv -&gt; .shellfiles/env
.zshrc -&gt; .shellfiles/rc-shell</code></pre>
<p>Inside of ~/.shellfiles/profile two variables are set and two log entries are added to ~/.shellfiles/shell_history, which I added as a log of when shells are exec&#8217;d, what files are sourced, and the order they are sourced.  The following shows what happens when I login, open a shell, do some work, and then switch from zsh to bash.</p>
<pre><code>################################# LOGIN ########################################
02/20/10 10:19:12
 .shellfiles/profile

02/20/10 10:19:12
 .shellfiles/rc-shell
 .shellfiles/rc-zsh
 .shellfiles/completion-zsh
 .shellfiles/functions
 .shellfiles/aliases

02/20/10 10:19:36
 .shellfiles/env

02/20/10 10:19:36
 .shellfiles/rc-shell
 .shellfiles/rc-zsh
 .shellfiles/completion-zsh
 .shellfiles/functions
 .shellfiles/aliases

02/20/10 10:19:41
 .shellfiles/rc-shell
 .shellfiles/rc-bash
 .shellfiles/completion-bash
 .shellfiles/functions
 .shellfiles/aliases</code></pre>
<p>From time to time I need to refresh a file like my aliases or functions so I created a function, &#8216;refresh&#8217;, that I can run to source files and take into account dependencies and add the log entry for that file.  So that if I run &#8216;refresh aliases&#8217;, I would have a history entry like this.</p>
<pre><code>02/20/10 10:47:30
 .shellfiles/aliases</code></pre>
<p>I&#8217;ll admit the shell history might be a bit overboard, but I needed to implement it when I was initially splitting up files so that I could ensure the correct files were sourced in various situations.</p>
<p>Within ~/.shellfiles/rc-shell I have a section at the top that sources shell specific files, and below that it has shared exports, sourced files, and operations.</p>
<pre><code>if [ -z "$ZSH_VERSION" ] &amp;&amp; [ -z "$BASH_VERSION" ]; then
  CUR_SHELL=$(echo $SHELL  | awk -F'/' '{print $NF}')
elif [ -n "$BASH_VERSION" ]; then
  CUR_SHELL='bash'
elif [ -n "$ZSH_VERSION" ]; then
  CUR_SHELL='zsh'
else
  CUR_SHELL='bash'
fi

printf "\n$(date +"%D %T") \n .shellfiles/rc-shell\n" &gt;&gt; $SHELLHISTORY

if [ -f "$SHELLFILES/rc-$CUR_SHELL" ]; then
  . "$SHELLFILES/rc-$CUR_SHELL"
fi

#------------------------------------------------------------------------------#

# Shared between zsh and bash

if [ -f "$SHELLFILES/functions" ]; then
  . "$SHELLFILES/functions"
fi
.....</code></pre>
<p>When a user is logging into the system the actual version of the shell is not available, so you need to base the startup files on the user&#8217;s shell.  Within a console or within a script the versions are available, so if when you open a terminal it will determine if it is bash or zsh based on checking if the version variable for each shell has a value greater than 0.  Once the it is known what shell we are in the proper files will be sourced.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/switching-to-zsh/2010/02/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/switching-to-zsh/2010/02/</feedburner:origLink></item>
		<item>
		<title>First PGP Key Signing Party</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/xck337GBFks/</link>
		<comments>http://pyverted.com/security/first-pgp-key-signing-party/2010/01/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:09:21 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Key Signing]]></category>
		<category><![CDATA[PGP]]></category>
		<category><![CDATA[PIUS]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=436</guid>
		<description><![CDATA[Friday was my first time attending a PGP key signing party.  We had it in one of the buildings on campus and I thought I would share some of the commands I used to handle all the certificates.  I created a method for handling key signing parties while I did this one, but [...]]]></description>
			<content:encoded><![CDATA[<p>Friday was my first time attending a PGP key signing party.  We had it in one of the buildings on campus and I thought I would share some of the commands I used to handle all the certificates.  I created a method for handling key signing parties while I did this one, but I think this is a fairly good method.  What it basically does is keeps specific users in your pubring.gpg, while people at keysigning parties are in specific keyrings.  When defining them in your gpg.conf file they will be included in all of your GPG operations so it will be like they were in your pubring.gpg keyring.  It also means that if you don&#8217;t associate with anyone in the keysigning parting you can just comment out the file and still have the keys for later use or for archival purposes.</p>
<p>I first wanted to have these be in a specific keyring for the purposes of knowing who was at each keysigning.  To make sure your key gets added to the keyring you need to specify not to use the default keyring and use a specific keyring..  Make sure you include your keyid in the list of keys to pull from the keyserver as it will be needed when PIUS runs against the specific keyring.<br />
<span id="more-436"></span><br />
I added this to my ~/.gnupg/gpg.conf file so I can have all the keyrings included all the time.</p>
<pre><code># List of keyrings
# Key Signing Party, 2010-01-22
keyring keysign-20100122.gpg</code></pre>
<pre><code>touch ~/.gnupg/keysign-20100122.gpg
gpg --no-default-keyring --keyring keysign-20100122.gpg --recv-keys F6F08D6A ...</code></pre>
<p>With your key and the keys of the other participants in the new keyring download <a href="http://www.phildev.net/pius/" target="_blank">PIUS</a>, a tool written by a friend and coworker, Phil Dibowitz.  I preferred having it installed in ~/bin since that is added to my path automatically.</p>
<p>After it is installed run it against the keyring you created.  The example below works with Gmail/Google Apps mail accounts.</p>
<pre><code>KEYID="F6F08D6A"
USER="peter.manis@gmail.com"
MAIL="-P 587 -H smtp.gmail.com"
pius -s $KEYID -u $USER $MAIL -A -r keysign-20100122.gpg</code></pre>
<p>We had to add our key to the keysign-20100122.gpg keyring so PIUS would use it to sign keys.  So we don&#8217;t really need it in that keyring anymore.  The problem with removing it is that GPG requires the secret key be deleted first so we need to work around this.  Please <b>BACKUP</b> your files first so that if you make a mistake you don&#8217;t delete you entire keyring.</p>
<pre><code>touch ~/.gnupg/empty.gpg
gpg --no-default-keyring --secret-keyring empty.gpg --delete-key F6F08D6A</code></pre>
<p>My method for importing the keys was copying the PGP message in the email and saving it to a file with the extension &#8216;gpg&#8217;.  After that I was able to run the following for loop and import them all.</p>
<pre><code>for i in $(ls *.gpg); do cat $i | gpg -d | gpg --import; done</code></pre>
<p>Now you can send the key to the keyservers</p>
<pre><code>servers="x-hkp://pool.sks-keyservers.net pgp.mit.edu"
for server in $servers
    do gpg --keyserver $server --send-key F6F08D6A
done</code></pre>
<p>Over time you need to refresh your keys since the other people will have signatures added to their keys.</p>
<pre><code>gpg --refresh-keys</code></pre>
<p>If you need to refresh keys in files you don&#8217;t have in gpg.conf you can run this</p>
<pre><code>gpg --no-default-keyring --refresh-keys --keyring keysign-20100122.gpg</code></pre>
<p>UPDATE: I would recommend maybe setting a variable before starting this with the details that will be used multiple times and substitute it in the commands above.</p>
<pre><code>KEYID='F6F08D6A'
KEYRING=''keysign-20100122.gpg"</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/security/first-pgp-key-signing-party/2010/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/security/first-pgp-key-signing-party/2010/01/</feedburner:origLink></item>
		<item>
		<title>Suggested change to aliasing commands</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/L4ZCYQR300w/</link>
		<comments>http://pyverted.com/linux/suggested-change-to-aliasing-commands/2010/01/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 06:50:15 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Commands]]></category>
		<category><![CDATA[Sys Admin]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=425</guid>
		<description><![CDATA[When I wrote the code to automatically generate aliases for hosts in my SSH config I started thinking about how checks are never done to verify we are not overriding an existing alias.  This is my solution for it.  I almost think that alias should be an alias for register_alias so that all [...]]]></description>
			<content:encoded><![CDATA[<p>When I wrote the code to automatically generate aliases for hosts in my SSH config I started thinking about how checks are never done to verify we are not overriding an existing alias.  This is my solution for it.  I almost think that alias should be an alias for register_alias so that all aliases get checked, but I&#8217;m sure there could be an instance where it would break something.  Let me know what you think about assigning aliases this way.</p>
<pre><code># .bash_functions
function register_alias() {
  local alias=$(echo $* | cut -d'=' -f 1)
  local TEMP_CMD=$(which $alias)
  local TEMP_ALIAS=$(echo "`alias`" | sed 's/alias\ \(.*\)=.*/\1/' | grep ^$alias$)
  if [ ${#TEMP_CMD} -gt 0 ]; then
    echo "Alias $alias conflicts with command $TEMP_CMD"
  elif [ ${#TEMP_ALIAS} -gt 0 ]; then
    echo "Alias $alias conflicts with alias $alias"
  else
    alias "$*"
  fi
}</code></pre>
<pre><code># .bashrc
if [ -f ~/.bash_functions ]; then
  . ~/.bash_functions
fi</code></pre>
<pre><code># .bash_aliases

register_alias sls='screen -ls'
register_alias sdr='screen -d -r'</code></pre>
<p><b>Update</b>: I changed the TEMP_ALIAS line to use sed instead of cut/sed</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/suggested-change-to-aliasing-commands/2010/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/suggested-change-to-aliasing-commands/2010/01/</feedburner:origLink></item>
		<item>
		<title>Various aliases and short scripts</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/maKSPETgL6k/</link>
		<comments>http://pyverted.com/linux/various-aliases-and-short-scripts/2010/01/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 04:14:10 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sys Admin]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=412</guid>
		<description><![CDATA[There are some aliases and small scripts I use on a normal basis.
I prefer to just type in the machine I want to ssh to instead of typing ssh in front of it.  This chunk of code goes in my ~/.bashrc file and creates an alias for each &#8220;Host &#8230;&#8221; entry in ~/.ssh/config.  [...]]]></description>
			<content:encoded><![CDATA[<p>There are some aliases and small scripts I use on a normal basis.</p>
<p>I prefer to just type in the machine I want to ssh to instead of typing ssh in front of it.  This chunk of code goes in my ~/.bashrc file and creates an alias for each &#8220;Host &#8230;&#8221; entry in ~/.ssh/config.  It checks to see if there is an existing command that matches the Host entry, and alerts you if there is a conflict</p>
<pre><code># Generate SSH aliases
for host in $(grep ^Host .ssh/config | sed s/Host\ //g); do
  TEMP_CMD=$(which $host)
  TEMP_ALIASES=$(echo "`alias`" | sed 's/alias\ \(.*\)=.*/\1/' | grep ^$host$)
  if [ ${#TEMP_CMD} -gt 0 ]; then
    echo "Alias $host conflicts with command $TEMP_CMD"
  elif [ ${#TEMP_ALIASES} -gt 0 ]; then
    echo "Alias $host conflicts with alias $host"
  else
    alias $host="ssh $host"
  fi
done</code></pre>
<p>When you open a terminal you will see something like this if you have conflicts.</p>
<pre><code>Alias www conflicts with alias www
Alias hg conflicts with command /usr/bin/hg
Alias git conflicts with command /usr/bin/git
[20:05:21] manis@baron:~$</code></pre>
<p><span id="more-412"></span><br />
Thing things I need to do on a normal basis with screen is list the sessions, and attach an already attached session.  The sdr alias can have a session appended to it, or run by itself if you only have one session.</p>
<pre><code># Screen Aliases
alias sls='screen -ls'
alias sdr='screen -d -r'</code></pre>
<p>There are a few commands I just think are way too long, these make it a little faster to do things, the alias md5 will make it easier to move back and forth between OS X and Linux.</p>
<pre><code># Command Shortening Aliases
alias md5='md5sum'
alias sha='sha256sum'
alias p='/usr/bin/python2.5'</code></pre>
<p>Simple ls aliases, should be pretty straight forward.</p>
<pre><code># ls Aliases
alias lsd='ls --group-directories-first'
alias lsl='ls -l'
alias lsh='ls -lh'
alias ls1='ls -1'</code></pre>
<p>The first alias here, just mounts a given ISO ($1) at mount point ($2).  The 2nd is a manual mount for my filer.  I didn&#8217;t want it automounting since it would give someone access to pretty much everything I have.  A quick line count alias, quickie to grep history, and an alias to give me the size of a folder only showing 1 level below.  The last alias in this group creates a screen session with the name irssi and executes irssi in side of it, but it also detaches the session.  This was created because a lot of times I wanted to start irssi in the background, but didn&#8217;t want to have to detach the screen session.</p>
<pre><code># Various
alias iso='sudo mount -o loop $1 $2'
alias mount.filer='sudo mount host:/dir /dir'
alias lc='wc -l'
alias gh='history | grep'
alias fs='du --max-depth=1 -h'
alias irc='screen -d -m -S irssi /usr/bin/irssi'</code></pre>
<p>This is a short script, that could probably be made into a one line alias.  It uses screen to connect to a USB serial adapter.  By default it connects at 115200, but the speed can easily be changed&#8230; &#8217;s 9600&#8242;</p>
<pre><code>#!/bin/bash

if [ $# -ne 1 ]; then
  SPEED=115200
else
  SPEED=$1
fi

screen /dev/ttyUSB0 $SPEED</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/various-aliases-and-short-scripts/2010/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/various-aliases-and-short-scripts/2010/01/</feedburner:origLink></item>
		<item>
		<title>Random Tech Happenings</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/JldnLOlx4Cg/</link>
		<comments>http://pyverted.com/random/random-tech-happenings/2010/01/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 06:31:34 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Cabinet]]></category>
		<category><![CDATA[LTS]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=409</guid>
		<description><![CDATA[Being without a desktop I fell a bit behind on what all was going on in a lot of areas, mainly because I wasn&#8217;t doing much outside of just my standard use and work.  I just found out about Ubuntu&#8217;s Enterprise Cloud feature in Ubuntu Server 9.10.  It looks very interesting, and I [...]]]></description>
			<content:encoded><![CDATA[<p>Being without a desktop I fell a bit behind on what all was going on in a lot of areas, mainly because I wasn&#8217;t doing much outside of just my standard use and work.  I just found out about Ubuntu&#8217;s Enterprise Cloud feature in Ubuntu Server 9.10.  It looks very interesting, and I look forward to giving it a try.  I am however unclear on how data is stored on disk, does it use parity, or store multiple copies? I wasn&#8217;t able to find much information on this.</p>
<p>I installed Lucid Lynx, the upcoming LTS release of Ubuntu.  It is currently in its alpha stage, and when I get my desktop set back up I will reinstall to Lucid Lynx.  The performance was suffering greatly running in a VM on my laptop, I really want to see how it will perform with the SSD.</p>
<p>I am really unsure what I want to do with my cabinet.  I certainly don&#8217;t want to sell it, but it is taking up significant space and I don&#8217;t have use for much of the equipment right now.  If I end up not getting a roommate I can put it in the 2nd bedroom in a couple months, but for right now I have it sitting in the living room, and it is taking up more space than I&#8217;d like.</p>
<p>Well thats all the randomness I can go on about right now.  I&#8217;m tired, and my back hurts and I haven&#8217;t been doing much outside of work.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/random/random-tech-happenings/2010/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/random/random-tech-happenings/2010/01/</feedburner:origLink></item>
		<item>
		<title>Move to Cherokee</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/U_fUWK1Gnm0/</link>
		<comments>http://pyverted.com/linux/move-to-cherokee/2009/12/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 09:51:13 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cherokee]]></category>
		<category><![CDATA[Web Server]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=404</guid>
		<description><![CDATA[I just finished moving everything over to Cherokee and thus far I am really enjoying it.  It has a built in Admin interface that handles graceful restarts, a long long list of features, and from what I have read it has very good performance.
Right now I am talking with some people about the very [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished moving everything over to <a href="http://www.cherokee-project.com" target="_blank">Cherokee</a> and thus far I am really enjoying it.  It has a built in Admin interface that handles graceful restarts, a long long list of features, and from what I have read it has very good performance.</p>
<p>Right now I am talking with some people about the very interesting <a href="http://www.cherokee-project.com/doc/modules_handlers_dbslayer.html" target="_blank">MySQL bridge integrated in Cherokee</a>.  The bridge allows you to send commands in a language and have it returned in the same language.  So you can use Ruby, Python, JSON or PHP to send your SQL command and you will get your results back in the same language.  There is built in media streaming support, built in SSL/TLS, support for FastCGI, SCGI, uWSGI, and tons more stuff.</p>
<p>I encourage you to check it out.  I will definitely be posting more about Cherokee in coming weeks when I test out the MySQL bridge and compare it to the performance with the MySQL module for Python.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/move-to-cherokee/2009/12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/move-to-cherokee/2009/12/</feedburner:origLink></item>
		<item>
		<title>Google Chrome on Linux</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/O01q3x6YrGU/</link>
		<comments>http://pyverted.com/linux/google-chrome-on-linux/2009/09/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 00:58:40 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=398</guid>
		<description><![CDATA[This won&#8217;t be long, I just want to go over a couple things about Chrome on Linux.  So first off, its fast, super duper fast.  I am running Chrome on 64bit Ubuntu 9.04 with a SSD and Chrome starts up faster than pretty much anything else.
If you aren&#8217;t able to get your GTK [...]]]></description>
			<content:encoded><![CDATA[<p>This won&#8217;t be long, I just want to go over a couple things about Chrome on Linux.  So first off, its fast, super duper fast.  I am running Chrome on 64bit Ubuntu 9.04 with a SSD and Chrome starts up faster than pretty much anything else.</p>
<p>If you aren&#8217;t able to get your GTK theme to work apply one of the other themes available, and then select use GTK theme.</p>
<p>Also if you want to enable Flash do the following</p>
<pre><code>$ sudo updatedb
$ locate libflashplayer.so
$ mkdir /opt/google/chrome/plugins/
$ cp [insert libflashplayer.so location here] /opt/google/chrome/plugins/</code></pre>
<p>Now change the shortcut for Chrome to</p>
<pre><code>/opt/google/chrome/google-chrome --enable-plugins %U</code></pre>
<p>Enjoy the speed and smoothness that is Chrome.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/google-chrome-on-linux/2009/09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/google-chrome-on-linux/2009/09/</feedburner:origLink></item>
		<item>
		<title>Python Zipfile support</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/9Eb2isxnOFU/</link>
		<comments>http://pyverted.com/python/python-zipfile-support/2009/08/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 04:34:06 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Python 2.6]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=378</guid>
		<description><![CDATA[One of my favorite features in Python 2.6 is zipfile support.  It is mentioned it was changed in 2.5, but so far I have not been able to get it to work.  Basically you create a __main__.py file that will act very much like __main__ does in scripts.  You can then make [...]]]></description>
			<content:encoded><![CDATA[<p>One of my favorite features in Python 2.6 is zipfile support.  It is mentioned it was changed in 2.5, but so far I have not been able to get it to work.  Basically you create a __main__.py file that will act very much like __main__ does in scripts.  You can then make a zip file of your Python code and execute it directly.  If you want to read more about it you can read it on the <a href="http://docs.python.org/using/cmdline.html" target="_blank">command line page</a> of the Python documentation.<br />
<span id="more-378"></span><br />
Here is an example you would put in __main__.py</p>
<pre name="code" class="python:nogutter">
#/usr/bin/python2.6
#
# ziptest.py
import sys
print sys.argv
</code></pre>
<p>and for the sake of this example we will have another file with the header.  The best thing to do would be to make a system that added this to the beginning of the file when building it.  We will name this file zip_template.py</p>
<pre name="code" class="python:nogutter">
#/usr/bin/python2.6
#
# Copyright 2009, ME</code></pre>
<p>So lets zip up the __main__.py file and then concatenate the two files together to create our archive.  We also need to make it executable.</p>
<pre><code>$ zip tmp_appname.zip __main__.py
$ cat zip_template.py tmp_appname.zip &gt; appname.zip
$ rm tmp_appname.zip
$ chmod +x appname.zip
$ ./appname.zip
['./appname.zip']</code></pre>
<p>There you have it.  You can now bundle your Python code in a zip file and run it just like you would a Java jar.  It also doesn&#8217;t have to end with .zip you can name it .par or no extension at all if you like.</p>
<p>I would like to see <a href="http://bugs.python.org/issue6749" target="_blank">support for encrypted zip files</a> so that you can encrypt this archive and Python will prompt for the password.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/python/python-zipfile-support/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/python/python-zipfile-support/2009/08/</feedburner:origLink></item>
		<item>
		<title>Endian Firewall Hostname Limitation</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/C_sJej7smiw/</link>
		<comments>http://pyverted.com/linux/endian-firewall-hostname-limitation/2009/08/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 02:40:34 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Endian]]></category>
		<category><![CDATA[Firewall]]></category>
		<category><![CDATA[Networking]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=376</guid>
		<description><![CDATA[Endian firewall seems to have a hostname limitation in their web interface that requires at least 3 characters.  I prefer a hostname that is shorter than that so I had to track down the settings to change it.  There are two files that you have to change.
/var/efw/main/settings
     HOSTNAME=$hostname
/var/efw/main/hostname.conf
  [...]]]></description>
			<content:encoded><![CDATA[<p>Endian firewall seems to have a hostname limitation in their web interface that requires at least 3 characters.  I prefer a hostname that is shorter than that so I had to track down the settings to change it.  There are two files that you have to change.</p>
<pre><code>/var/efw/main/settings
     HOSTNAME=$hostname
/var/efw/main/hostname.conf
     ServerName $hostname</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/endian-firewall-hostname-limitation/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/endian-firewall-hostname-limitation/2009/08/</feedburner:origLink></item>
		<item>
		<title>Using Mercurial on your home directory</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/sEtE62Vdyeo/</link>
		<comments>http://pyverted.com/version-control/using-mercurial-on-your-home-directory/2009/08/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 00:34:30 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Version Control]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mercurial]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=353</guid>
		<description><![CDATA[This is a follow up to my previous post, Setting Up Version Control On Your Home Directory.  This post will cover using Mercurial instead of Git to store the files in your home directory.
To start this off you need to install Mercurial
sudo [yum or apt-get] install mercurial

The next step is initializing the repository in [...]]]></description>
			<content:encoded><![CDATA[<p>This is a follow up to my previous post, <a href="http://pyverted.com/linux/setting-up-version-control-on-your-home-directory/2009/08/" target="_blank">Setting Up Version Control On Your Home Directory</a>.  This post will cover using Mercurial instead of Git to store the files in your home directory.</p>
<p>To start this off you need to install Mercurial</p>
<pre><code>sudo [yum or apt-get] install mercurial</code></pre>
<p><span id="more-353"></span><br />
The next step is initializing the repository in your home directory and protect others from being able to read files.</p>
<pre><code>$ cd ~
$ hg init
$ chmod 700 .hg/</code></pre>
<p>In my previous post a commenter pointed out something I was not aware of.  When using git if you were to run &#8216;git clean&#8217; all files not under version control would get deleted.  You should be doing regular backups anyway, but that is certainly something we do not want to be able to do on accident.  The hg equivalent is &#8216;hg purge&#8217;, but purge is a bundled extension that must be enabled, and because it might be enabled we want to explicitly disable that plugin from being able to work in our repository.  To do so you put the following line in ~/.hg/hgrc, because that file will take precedence over conf files in etc and your ~/.hgrc file.</p>
<pre><code>[extensions]
hgext.purge = !</code></pre>
<p>You can store anything you would like to in this repository, but there is most likely going to be some files, and very large files at that, that you do not want to store.  To fix that we are going to start off by ignoring everything in your home directory and selectively removing files from the list that we want to store.  The following commands are going to list all non-hidden files, but listing directories first, the second command lists everything except for &#8216;.&#8217; and &#8216;..&#8217; directory references and greps for all hidden files and lists them directories first.  One thing to note is that the &#8211;group-directories-first option is not available on CentOS and the only distro I can confirm it exists in is Ubuntu.</p>
<pre><code>$ ls -1 --group-directories-first &gt; .hgignore
$ ls -1 --group-directories-first -A | grep '^\.' &gt;&gt; .hgignore
$ cat .hgignore
Applications
bin
Desktop
...
.cache
.checkbox
.compiz
...
.bash_aliases
.bash_history
.bash_logout
...
.xsession-errors</code></pre>
<p>Go through the list and either comment out (prepend with #) or remove from .hgignore any file/directory names that you DO want to store in version control, any file listed in .hgignore will be ignored by mercurial, unless you &#8216;hg add&#8217; the file or directory.</p>
<p>If you want to see what files will be picked up by an &#8216;hg add&#8217; you can run &#8216;hg status&#8217;</p>
<pre><code>$ hg status
? .bash_history
? .bash_logout
? .bash_profile
? .bashrc
? .hgignore
? .hgrc
? .mysql_history
? .screenrc
? bin/mysqltuner.pl</code></pre>
<p>If that is satisfactory you can now run &#8216;hg add&#8217; to add the files listed here.</p>
<pre><code>$ hg add
adding .bash_history
adding .bash_logout
adding .bash_profile
adding .bashrc
adding .hgignore
adding .hgrc
adding .mysql_history
adding .screenrc
adding bin/mysqltuner.pl</code></pre>
<p>And you can verify it by again running &#8216;hg status&#8217;</p>
<pre><code>$ hg status
A .bash_history
A .bash_logout
A .bash_profile
A .bashrc
A .hgignore
A .hgrc
A .mysql_history
A .screenrc
A bin/mysqltuner.pl</code></pre>
<p>So go ahead now and run &#8216;hg commit&#8217; and we can deal with individual files under ignored directories afterwards.  Running &#8216;hg commit&#8217; should be default use vi as your editor so after writing your description his Esc, then type :wq and it will commit.</p>
<pre><code>Initial commit of home directory files.

Contains mostly bash dot files, but also a script in my bin directory

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: Peter Manis &lt;manis@pyverted.com&gt;
HG: branch 'default'
HG: added .bash_history
HG: added .bash_logout
HG: added .bash_profile
HG: added .bashrc
HG: added .hgignore
HG: added .hgrc
HG: added .mysql_history
HG: added .screenrc
HG: added bin/mysqltuner.pl</code></pre>
<p>So there were a couple directories I had in my .hgignore file that I would like to store certain files in version control.  The first is .ssh and the second is .irssi.  So to do this we run &#8216;hg add&#8217; and then &#8216;hg commit&#8217;</p>
<pre><code>$ hg add .ssh/config
$ hg add .irssi/config
$ hg status
A .irssi/config
A .ssh/config
$ hg commit
Adding files that are under ignored directories

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: Peter Manis &lt;manis@pyverted.com&gt;
HG: branch 'default'
HG: added .irssi/config
HG: added .ssh/config</code></pre>
<p>Let us now take a look at the local commits that we have.</p>
<pre><code>$ hg log
changeset:   1:5ca5d6d283fe
tag:         tip
user:        Peter Manis &lt;manis@pyverted.com&gt;
date:        Thu Aug 13 19:48:16 2009 -0400
summary:     Adding files that are under ignored directories

changeset:   0:d0e3d9042208
user:        Peter Manis &lt;manis@pyverted.com&gt;
date:        Thu Aug 13 19:43:06 2009 -0400
summary:     Initial commit of home directory files.</code></pre>
<p>We now need to prepare to push these local commits to our bitbucket private repository.  To do this we need to setup ssh keys</p>
<pre><code>$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mercurialguide/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mercurialguide/.ssh/id_rsa.
Your public key has been saved in /home/mercurialguide/.ssh/id_rsa.pub.
The key fingerprint is:
c5:fc:5b:3e:06:2c:3f:f9:17:51:bf:78:f8:60:ac:cb mercurialguide@hostname</code></pre>
<p>Now sign up for a bitbucket account, create your first private repository, I called mine homedir.  After you do that you need to go into your &#8220;Account&#8221; page and add your ssh public key to the list of ssh keys.</p>
<pre><code>$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwRewbcXoot9nUUZzonryDYKBhxapI69JRW5TNsxfJQEAw4l7VoA681sgHVA2B8T876Tn9uZrzMBgcEz4GMGVsrU31wVNa9p/HtBJCyp1zWKoitoR1wu2FdNRSgsjFOdlMJ6BIxchmG58/hwA88FZXdYgcKMe2WWQP7pDInhHIJhLKPoctXURr6kSM7TWLh4eO81amSE2GB77mCRIoqxI6Y0uQGqO6JDhFUQAPuErCJcfXSkO+Lv9XIyCwhclki2oZUMwvDyYYrHVHWCNZ/azY1C4Ea722CFSWQjAUI9ljA8yaYmLaI4tbgWu9bNQdNy7v9x9EMtq8Q828BF9LGb+tw== mercurialguide@hostname</code></pre>
<p>You will also need to edit your .ssh/config file for bitbucket.</p>
<pre><code>Host bitbucket.org
  User hg
  Compression yes</code></pre>
<p>Now we can push changes to bitbucket</p>
<pre><code>$ hg push ssh://bitbucket.org/manis/homedir/
pushing to ssh://bitbucket.org/manis/homedir/
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 12 changes to 12 files
remote: bb/acl: manis is allowed. accepted payload.
remote: quota: 103.6 MB in use, 500.0 MB available (20.72% used)</code></pre>
<p>And you&#8217;re done!  You just setup a remote repository with your home directory files.  Now that you have that setup remember that until you &#8216;hg push&#8217; your changes they are only local.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/version-control/using-mercurial-on-your-home-directory/2009/08/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://pyverted.com/version-control/using-mercurial-on-your-home-directory/2009/08/</feedburner:origLink></item>
		<item>
		<title>My Move to Mercurial</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/QGT5lBvVlUI/</link>
		<comments>http://pyverted.com/version-control/my-move-to-mercurial/2009/08/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 22:00:08 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Version Control]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Mercurial]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=330</guid>
		<description><![CDATA[My recent post about using Git/Mercurial on my home directory really pushed me to figure out which DVCS I wanted to move to long term.  I wanted to share with you the reasons why I switched, not to try to convince you to switch to Mercurial, but to share with you things you may [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://pyverted.com/linux/setting-up-version-control-on-your-home-directory/2009/08/" target="_blank">recent post</a> about using <a href="http://git-scm.com/" target="_blank">Git</a>/<a href="http://mercurial.selenic.com/wiki/" target="_blank">Mercurial</a> on my home directory really pushed me to figure out which DVCS I wanted to move to long term.  I wanted to share with you the reasons why I switched, not to try to convince you to switch to Mercurial, but to share with you things you may not have known about it.  These observations were primarily over the last week, but I had interacted with both git and mercurial prior to taking the time to learn more about them.  I will also mention that there are going to be things about Mercurial and Git that I cannot comment on.  I do not deal with distributed version control as much as I do centralized so I am unable to comment on features that are more DVCS specific.<br />
<span id="more-330"></span><br />
As I was writing the post about using DVCS on my home directory, I couldn&#8217;t resist using both Mercurial and Git side by side.  With the structure being similar, but different it was much easier than it would have been doing Subversion and a DVCS.  I already had a Git environment setup so pushing my home directory and really interacting with Git wasn&#8217;t a problem, but with Mercurial I didn&#8217;t really want to take the time to set everything up only to ditch it all later.  I then remembered that <a href="http://bitbucket.org/" target="_blank">bitbucket</a> offered 1 private repository with the free account, something that <a href="http://github.com" target="_blank">GitHub</a> does not do.  I created an account and started to play with it a bit and felt more comfortable with the actions of Mercurial than I ever did with Git.  This is when I really started to get a good feel for using Mercurial and how natural it felt to me.</p>
<p>I never liked the status output of Git, the Mercurial output was much closer to Subversion, which is what I was used to.  A quick side note, I have read that most feel Mercurial is an easier move for Subversion users.  With my first real Mercurial involvement needing a lot of adds and removes it was nice to have an &#8216;addremove&#8217; command that quickly took care of this for me.  With Git you had to run add on the files, which was not fun if you added a large number of new files.  Before anything is said about adding files I will say that yes, if you are adding a lot of new files it is probably from adding a directory, which is more easily added, but I found a number of instances where I had to add a lot of files where it wasn&#8217;t that easy and writing out a one liner to do it just isn&#8217;t enjoyable.</p>
<p>The ability to serve a web interface straight from the command line was a feature I found very interesting, again being able to setup a complete environment it wasn&#8217;t something I really needed, but it was certainly a nice feature to have.  Setting up a Mercurial/Apache environment is also much easier than doing it with Git.  I love Trac, I use it for everything I can, but it was very difficult to use with Git for a couple reasons.  The first was that the versions of software needed for the Trac plugin didn&#8217;t mesh well with the CentOS 5 environment it would be hosted on.  The 2nd, which is one of my biggest gripes about Git is the revision id Git uses.  Git uses full hashes like &#8220;b3ef65139dea83be5965a972159aa628847b763c&#8221; while Mercurial will use a number and a short hash like &#8220;0:3f7766464126&#8243; and revisions can be referenced by either.  Here is a visual comparison of the two.</p>
<ul>
<li>Git: <a href="http://labs.ohloh.net/ohcount/browser" target="_blank">OhLoh Labs</a></li>
<li>Mercurial: <a href="http://pylonshq.com/project/pylonshq/browser" target="_blank">Pylons</a></li>
</ul>
<p>I&#8217;m sure you can see what a difference that makes, the Mercurial revision id is 1/3 the length of the Git.</p>
<p>Mercurial itself is written in Python, and it is pointed out in some of the pages I link to later that this allows the developers to concentrate on adding features and paying more attention to creating the best version control system instead of having to deal with all the issues that can be involved in maintaining more low level code like C/C++.  When you don&#8217;t have to spend time on garbage collection and finding memory leaks you have more time to add in features like Mercurial&#8217;s archiving option.  I can simple link to http://webaddress.com/repository/archive/tip.<a href="http://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html" target="_blank">{zip,tar.gz,tar.bz2}</a> and it will create an archive version of the tip, or what is also known as the last revision, but you can also link to tags and create archives based on that.  It also allows me to very easily add autogenerated links to my Trac project index as well, seen below.</p>
<p><img src="http://static.pyverted.com/for/posts/20090808/mercurial_trac.png" /></p>
<p>I think that Mercurial being written in Python influences my decision more than I may realize.  I like to have the power to add and change things and considering that I write Python more than I do anything else these days that fits in very nicely.  It means that if I want a feature I can write it, I don&#8217;t need to know C or C++ and with the design of Python the features can be more easily added and shared with others.  An example of a quick and easy extension is the <a href="http://mercurial.selenic.com/wiki/InfoExtension" target="_blank">InfoExtension</a>, which if you are used to Subversion will look very much like &#8217;svn info&#8217;.</p>
<p>Back in April, <a href="http://googlecode.blogspot.com/2009/04/mercurial-support-for-project-hosting.html" target="_blank">Google added support for Mercurial</a> to their project hosting service, which you can see even has <a href="http://code.google.com/p/android-health-tracker/source/list" target="_blank">integrated branch graphing</a>.  More recently Python creator <a href="http://mail.python.org/pipermail/python-dev/2009-March/087931.html" target="_blank">Guido van Rossum announced</a> they will be moving from Subversion to Mercurial along with a <a href="http://sayspy.blogspot.com/2009/03/why-python-is-switching-to-mercurial.html" target="_blank">followup from Brett Cannon</a> about the decision.  There is also a <a href="http://www.python.org/dev/peps/pep-0374/" target="_blank">detailed PEP</a> about the selection of a distributed VCS.</p>
<p>These are just some of the things that I really liked about Mercurial, you can read a little more on the following pages:</p>
<ul>
<li><a href="http://nubyonrails.com/articles/five-features-from-mercurial-that-would-make-git-suck-less" target="_blank">Five Features from Mercurial That Would Make Git Suck Less</a></li>
<li><a href="http://blog.zacharyvoase.com/post/147813314/why-mercurial-git-or-how-i-learned-to-stop-censoring" target="_blank">Why Mercurial > Git, or How I Learned To Stop Censoring Myself and Participate in Flamewars.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/version-control/my-move-to-mercurial/2009/08/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://pyverted.com/version-control/my-move-to-mercurial/2009/08/</feedburner:origLink></item>
		<item>
		<title>Fedora DHCP</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/vkB2JYK3iOU/</link>
		<comments>http://pyverted.com/linux/fedora-dhcp/2009/08/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 04:24:56 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=327</guid>
		<description><![CDATA[I installed Fedora in a virtual machine to play with Fedora Directory Server since it would be more recent than RHEL or CentOS.  I noticed post install that I could not stop pulling an IP address from DHCP despite setting up the /etc/sysconfig/network-scripts/ifcfg-eth0 file to be static.  After a quick search I found [...]]]></description>
			<content:encoded><![CDATA[<p>I installed Fedora in a virtual machine to play with Fedora Directory Server since it would be more recent than RHEL or CentOS.  I noticed post install that I could not stop pulling an IP address from DHCP despite setting up the /etc/sysconfig/network-scripts/ifcfg-eth0 file to be static.  After a quick search I found that Fedora is using the NetworkManager to handle the networking before anything else so to fix this issue you need to disable NetworkManager and enable plain old network.</p>
<p><code>chkconfig NetworkManager off<br />
chkconfig --levels 2345 network on<br />
/etc/init.d/network restart</code></p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/fedora-dhcp/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/fedora-dhcp/2009/08/</feedburner:origLink></item>
		<item>
		<title>Right-click MD5 file generation, with autocheck</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/SwoKeZb-gWc/</link>
		<comments>http://pyverted.com/linux/right-click-md5-file-generation-with-autocheck/2009/08/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 07:59:16 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Bash Script]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[MD5]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=319</guid>
		<description><![CDATA[In my previous post I mentioned using a shebang in MD5 files to make them autocheck.  I created a quick nautilus script that will take selected files and create an md5 file with the shebang and append the hashes of the files to it.  It will also make the MD5 file executable so [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://pyverted.com/linux/md5-file-autochecking/2009/08/" target="_blank">previous post</a> I mentioned using a shebang in MD5 files to make them autocheck.  I created a quick nautilus script that will take selected files and create an md5 file with the shebang and append the hashes of the files to it.  It will also make the MD5 file executable so that you can run that file to do the check.</p>
<p>The file gets placed in ~/.gnome2/nautilus-scripts/ and will take a restart of X.</p>
<pre><code>#!/bin/bash

FILENAME=`gdialog --title "MD5 File" --inputbox "Enter the name of the MD5 file (without extension)" 100 200 2&gt;&amp;1`
if [ ${#FILENAME} -lt 1 ]; then
  FILENAME=temp_name.md5
else
  FILENAME=$FILENAME.md5
fi

echo "#!/usr/bin/md5sum -c" &gt; $FILENAME
/usr/bin/md5sum $* &gt;&gt; $FILENAME
chmod +x $FILENAME</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/right-click-md5-file-generation-with-autocheck/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/right-click-md5-file-generation-with-autocheck/2009/08/</feedburner:origLink></item>
		<item>
		<title>MD5 File Autochecking</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/fp_gnN5WFkY/</link>
		<comments>http://pyverted.com/linux/md5-file-autochecking/2009/08/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 07:27:17 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[Shebang]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=311</guid>
		<description><![CDATA[Tonight I was playing around with creating more templates in Ubuntu&#8217;s ~/Template directory and thought I&#8217;d play with MD5 files.  This doesn&#8217;t just apply to the ~/Templates dir, but putting it in the templates directory will make it easier for a couple reasons.  If you put this header in a MD5.md5 file and [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I was playing around with creating more templates in Ubuntu&#8217;s ~/Template directory and thought I&#8217;d play with MD5 files.  This doesn&#8217;t just apply to the ~/Templates dir, but putting it in the templates directory will make it easier for a couple reasons.  If you put this header in a MD5.md5 file and make that template executable, when you right click and create an MD5 file the file will be executable and will already have the shebang in the file.</p>
<p>An example, the following will let you run ./filename.md5 and have it return the results of the md5 check.</p>
<pre><code>#!/usr/bin/md5sum -c

bf185a69398a7fa91b6006aae61f8be1  TracMercurial-0.11.0.7-py2.4.egg</code></pre>
<pre><code>$ chmod +x mercurial_plugin.md5
$ ./mercurial_plugin.md5
TracMercurial-0.11.0.7-py2.4.egg: OK</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/md5-file-autochecking/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/md5-file-autochecking/2009/08/</feedburner:origLink></item>
		<item>
		<title>Ubuntu User Directories</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/6u9ORW_NOHI/</link>
		<comments>http://pyverted.com/linux/ubuntu-user-directories/2009/08/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 00:08:21 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sys Admin]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=302</guid>
		<description><![CDATA[I discovered that if you delete directories in your home directory like Templates and other system folders it will make an undesirable change to ~/.config/user-dirs.dirs changing the location of variables to $HOME/, which means if you want to add the directory back you have to edit the file.  
This file defines the locations for [...]]]></description>
			<content:encoded><![CDATA[<p>I discovered that if you delete directories in your home directory like Templates and other system folders it will make an undesirable change to ~/.config/user-dirs.dirs changing the location of variables to $HOME/, which means if you want to add the directory back you have to edit the file.  </p>
<p>This file defines the locations for Desktop, Music, Templates, etc so I went ahead and moved those files to Dropbox so I can maintain the files across multiple machines.</p>
<p>While I&#8217;m on the topic of these directories, I want to mention the awesomeness that is the Templates directory.  If you add the file &#8220;Python Script.py&#8221; to that directory and put in the following text:</p>
<pre name="code" class="python:nogutter">
#!/usr/bin/python2.5
#
# Copyright 2009

import sys

# Enter text here</pre>
<p>You can then right click in a directory, go to &#8220;Create Document&#8221; you will see &#8220;Python Script&#8221; listed and if you select it a .py file will be created with the previous text in it.  This directory lets you create templates for anything you want and easily use it to create documents.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/ubuntu-user-directories/2009/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/ubuntu-user-directories/2009/08/</feedburner:origLink></item>
		<item>
		<title>Setting Up Version Control on your Home Directory</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/XBJV0mDy2qY/</link>
		<comments>http://pyverted.com/linux/setting-up-version-control-on-your-home-directory/2009/08/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 05:01:20 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Dot Files]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Version Control]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=274</guid>
		<description><![CDATA[UPDATE: I just initialized a mercurial repository in my home dir as well to have a side by side comparison of the two.  If you are interested in using mercurial please look at the bottom for a few notes on setting it up.
In Ubuntu 9.04 a new application was introduced called etckeeper.  This [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE:</strong> I just initialized a mercurial repository in my home dir as well to have a side by side comparison of the two.  If you are interested in using mercurial please look at the bottom for a few notes on setting it up.</p>
<p>In Ubuntu 9.04 a new application was introduced called etckeeper.  This application uses various version control systems to store versions of files within etc.  Some machines that I work on I keep my home directory very clean, and I go out of my way to keep things organized and stored in version control.  I have dropped the ball on being so organized when it comes to my home desktop, but tonight, that changed.  This is how to use version control with your home directory.  I am not going to cover indepth topics about using Git or any other version control, this guide simply explains how to maintain a local repository.</p>
<p>The first step is to install your preferred version control system.  In this case I am going to use git, since a lot of people are familiar with it.</p>
<p><code>sudo apt-get install git</code><br />
<span id="more-274"></span><br />
Now we need to initialize our repository and prevent other users from having access.</p>
<p><code>$ cd ~<br />
$ git init<br />
Initialized empty Git repository in /home/user/.git/<br />
$ chmod 700 .git</code></p>
<p>We don&#8217;t need to put every file under version control so we need to create a list of everything in our home directory and then remove what we don&#8217;t want.  To do this we are first going to list all non-hidden files directories first, and then list all hidden files directories first followed by leaving out the current and parent directories.  This list gets put in a file called .gitignore, a file that git reads to determine what files it should ignore.</p>
<p><code>$ ls -1 --group-directories-first &gt; .gitignore<br />
$ ls -1 --group-directories-first -A | grep '^\.' &gt;&gt; .gitignore<br />
$ cat .gitignore<br />
Applications<br />
bin<br />
Desktop<br />
...<br />
.cache<br />
.checkbox<br />
.compiz<br />
...<br />
.bash_aliases<br />
.bash_history<br />
.bash_logout<br />
...<br />
.xsession-errors</code></p>
<p>Now you should go through and remove files and directories you would like to have maintained in version control.  You can also temporarily comment out a file with a # so that it will get added and then uncomment the file so that in the future changes will be ignored.</p>
<p>After editing .gitignore you can run &#8216;git status&#8217; to verify the files that are not ignored.</p>
<pre><code>$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add &lt;file&gt;..." to include in what will be committed)
#
#       .bash_aliases
#       .bash_history
#       .bash_logout
#       .bash_profile
#       .bashrc
#       .gitconfig
#       .gitignore
#       .hgrc
#       .nvidia-settings-rc
#       .profile
#       .screenrc
#       .ssh/
#       .subversion/
#       .vim/
#       .viminfo
#       .vimrc
nothing added to commit but untracked files present (use "git add" to track)</code></pre>
<p>Some things you may want to leave out like in my case I don&#8217;t really want to have the auth information for subversion or ssh private keys stored in version control.  For those specific things you can add lines like the following to your .gitignore file.</p>
<p><code>.ssh/id_*<br />
.subversion/auth/</code></p>
<p>To test what files will be added and what will not be added you can do a dry run.</p>
<p><code>$ git add -n -A<br />
add '.bash_aliases'<br />
...<br />
add '.screenrc'<br />
add '.ssh/config'<br />
add '.ssh/known_hosts'<br />
add '.subversion/README.txt'<br />
add '.subversion/config'<br />
add '.subversion/servers'<br />
add '.vim/colors/astronaut.vim'<br />
...</code></p>
<p>Now we need to add the files to git and commit them.</p>
<p><code>$ git add -A<br />
$ git commit -m "Initial commit of files in home directory"</code></p>
<p>Now if you make a change to .profile you can easily revert it</p>
<pre><code>$ echo 'testing' &gt;&gt; .profile
$ git status
# On branch master
# Changed but not updated:
#   (use "git add &lt;file&gt;..." to update what will be committed)
#   (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)
#
#       modified:   .profile
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout .profile
$ git status
# On branch master
nothing to commit (working directory clean)</code></pre>
<p>And you&#8217;re done.</p>
<h2>Mercurial</h2>
<p>I have not decided which DVCS I will be using so I initialized a hg repository along side the git repository so that I can see the differences first hand.  The mercurial command is &#8216;hg&#8217; and the ignore file is .hgignore so this guide can be easily adapted to using mercurial.  One nice benefit is that <a href="http://bitbucket.org" target="_blank">BitBucket&#8217;s</a> free plan comes with a private repository so you can easily setup a remote repository to store  it all.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/setting-up-version-control-on-your-home-directory/2009/08/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/setting-up-version-control-on-your-home-directory/2009/08/</feedburner:origLink></item>
		<item>
		<title>VLC on a separate X Screen</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/oR_FbIJSiRg/</link>
		<comments>http://pyverted.com/linux/vlc-on-a-separate-x-screen/2009/07/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 23:01:06 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Dual Monitors]]></category>
		<category><![CDATA[GTK]]></category>
		<category><![CDATA[VLC]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=267</guid>
		<description><![CDATA[I have an odd overlay issue when using my HDTV as a second monitor on my desktop.  When I would set them up with the correct resolutions they would be reverted to something that caused an overlap.  The only way to fix this was to do separate X screens, but I couldn&#8217;t remember [...]]]></description>
			<content:encoded><![CDATA[<p>I have an odd overlay issue when using my HDTV as a second monitor on my desktop.  When I would set them up with the correct resolutions they would be reverted to something that caused an overlap.  The only way to fix this was to do separate X screens, but I couldn&#8217;t remember how to send VLC to the 2nd X screen.  Applications like Firefox can accept the &#8211;display flag, but VLC does not.  To prevent having it send any other applications to the 2nd display I made it a local variable in a bash script and run VLC from there.  Just associate movies with the bash script and it will run them full screen on the 2nd X screen.</p>
<pre><code>#!/bin/bash

DISPLAY=:0.1
vlc -f $*</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/linux/vlc-on-a-separate-x-screen/2009/07/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/linux/vlc-on-a-separate-x-screen/2009/07/</feedburner:origLink></item>
		<item>
		<title>Wordpress 2.8 Database Upgrade Loop</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/UENG7Ejb3rU/</link>
		<comments>http://pyverted.com/general/wordpress-2-8-database-upgrade-loop/2009/06/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 14:01:19 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Memcache]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=265</guid>
		<description><![CDATA[Last night I upgraded both of my blogs to Wordpress 2.8 and ran into a couple problems.  The redirection plugin caused some problems with wp-db.php so I had to disable that to get the site back up if you upgrade redirection prior to upgrading you won&#8217;t have that problem.
The other problem I ran into [...]]]></description>
			<content:encoded><![CDATA[<p>Last night I upgraded both of my blogs to Wordpress 2.8 and ran into a couple problems.  The redirection plugin caused some problems with wp-db.php so I had to disable that to get the site back up if you upgrade redirection prior to upgrading you won&#8217;t have that problem.</p>
<p>The other problem I ran into was that I would be presented with a page saying &#8220;Database Upgrade Required&#8221;, after upgrading it would bring me back to the same page.  The problem ended up being the wp-content/object-cache.php file, moving that out fixed the problem.  However because the page was still cached in memcache moving the file back raised the same issues.  The faster fix is to restart memcache all together to clear the cache.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/general/wordpress-2-8-database-upgrade-loop/2009/06/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://pyverted.com/general/wordpress-2-8-database-upgrade-loop/2009/06/</feedburner:origLink></item>
		<item>
		<title>Retrieve Gmail/GApps Message Count</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/-b0BfRJyXHQ/</link>
		<comments>http://pyverted.com/python/retrieve-gmailgapps-message-count/2009/06/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 05:02:53 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=243</guid>
		<description><![CDATA[Long ago I switched from using any sort of mail client to using the webmail interface of Gmail/Google Apps.  This switch was really fueled by my increased usage of the interface after being hired by Google.  I won&#8217;t go on and on about using the web interface, but sometimes it is nice to [...]]]></description>
			<content:encoded><![CDATA[<p>Long ago I switched from using any sort of mail client to using the webmail interface of Gmail/Google Apps.  This switch was really fueled by my increased usage of the interface after being hired by Google.  I won&#8217;t go on and on about using the web interface, but sometimes it is nice to know how many actual emails are in your account.  Google mail only shows you the number of threaded emails, not each individual response.  If I look in &#8220;All Mail&#8221; for my manis@digital39.com account I see &#8220;1 &#8211; 100 of 21758&#8243;, which represents the number of email threads, the actual number of responses is 56578.  FYI, this requires that you enable IMAP support for the account.</p>
<p><code>$ imap_count.py manis@digital39.com<br />
Password for manis@digital39.com: *****<br />
56578 messages in account manis@digital39.com</code></p>
<p>Expand the code below and copy it to a file on your system.  It takes one argument, and that argument is a comma separated list of email addresses.</p>
<pre name="code" class="python:nogutter:collapse">
#!/usr/bin/python2.4
#
# Copyright (c) 2009, Peter Manis
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice, this
# list of conditions and the following disclaimer in the documentation and/or
# other materials provided with the distribution.
#
# Neither the name of the Peter Manis nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import getpass
import imaplib
import sys

results = []

def RetrieveMsgCount(username, password):
  """Retrieves message count by accessing Gmail or Google Apps IMAP account.

  Args:
    username: str, Username of the account we are accessing.
    password: str, Password of the account we are accessing.

  Returns:
    count: str, Number of messages in IMAP account

  Raises:
    imaplib.IMAP4.error: Failed to login to the IMAP account.
  """
  try:
    imap = imaplib.IMAP4_SSL('imap.gmail.com', 993)
    imap.login(username, password)
    status, [count] = imap.select("[Gmail]/All Mail")
    imap.close()
    imap.logout()
  except imaplib.IMAP4.error:
    return 'Unable to check'
  else:
    return count

def main():
  if len(sys.argv) > 1:
    accounts = sys.argv[1]
    for account in accounts.split(','):
      password = getpass.getpass("Password for %s: " % account)
      results.append('%s messages in account %s' % (
          RetrieveMsgCount(account, password), account))
    for account in results:
      print account
  else:
    print "Please provide a comma separated list of accounts to check."

if __name__ == '__main__':
  main()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/python/retrieve-gmailgapps-message-count/2009/06/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/python/retrieve-gmailgapps-message-count/2009/06/</feedburner:origLink></item>
		<item>
		<title>Why techies get annoyed</title>
		<link>http://feedproxy.google.com/~r/pyverted/~3/Pez2p4J1yQg/</link>
		<comments>http://pyverted.com/random/why-techies-get-annoyed/2009/05/#comments</comments>
		<pubDate>Tue, 12 May 2009 03:25:35 +0000</pubDate>
		<dc:creator>Peter Manis</dc:creator>
				<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://pyverted.com/?p=235</guid>
		<description><![CDATA[Many times I hear people say how they hate when their friend gets mad at them for asking questions.  I have been on both sides of this, I often get annoyed after receiving a number of questions, and I have complained about the way people have acted with me in the past.  Looking [...]]]></description>
			<content:encoded><![CDATA[<p>Many times I hear people say how they hate when their friend gets mad at them for asking questions.  I have been on both sides of this, I often get annoyed after receiving a number of questions, and I have complained about the way people have acted with me in the past.  Looking back I see what I did that annoyed people and I try very hard to avoid those situations.<br />
<span id="more-235"></span><br />
Continuous questions, you ask one question and instead of taking that question and doing something with it you make a person elaborate on every detail of their answer.  It is sort of hard to survive in the tech world without staying on top of the latest topics, and constantly learning new things, and because of that many of us have spent a lot of time searching and reading articles, tutorials, manuals to get to where we are.  Beyond reading we break a lot of things to learn what we know.  I cannot tell you how many times I have installed Windows or Linux and sometimes I learn something new, but now it is just mind numbing at times.  When you ask a question, and someone gives you an answer that builds on something else you are not aware of take a couple minutes and search Google.  I&#8217;ll give an example&#8230; Lets say you wanted to have a machines, a file server, to store all your files.  You ask a friend for help and he starts mentioning RAID, and that RAID5 is going to be pretty safe.  What you should do is search Google for RAID5, read through the description and if there is something you don&#8217;t understand you could then ask a question about something specific.  &#8220;What exactly is parity?&#8221; might be one, but in situations when someone gives me an answer like that I will do multiple searches on the terms I unfamiliar with.  This does a couple things, it shows the person you have a genuine interest in understanding, that you just need a push in the right direction, and that you respect their time.</p>
<p>What sparked this post was that someone on a mailing list I belong to asked about installing KDE in Ubuntu so that he could switch back and forth between KDE and Gnome, an email sent on the 8th of May.  A few of us gave him commands he could run, and links to topics related to this, each one being shot down for some reason or another.  Eventually a couple people made comments about how maybe Linux wasn&#8217;t for him, and so on, and he started to get defensive, which he has the right to do, but he started explaining how he works with over 100 servers and has been using Linux for like 8 years.  Someone called him out by saying that with that much experience he should have been able to install KDE, which is very true, there might have been a couple problems to fix, but finding what packages to install should have been quite simple.  The user then came back with this email about how we must have unlimited time to learn all of this stuff, and how he doesn&#8217;t have the time to spend figuring something out that many people have figured out already and then ending the email with comments about how if the list becomes unhelpful he will unsubscribe.</p>
<p>A big mistake he made was sounding ungrateful for the help he did receive.  He thanked a few of us as we replied, but they were &#8220;Thanks, but&#8221; replies, telling us what was wrong with our response.  By giving the attitude that your time is more valuable than ours is not the greatest way to get help.  If you really want to make it about the value of an hour unless you are a doctor or a lawyer we can most likely bill more per hour than you can.  Acting like you are some big shot by listing off the stuff you do isn&#8217;t a great thing to do either, you don&#8217;t know the audience, when you have people with a lot of experience hearing you make comments about how awesome you are, and you can&#8217;t install KDE it really makes you look like an ass.</p>
<p>Before you send an email to a list or to a group you need to think about the time you are taking away from other people&#8217;s day.  If 200 people read your email, and it takes them 2 minutes a piece, but the answer to your question shows up in the top 5 results in Google, you just wasted 400 minutes of people&#8217;s time for something you could have found in 5 seconds.  In the case of this guy it took me longer to read his replies than it did to search for a quick howto or give him a command he could run to find out what to install.</p>
<p>I hope this helps some of you who have been annoyed at your friend or acquaintance because they came across as having an attitude or they got upset with you.</p>
]]></content:encoded>
			<wfw:commentRss>http://pyverted.com/random/why-techies-get-annoyed/2009/05/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pyverted.com/random/why-techies-get-annoyed/2009/05/</feedburner:origLink></item>
	</channel>
</rss>
