<?xml version="1.0" encoding="UTF-8"?>
<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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Slowchop Studios</title>
	<atom:link href="http://slowchop.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://slowchop.com</link>
	<description />
	<pubDate>Sat, 20 Sep 2008 23:48:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Creating an OS X Installer for Python modules and extensions</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/376100590/</link>
		<comments>http://slowchop.com/2008/08/27/creating-an-os-x-installer-for-python-modules-and-extensions/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 11:04:43 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[installers]]></category>

		<category><![CDATA[osx]]></category>

		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://slowchop.com/?p=62</guid>
		<description><![CDATA[
In the past, people have hassled me to make it easier for them to install my applications and libraries on OS X. I&#8217;m not very skilled with OS X, and searching for how to do this task took some time. I&#8217;ve made a script that does this in a modular way for Python. Specifically, this [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://slowchop.com/wp-content/uploads/2008/08/python-osx-installer-screenshot.png"><img src="http://slowchop.com/wp-content/uploads/2008/08/python-osx-installer-screenshot-150x150.png" alt="" title="Python OS X installer screenshot" width="150" height="150" style="float: right; padding: 10px;" /></a></p>
<p>In the past, people have hassled me to make it easier for them to install my applications and libraries on OS X. I&#8217;m not very skilled with OS X, and searching for how to do this task took some time. I&#8217;ve made a script that does this in a modular way for <a href="http://www.python.org/">Python</a>. Specifically, this article describes the process of making a Python <a href="http://docs.python.org/dist/python-terms.html">module or extension</a> installer for OS X, similar to the <a href="http://docs.python.org/dist/postinstallation-script.html">Python installer for Windows</a>.</p>
<p><span id="more-62"></span></p>
<p>I use a Python module called <a href="http://pypi.python.org/pypi/bdist_mpkg/">bdist_mpkg</a> which does most of the work. It simply creates a &#8220;mpkg&#8221; file out of your distribution by reading your <a href="http://docs.python.org/dist/dist.html">standard distutils setup.py file</a>. You can run it using either the command &#8220;bdist_mpkg&#8221; or as part of running setup.py, i.e. &#8220;python setup.py bdist_mpkg&#8221;. They both seem to do the same thing. The generated file is an OS X metapackage used by the OS X installer, &#8220;Installer.app&#8221;.</p>
<p>Once you have the mpkg file, which is generated in the directory &#8220;dist&#8221;, the script puts it in a &#8220;dmg&#8221; file. Putting a mpkg into a dmg file seems to be the standard way of distributing applications on OS X, yet I haven&#8217;t found out exactly why&#8211;someone point me in the right direction!</p>
<p>The script uses <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/hdiutil.1.html">hdiutil</a> to create a new, empty disk image then attaches (mounts) it to your system as a &#8220;device&#8221;. The attach command outputs the location of the path and device in the file system, which the script saves for detaching. Now that the image is mounted, the mpkg file is put into the image. The script then detaches (unmounts) then compresses the dmg file.</p>
<p>Unfortunately I didn&#8217;t save the references I used to find out the code to do this so I haven&#8217;t given credit, even though this is probably straightforward to an experienced OS X Python developer. The script, which I&#8217;ve called &#8220;python-osx-dist.sh&#8221;, accepts a package name and a version number as arguments. The <a href="http://misc.slowchop.com/misc/browser/python-osx-dist/python-osx-dist.sh">script source is here</a> and <a href="http://misc.slowchop.com/misc/browser/python-osx-dist/python-osx-dist.sh?format=txt">downloadable here</a>, and am happy to get comments or patches for it.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;t=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F&amp;title=Creating%20an%20OS%20X%20Installer%20for%20Python%20modules%20and%20extensions" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=s7FfOk"><img src="http://feeds.feedburner.com/~f/slowchop?i=s7FfOk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=CmX4Wk"><img src="http://feeds.feedburner.com/~f/slowchop?i=CmX4Wk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=PnAg9k"><img src="http://feeds.feedburner.com/~f/slowchop?i=PnAg9k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=reWXhk"><img src="http://feeds.feedburner.com/~f/slowchop?i=reWXhk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/376100590" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/08/27/creating-an-os-x-installer-for-python-modules-and-extensions/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F27%2Fcreating-an-os-x-installer-for-python-modules-and-extensions%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/08/27/creating-an-os-x-installer-for-python-modules-and-extensions/</feedburner:origLink></item>
		<item>
		<title>Python Google Chart 0.2.1 released</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/374149089/</link>
		<comments>http://slowchop.com/2008/08/25/python-google-chart-021-released/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 09:37:58 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Releases]]></category>

		<category><![CDATA[pygooglechart]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[qr codes]]></category>

		<guid isPermaLink="false">http://slowchop.com/?p=57</guid>
		<description><![CDATA[I just released pygooglechart 0.2.1. It has several bug fixes and minor additions, but the major change is that it now supports QR codes. You can quite easily create a QR code with pygooglechart as you can see below.


from pygooglechart import QRChart

# Create a 125x125 QR code chart
chart = QRChart(125, 125)

# Add the text
chart.add_data('Hello, World!')

# [...]]]></description>
			<content:encoded><![CDATA[<p>I just released <a href="http://pygooglechart.slowchop.com/">pygooglechart</a> 0.2.1. It has several bug fixes and minor additions, but the major change is that it now supports <a href="http://en.wikipedia.org/wiki/QR_Code">QR codes</a>. You can quite easily create a QR code with pygooglechart as you can see below.</p>
<blockquote>
<pre name="code" class="py">
from pygooglechart import QRChart

# Create a 125x125 QR code chart
chart = QRChart(125, 125)

# Add the text
chart.add_data('Hello, World!')

# "Level H" error correction with a 0 pixel margin
chart.set_ec('H', 0)

# Download
chart.download('qr-hello.png')
</pre>
</blockquote>
<p>This will download a png from the URL:</p>
<blockquote><p>
<a href="http://chart.apis.google.com/chart?cht=qr&#038;chs=125x125&#038;chl=Hello%2C%20World%21&#038;chld=H|0">http://chart.apis.google.com/chart?cht=qr&#038;chs=125&#215;125&#038;chl=Hello%2C%20World%21&#038;chld=H|0</a>
</p></blockquote>
<p>The image downloaded looks like this:</p>
<blockquote><p>
<img src="http://chart.apis.google.com/chart?cht=qr&#038;chs=125x125&#038;chl=Hello%2C%20World%21&#038;chld=H|0">
</p></blockquote>
<p>QR codes are new to me. I&#8217;ve only seen a QR code on a bus stop advertisement once in Sydney but I&#8217;m sure more will pop up.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;t=Python%20Google%20Chart%200.2.1%20released" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F&amp;title=Python%20Google%20Chart%200.2.1%20released" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=fdmy1k"><img src="http://feeds.feedburner.com/~f/slowchop?i=fdmy1k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=2yLo0k"><img src="http://feeds.feedburner.com/~f/slowchop?i=2yLo0k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=U4blek"><img src="http://feeds.feedburner.com/~f/slowchop?i=U4blek" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=pqSCak"><img src="http://feeds.feedburner.com/~f/slowchop?i=pqSCak" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/374149089" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/08/25/python-google-chart-021-released/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F25%2Fpython-google-chart-021-released%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/08/25/python-google-chart-021-released/</feedburner:origLink></item>
		<item>
		<title>Wireless Heatmap</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/367559858/</link>
		<comments>http://slowchop.com/2008/08/17/wireless-heatmap/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 09:00:42 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[python]]></category>

		<category><![CDATA[wirelessheatmap]]></category>

		<category><![CDATA[cool]]></category>

		<category><![CDATA[heatmap]]></category>

		<category><![CDATA[opengl]]></category>

		<category><![CDATA[pyglet]]></category>

		<category><![CDATA[visualisation]]></category>

		<category><![CDATA[visualization]]></category>

		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://slowchop.com/?p=46</guid>
		<description><![CDATA[I wrote an application to generate a wireless (802.11) heat map based on signal strength. The reason for it was to find the best place/area (for my laptop) to be with the highest signal strength. Below is a screenshot of the application (with the ESSID and BSSID removed for security reasons).

This heat map has about [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote an application to generate a wireless (802.11) heat map based on signal strength. The reason for it was to find the best place/area (for my laptop) to be with the highest signal strength. Below is a screenshot of the application (with the ESSID and BSSID removed for security reasons).</p>
<p><a href="http://slowchop.com/wp-content/uploads/2008/08/work.png"><img src="http://slowchop.com/wp-content/uploads/2008/08/work.png" alt="" title="wireless heatmap of the level at my work" width="499" height="517" class="alignnone size-full wp-image-48" /></a></p>
<p>This heat map has about 100 samples in it, which are shown as white dots. There is a balcony at the top of the image and the common office area on the right, which was drawn by hand (hence the waviness). As you can see it has pinpointed the location of the access point in the red area.</p>
<p><span id="more-46"></span></p>
<p>Below is another heat map with the same points but on a different access point.</p>
<p><a href="http://slowchop.com/wp-content/uploads/2008/08/fit.png"><img src="http://slowchop.com/wp-content/uploads/2008/08/fit.png" alt="" title="Neighbour\&#039;s access point location" width="499" height="517" class="alignnone size-full wp-image-49" /></a></p>
<p>Even though I don&#8217;t have points of data on the neighbour&#8217;s office area, the algorithm has worked out the approximate area of the access point.</p>
<p>The application (which is tentatively named &#8220;wirelessheatmap&#8221;) is written in Python with the OpenGL library, <a href="http://pyglet.org/">pyglet</a>. It relies on a wireless packet sniffer called <a href="http://www.aircrack-ng.org/doku.php?id=airodump-ng">airodump-ng</a> from the <a href="http://www.aircrack-ng.org/">Aircrack-ng</a> suite of wireless tools. I also had to <a href="http://misc.slowchop.com/misc/browser/wirelessheatmap/trunk/airodump-faster-txt-dumps.patch">patch airodump-ng</a> so that it writes the (later explained) CSV (comma-separated values) file more often.</p>
<p>After setting my Wi-Fi device to &#8220;monitor&#8221; mode, I run airodump-ng, listening on all channels. It writes a CSV file containing the signal strength of all access points from where my laptop is. With the patched version it updates this file every second. While airodump-ng is running, I also run the Python application with an image overlay containing the floor plan for reference.</p>
<p>To map out the points, I simply go to a location, wait a second or two for the signal strength to stabilize and for the CSV file to be updated. In the application, I click on my location on the floor plan map, then the application reads the CSV file along with all of the access point information, then saves the data for the location. I continue collecting points until I have a nice supply of sample points. This creates a mapping of 2D points to signal strength data for every access point.</p>
<p>The way the application generates the heat map is fairly straightforward. It allocates a 2D grid which overlaps the sample area. For each grid position it works out the nearest 10 sample points (or another tweakable number depending on your data), then works out the average signal strength of all the points. I went through several iterations of different methods and this turned out to be the most accurate and best for projection access point locations.</p>
<p>If you want to run this application yourself, the <a href="http://misc.slowchop.com/misc/browser/wirelessheatmap/trunk/">source code is available</a> but is not user friendly, buggy and may require you to know some Python to work out. To start you off run &#8220;./heat &#8211;help&#8221; to see the options. &#8220;&#8211;image&#8221; is the image file you want as the overlay reference map. &#8220;&#8211;dump&#8221; is the airodump-ng CSV file. &#8220;&#8211;store&#8221; is the file that contains the mapping between sample points and access point information.</p>
<p>I may continue this project in the future if there is enough demand for it, but for now it will stay as is.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;t=Wireless%20Heatmap" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F&amp;title=Wireless%20Heatmap" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=ldB9uk"><img src="http://feeds.feedburner.com/~f/slowchop?i=ldB9uk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=YCyPUk"><img src="http://feeds.feedburner.com/~f/slowchop?i=YCyPUk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=pWWlAk"><img src="http://feeds.feedburner.com/~f/slowchop?i=pWWlAk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=Yvzbwk"><img src="http://feeds.feedburner.com/~f/slowchop?i=Yvzbwk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/367559858" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/08/17/wireless-heatmap/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F08%2F17%2Fwireless-heatmap%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/08/17/wireless-heatmap/</feedburner:origLink></item>
		<item>
		<title>pycallgraph 0.5.1 released</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/344397681/</link>
		<comments>http://slowchop.com/2008/07/24/pycallgraph-051-released/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 08:49:16 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Releases]]></category>

		<category><![CDATA[pycallgraph]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[debian]]></category>

		<guid isPermaLink="false">http://slowchop.com/2008/07/24/pycallgraph-051-released/</guid>
		<description><![CDATA[Last week I quietly released pycallgraph 0.5.1 with some outstanding bugs fixed and preparation for it to be a Debian package.






	
	
	
	
	
	
	
	


]]></description>
			<content:encoded><![CDATA[<p>Last week I quietly released <a href="http://pycallgraph.slowchop.com/">pycallgraph 0.5.1</a> with some outstanding bugs fixed and preparation for it to be a <a href="http://packages.qa.debian.org/p/pycallgraph.html">Debian package</a>.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;t=pycallgraph%200.5.1%20released" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F&amp;title=pycallgraph%200.5.1%20released" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=eZcZvk"><img src="http://feeds.feedburner.com/~f/slowchop?i=eZcZvk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=cTErYk"><img src="http://feeds.feedburner.com/~f/slowchop?i=cTErYk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=9neS8k"><img src="http://feeds.feedburner.com/~f/slowchop?i=9neS8k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=eftUEk"><img src="http://feeds.feedburner.com/~f/slowchop?i=eftUEk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/344397681" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/07/24/pycallgraph-051-released/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F07%2F24%2Fpycallgraph-051-released%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/07/24/pycallgraph-051-released/</feedburner:origLink></item>
		<item>
		<title>Create a fast C Python extension with Cython tutorial</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/283085227/</link>
		<comments>http://slowchop.com/2008/05/04/cython-getting-started-and-optimisation-tutorial/#comments</comments>
		<pubDate>Sun, 04 May 2008 03:27:33 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[cython]]></category>

		<category><![CDATA[pyrex]]></category>

		<guid isPermaLink="false">http://slowchop.com/2008/05/04/cython-getting-started-and-optimisation-tutorial/</guid>
		<description><![CDATA[Cython is an easy way to create Python extensions in &#8220;pseudo-Python&#8221; without having to deal with the verboseness of the Python API. It also does not rely on you knowing much of the C language. Cython is based on Pyrex which I have some experience with. This tutorial shows you how to convert a simple [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wiki.cython.org/">Cython</a> is an easy way to create Python extensions in &#8220;pseudo-Python&#8221; without having to deal with the verboseness of the <a href="http://docs.python.org/api/api.html">Python API</a>. It also does not rely on you knowing much of the C language. Cython is based on <a href="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/">Pyrex</a> which I have some experience with. This tutorial shows you how to convert a simple Python module to a Python extension.</p>
<p><span id="more-42"></span></p>
<h3>Prerequisites</h3>
<p>You&#8217;ll need to be able to compile C files for this tutorial to work. You also need Cython installed and the Python development files installed. This is what I did on my &#8220;Gutsy Ubuntu&#8221; to get it going:</p>
<blockquote>
<pre>
sudo apt-get install python-dev
sudo easy_install Cython</pre>
</blockquote>
<p>I can attempt to help you if you can&#8217;t get things to compile, as long as you check Google for your errors first!</p>
<h3>Python module</h3>
<p>We&#8217;ll create a Python module to work out prime numbers up to a certain number. It&#8217;s not the most efficient method, but that&#8217;s not important in this tutorial. Lets call it prime.py.</p>
<blockquote>
<pre name="code" class="py">
def calculate(limit):
    primes = []
    divisor = 0
    for current in xrange(limit):
        previous = []
        for divisor in xrange(2, current):
            if current % divisor == 0:
                break
        if divisor == current - 1:
            primes.append(current)
    return primes</pre>
</blockquote>
<p>Add another program to import this module and use it. Let us say test_prime.py.</p>
<blockquote>
<pre name="code" class="py">
import prime

numbers = prime.calculate(10000)
print len(numbers)</pre>
</blockquote>
<p>Running &#8220;python test_prime.py&#8221; will return the number of prime numbers from 0 to 10,000, which is 1229. Lets add some timing code to see how fast this runs.</p>
<blockquote>
<pre name="code" class="py">
from timeit import Timer

t = Timer('prime.calculate(10000)', 'import prime')
reps = 5
print sum(t.repeat(repeat=reps, number=1)) / reps</pre>
</blockquote>
<p>This code above runs &#8220;prime.calculate&#8221; 5 times and averages out the time, so we get a more accurate result. On this old computer, it runs at 1.46 seconds. For the curious, this code under Psyco runs at 0.12 seconds.</p>
<h2>Converting to a Cython extension</h2>
<p>So far we have test_prime.py which calls the prime.py module. To convert it to Cython we need to create a setup.py file and make a copy of prime.py to c_prime.pyx. The pyx extension is specific to Pyrex and Cython. Here is our setup.py file:</p>
<blockquote>
<pre name="code" class="py">
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  name = 'PrimeTest',
  ext_modules=[
    Extension('c_prime', ['c_prime.pyx'])
    ],
  cmdclass = {'build_ext': build_ext}
)</pre>
</blockquote>
<p>The ext_modules list tells distutils that we&#8217;re building an extension module called c_prime from c_prime.pyx. The cmdclass argument mentions that we&#8217;re using a third-party tool (Cython) to build the extension.</p>
<p>Running the following will hopefully build your extension. &#8220;build_ext&#8221; tells distutils that we&#8217;re building an extension and the &#8220;&#8211;inplace&#8221; argument means it will put the built extension in the current directory.</p>
<blockquote>
<pre name="code" class="py">
python setup.py build_ext --inplace</pre>
</blockquote>
<p>This is the step that fails the most since it depends on gcc, Cython, Python development code and possibly other things. Try to find your problem on Google, otherwise ask here if you have no luck.</p>
<p>Now let us modify test_prime.py so that it is using our extension. Change the use of prime to c_prime on line 3:</p>
<blockquote>
<pre name="code" class="py">
t = Timer('c_prime.calculate(10000)', 'import c_prime')</pre>
</blockquote>
<p>Right now we have a C extension generated from our Python module. The time it takes to run test_prime.py now takes 0.79 seconds&#8211;almost double in speed. And that&#8217;s without any modification to our Python code!</p>
<h3>More speed</h3>
<p>If you know a bit of C, you can check out the generated C code in c_prime.c. It is quite ugly and has about 670 lines. Looking closer at the C code, you can see it demonstrating (within comment blocks) which line of code it has converted from with the translated code below. This is handy for optimisation to work out ways of increasing speed.</p>
<p>Looking at line 4 of our c_prime.pyx file, you can see this is simple a for-loop to count from 0 to a variable. In the C code it is about 20 lines as you can see from this excerpt!</p>
<blockquote>
<pre name="code" class="c">
/* "/home/gak/src/muckaround/cython-getting-started-tutorial/c_prime.pyx":4
 *     primes = []
 *     divisor = 0
 *     for current in xrange(limit):             # &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
 *         previous = []
 *         for divisor in xrange(2, current):
 */
  __pyx_1 = PyTuple_New(1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1;}
  Py_INCREF(__pyx_v_limit);
  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_limit);
  __pyx_3 = PyObject_Call(__pyx_builtin_xrange, ((PyObject *)__pyx_1), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1;}
  Py_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
  if (PyList_CheckExact(__pyx_3)) { __pyx_2 = 0; __pyx_1 = __pyx_3; Py_INCREF(__pyx_1); }
  else { __pyx_1 = PyObject_GetIter(__pyx_3); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1;} }
  Py_DECREF(__pyx_3); __pyx_3 = 0;
  for (;;) {
    if (PyList_CheckExact(__pyx_1)) { if (__pyx_2 &gt;= PyList_GET_SIZE(__pyx_1)) break; __pyx_3 = PyList_GET_ITEM(__pyx_1, __pyx_2++); Py_INCREF(__pyx_3); }
    else {
      __pyx_3 = PyIter_Next(__pyx_1);
      if (!__pyx_3) {
        break;
      }
    }
    Py_DECREF(__pyx_v_current);
    __pyx_v_current = __pyx_3;
    __pyx_3 = 0;</pre>
</blockquote>
<p>The reason why this is 20 lines is that it is basically doing the loop via Python. You might be able to make out that the C code is calling xrange in Python, then accessing its iterator until there are no more items in the xrange iterator. It is also converting Python objects to long integers. This is ridiculous for C code since it can be accomplished in one line.</p>
<p>We can tell Cython to make it only generate one line of C code by using its extended syntax. The syntax is:</p>
<blockquote>
<pre name="code" class="py">
for i from 0 &lt;= i &lt; n:</pre>
</blockquote>
<p>We have two of these for-loops, so lets change them both:</p>
<blockquote>
<pre name="code" class="py">
def calculate(limit):
    primes = []
    divisor = 0
    for current from 0 &lt;= current &lt; limit:
        previous = []
        for divisor from 2 &lt;= divisor &lt; current:
            if current % divisor == 0:
                break
        if divisor == current - 1:
            primes.append(current)
    return primes</pre>
</blockquote>
<p>This is only slightly faster and the generated code for that for-loop is 5 lines now. We still want a one line C style for-loop. The reason it is 5 lines in the is that the variable &#8220;current&#8221; is still a Python object and the C code has to convert between a Python object and a C long integer. We need to tell Cython to use C variable types instead of Python objects. You do this using the &#8220;cdef&#8221; keyword. Lets do this and while we&#8217;re here, we&#8217;ll change all the numbers to long integers:</p>
<blockquote>
<pre name="code" class="py">
def calculate(long limit):
    cdef long current
    cdef long divisor
    primes = []
    divisor = 0
    for current from 0 &lt;= current &lt; limit:
        previous = []
        for divisor from 2 &lt;= divisor &lt; current:
            if current % divisor == 0:
                break
        if divisor == current - 1:
            primes.append(current)
    return primes</pre>
</blockquote>
<p>As you can see I have changed the &#8220;limit&#8221; argument to say &#8220;long limit&#8221; which tells Cython to convert the limit argument from a Python object to a long integer when it is called. The &#8220;current&#8221; and &#8220;divisor&#8221; variables are now defined at the start of the function preceded with &#8220;cdef long&#8221;, telling Cython that they are long integers in the C code.</p>
<p>Now looking at that for-loop in the generated C code, it is now one line as we wanted:</p>
<blockquote>
<pre name="code" class="c">
for (__pyx_v_current = 0; __pyx_v_current &lt; __pyx_v_limit; __pyx_v_current++) {</pre>
</blockquote>
<p>This ends up running at an incredible 0.05 seconds. That is 15x faster than our original Python module.</p>
<p>I hope this tutorial has been useful to you!</p>
<p><strong>UPDATE:</strong> It turns out that changing all the variables in the xrange to cdefs will cause the generated C code to be one-liner for-loop. This means the alternate syntax &#8220;for i from 0 <= i < n&#8221; is not necessary when you&#8217;re only working with cdef&#8217;ed variables.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;t=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F&amp;title=Create%20a%20fast%20C%20Python%20extension%20with%20Cython%20tutorial" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=470Dok"><img src="http://feeds.feedburner.com/~f/slowchop?i=470Dok" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=dzOQBk"><img src="http://feeds.feedburner.com/~f/slowchop?i=dzOQBk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=V1UUOk"><img src="http://feeds.feedburner.com/~f/slowchop?i=V1UUOk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=fwObEk"><img src="http://feeds.feedburner.com/~f/slowchop?i=fwObEk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/283085227" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/05/04/cython-getting-started-and-optimisation-tutorial/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F05%2F04%2Fcython-getting-started-and-optimisation-tutorial%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/05/04/cython-getting-started-and-optimisation-tutorial/</feedburner:origLink></item>
		<item>
		<title>TracRecaptchaPlugin 0.1.0 - A CAPTCHA plugin for Trac</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/280554868/</link>
		<comments>http://slowchop.com/2008/04/26/tracrecaptchaplugin-010-a-captcha-plugin-for-trac/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 10:19:40 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Releases]]></category>

		<category><![CDATA[TracRecaptchaPlugin]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://slowchop.com/index.php/2008/04/26/tracrecaptchaplugin-010-a-captcha-plugin-for-trac/</guid>
		<description><![CDATA[I decided to make a CAPTCHA plugin for Trac called TracRecaptchaPlugin, to stop spammers using the ticket system. There is an existing Trac plugin to fight spammers, but it still lets through many automated spammers.
The plugin uses the reCAPTCHA service and is serving me well so far. Here&#8217;s how it looks within the template:

This is [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to make a CAPTCHA plugin for <a href="http://trac.edgewall.org/">Trac</a> called <a href="http://misc.slowchop.com/misc/wiki/TracRecaptchaPlugin">TracRecaptchaPlugin</a>, to stop spammers using the ticket system. There is an existing <a href="http://trac.edgewall.org/wiki/SpamFilter">Trac plugin to fight spammers</a>, but it still lets through many automated spammers.</p>
<p>The plugin uses the <a href="http://recaptcha.net/">reCAPTCHA</a> service and is <a href="http://pygooglechart.slowchop.com/pygooglechart/newticket">serving me well so far</a>. Here&#8217;s how it looks within the template:</p>
<p><img src="http://slowchop.com/wp-content/uploads/2008/04/recaptcha-screenshot.png" alt="TracRecaptchaPlugin Screenshot" /></p>
<p>This is my first publicly released Trac plugin so I&#8217;m unsure how it&#8217;ll perform out there, so feedback is welcome.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;t=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F&amp;title=TracRecaptchaPlugin%200.1.0%20-%20A%20CAPTCHA%20plugin%20for%20Trac" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=VtxjVk"><img src="http://feeds.feedburner.com/~f/slowchop?i=VtxjVk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=JqgEnk"><img src="http://feeds.feedburner.com/~f/slowchop?i=JqgEnk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=6B97mk"><img src="http://feeds.feedburner.com/~f/slowchop?i=6B97mk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=CBxsqk"><img src="http://feeds.feedburner.com/~f/slowchop?i=CBxsqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/280554868" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/04/26/tracrecaptchaplugin-010-a-captcha-plugin-for-trac/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Ftracrecaptchaplugin-010-a-captcha-plugin-for-trac%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/04/26/tracrecaptchaplugin-010-a-captcha-plugin-for-trac/</feedburner:origLink></item>
		<item>
		<title>Python Google Chart 0.2.0</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/280554869/</link>
		<comments>http://slowchop.com/2008/04/26/python-google-chart-020/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 08:34:48 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Releases]]></category>

		<category><![CDATA[pygooglechart]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[graphs]]></category>

		<category><![CDATA[visulization]]></category>

		<guid isPermaLink="false">http://slowchop.com/index.php/2008/04/26/python-google-chart-020/</guid>
		<description><![CDATA[I released pygooglechart 0.2.0 this afternoon after several months of patches coming in to add features and fix bugs. The main addition to pygooglechart is automatic data scaling, which is turned on by default. You can also specify the scale range manually:

chart = SimpleLineChart(width, height, x_range=(0, 100), y_range=(0, 100))

Other features are the new API chart [...]]]></description>
			<content:encoded><![CDATA[<p>I released <a href="http://pygooglechart.slowchop.com/">pygooglechart 0.2.0</a> this afternoon after several months of patches coming in to add features and fix bugs. The main addition to pygooglechart is automatic data scaling, which is turned on by default. You can also specify the scale range manually:</p>
<blockquote>
<pre name="code" class="py">chart = SimpleLineChart(width, height, x_range=(0, 100), y_range=(0, 100))</pre>
</blockquote>
<p>Other features are the new API chart types and options. There are 3 new chart types: Map, Google-o-Meter and Radar. Here is an example of using the Map chart type:</p>
<blockquote>
<pre name="code" class="py">import pygooglechart as gc

chart = gc.MapChart(440, 220)
chart.set_colours(('AAAAAA', '30A030', 'A0C030'))
chart.set_codes(['AU', 'US', 'CA', 'BR', 'NZ'])
chart.add_data([1, 0.5, 0.7, 0.3, 0.1])
chart.download('map.png')</pre>
</blockquote>
<p>Produces the URL:<br />
<a href="http://chart.apis.google.com/chart?cht=t&amp;chs=440x220&amp;chd=s:9frSG&amp;chco=AAAAAA,30A030,A0C030&amp;chtm=world&amp;chld=AUUSCABRNZ"> http://chart.apis.google.com/chart?cht=t&amp;chs=440&#215;220&amp;chd=s:9frSG&amp;chco=AAAAAA,30A030,A0C030&amp;chtm=world&amp;chld=AUUSCABRNZ</a></p>
<p>And the image:<br />
<img src="http://chart.apis.google.com/chart?cht=t&amp;chs=440x220&amp;chd=s:9frSG&amp;chco=AAAAAA,30A030,A0C030&amp;chtm=world&amp;chld=AUUSCABRNZ" /></p>
<p>The Google-o-meter has a funny name. Here is an example of its usage:</p>
<blockquote>
<pre name="code" class="py">import pygooglechart as gc

chart = gc.GoogleOMeterChart(440, 220, y_range=(0, 10))
chart.set_pie_labels(['Awesome'])
chart.add_data([8])
chart.download('gom.png')</pre>
</blockquote>
<p>It produces this URL:<br />
<a href="http://pygooglechart.slowchop.com/pygooglechart/newticket"> http://chart.apis.google.com/chart?cht=gom&amp;chs=440&#215;220&amp;chd=s:x&amp;chl=Awesome</a></p>
<p>And the image:<br />
<img src="http://chart.apis.google.com/chart?cht=gom&amp;chs=440x220&amp;chd=s:x&amp;chl=Awesome" /></p>
<p>Well, have fun. Please write a <a href="http://pygooglechart.slowchop.com/pygooglechart/newticket">ticket</a> for any bugs, patches or feature requests you have.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;t=Python%20Google%20Chart%200.2.0" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F&amp;title=Python%20Google%20Chart%200.2.0" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=jPNFLk"><img src="http://feeds.feedburner.com/~f/slowchop?i=jPNFLk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=hrQj1k"><img src="http://feeds.feedburner.com/~f/slowchop?i=hrQj1k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=MIZXUk"><img src="http://feeds.feedburner.com/~f/slowchop?i=MIZXUk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=undgNk"><img src="http://feeds.feedburner.com/~f/slowchop?i=undgNk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/280554869" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/04/26/python-google-chart-020/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F04%2F26%2Fpython-google-chart-020%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/04/26/python-google-chart-020/</feedburner:origLink></item>
		<item>
		<title>Mixing IPython and autoimp</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/280554870/</link>
		<comments>http://slowchop.com/2008/02/25/mixing-ipython-and-autoimp/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 03:03:04 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Tips]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://slowchop.com/index.php/2008/02/25/mixing-ipython-and-autoimp/</guid>
		<description><![CDATA[IPython is great for typing up quick tests. Unfortunately it is annoying when you have to import modules just to use it for one or two commands. autoimp is a Python module where it automatically imports modules when you refer to them. It works well with IPython simply by adding &#8220;import_all autoimp&#8221; somewhere in your [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ipython.scipy.org/moin/">IPython</a> is great for typing up quick tests. Unfortunately it is annoying when you have to import modules just to use it for one or two commands. <a href="http://www.princeton.edu/~csbarnes/code/autoimp/">autoimp</a> is a Python module where it automatically imports modules when you refer to them. It works well with IPython simply by adding &#8220;import_all autoimp&#8221; somewhere in your &#8220;~/.ipython/ipythonrc&#8221; file.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;t=Mixing%20IPython%20and%20autoimp" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F&amp;title=Mixing%20IPython%20and%20autoimp" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=1JHNwk"><img src="http://feeds.feedburner.com/~f/slowchop?i=1JHNwk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=vQm4dk"><img src="http://feeds.feedburner.com/~f/slowchop?i=vQm4dk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=1FPJSk"><img src="http://feeds.feedburner.com/~f/slowchop?i=1FPJSk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=SlcJFk"><img src="http://feeds.feedburner.com/~f/slowchop?i=SlcJFk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/280554870" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/02/25/mixing-ipython-and-autoimp/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F25%2Fmixing-ipython-and-autoimp%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/02/25/mixing-ipython-and-autoimp/</feedburner:origLink></item>
		<item>
		<title>Changed blog theme</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/280554871/</link>
		<comments>http://slowchop.com/2008/02/24/changed-blog-theme/#comments</comments>
		<pubDate>Sun, 24 Feb 2008 06:19:41 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[Slowchop]]></category>

		<guid isPermaLink="false">http://slowchop.com/index.php/2008/02/24/changed-blog-theme/</guid>
		<description><![CDATA[I&#8217;ve got a large list of things to do, but decided to finally implement my new HTML/CSS theme to this blog. Tell me what you think or see any problems with it. I will use the same theme with the slowchop.com project sites.






	
	
	
	
	
	
	
	


]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve got a large list of things to do, but decided to finally implement my new HTML/CSS theme to this blog. Tell me what you think or see any problems with it. I will use the same theme with the slowchop.com project sites.</p>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;t=Changed%20blog%20theme" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F&amp;title=Changed%20blog%20theme" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=dtYIsk"><img src="http://feeds.feedburner.com/~f/slowchop?i=dtYIsk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=lHBjrk"><img src="http://feeds.feedburner.com/~f/slowchop?i=lHBjrk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=uOAeVk"><img src="http://feeds.feedburner.com/~f/slowchop?i=uOAeVk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=cCJ0ek"><img src="http://feeds.feedburner.com/~f/slowchop?i=cCJ0ek" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/280554871" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2008/02/24/changed-blog-theme/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2008%2F02%2F24%2Fchanged-blog-theme%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2008/02/24/changed-blog-theme/</feedburner:origLink></item>
		<item>
		<title>Release Update</title>
		<link>http://feeds.feedburner.com/~r/slowchop/~3/280554872/</link>
		<comments>http://slowchop.com/2007/12/12/release-update/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 00:55:21 +0000</pubDate>
		<dc:creator>Gerald Kaszuba</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[Releases]]></category>

		<category><![CDATA[pycallgraph]]></category>

		<category><![CDATA[pygooglechart]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://slowchop.com/index.php/2007/12/12/release-update/</guid>
		<description><![CDATA[Just a quick update. I have recently made some Python releases.

PyGoogleChart 0.1.0 - Initial release of a Python wrapper  for the Google Chart API.
Python Call Graph 0.4.1 - Speed improvements for the visual call graph Python library.







	
	
	
	
	
	
	
	


]]></description>
			<content:encoded><![CDATA[<p>Just a quick update. I have recently made some Python releases.</p>
<ul>
<li><a href="http://pygooglechart.slowchop.com/">PyGoogleChart</a> 0.1.0 - Initial release of a Python wrapper  for the <a href="http://code.google.com/apis/chart/">Google Chart API</a>.</li>
<li><a href="http://pycallgraph.slowchop.com">Python Call Graph</a> 0.4.1 - Speed improvements for the visual call graph Python library.</li>
</ul>






	<a rel="nofollow" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="Digg"><img src="http://slowchop.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://del.icio.us/post?url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="del.icio.us"><img src="http://slowchop.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;t=Release%20Update" title="Facebook"><img src="http://slowchop.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="Mixx"><img src="http://slowchop.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="Google"><img src="http://slowchop.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google" alt="Google" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="description"><img src="http://slowchop.com/wp-content/plugins/sociable/images/dzone.png" title="description" alt="description" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://reddit.com/submit?url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="Reddit"><img src="http://slowchop.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F&amp;title=Release%20Update" title="StumbleUpon"><img src="http://slowchop.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>


<br/><br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/slowchop?a=fZP3uk"><img src="http://feeds.feedburner.com/~f/slowchop?i=fZP3uk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=ZgmtLk"><img src="http://feeds.feedburner.com/~f/slowchop?i=ZgmtLk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=WWUuck"><img src="http://feeds.feedburner.com/~f/slowchop?i=WWUuck" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/slowchop?a=QvNqfk"><img src="http://feeds.feedburner.com/~f/slowchop?i=QvNqfk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/slowchop/~4/280554872" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://slowchop.com/2007/12/12/release-update/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=slowchop&amp;itemurl=http%3A%2F%2Fslowchop.com%2F2007%2F12%2F12%2Frelease-update%2F</feedburner:awareness><feedburner:origLink>http://slowchop.com/2007/12/12/release-update/</feedburner:origLink></item>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=slowchop</feedburner:awareness></channel>
</rss><!-- Dynamic Page Served (once) in 0.429 seconds --><!-- Cached page served by WP-Cache -->
