<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Misspent</title>
	<atom:link href="http://misspent.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://misspent.wordpress.com</link>
	<description>Time, money, youth, energy, and cycles</description>
	<lastBuildDate>Sun, 14 Apr 2013 08:23:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='misspent.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Misspent</title>
		<link>http://misspent.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://misspent.wordpress.com/osd.xml" title="Misspent" />
	<atom:link rel='hub' href='http://misspent.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Debugging C/C++ and CPython using GDB 7&#8242;s new Python extension support</title>
		<link>http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new-python-extension-support/</link>
		<comments>http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new-python-extension-support/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 09:40:05 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[gdb]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=405</guid>
		<description><![CDATA[I&#8217;ve recently been looking into ways to improve my debugging experience with mixed Python and C/C++ programs. I spend a fair amount of time working on systems built using both languages in tandem, and the tools available for debugging across the languages have historically been very limited. Often, logging and/or intimate knowledge of the Python [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=405&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently been looking into ways to improve my debugging experience with mixed Python and C/C++ programs. I spend a fair amount of time working on systems built using both languages in tandem, and the tools available for debugging across the languages have historically been very limited. Often, logging and/or intimate knowledge of the Python C-API (and, in my case, boost.python) were the primary tools available.</p>
<p>I was naturally very excited, then, when GDB 7 introduced support for extension via Python. This seemed like an obvious step towards a &#8220;unified&#8221; debugging environment, one where I could step naturally between the languages, set breakpoints, etc. This new GDB feature doesn&#8217;t solve the problem directly, but it opens the door for more sophisticated extensions to GDB than were previously practical.</p>
<p>Building on this new GDB feature, recent Python source releases include GDB extensions as a build product. That is, starting at around python-3.2, when you build Python from source one of the build products is a set of GDB extensions that make it possible to do very natural debugging of Python from inside GDB. These extensions allow you, for example, to step up and down the Python call stack, display frame information (locals), and so forth. And this can be done while <em>also</em> navigating the base C call stack. This provides a very intuitive and productive debugging environment for anyone working across the two runtime environment.</p>
<p><em>edit:</em> It was pointed out on <a href="http://redd.it/rbd1y">reddit</a> that gdb&#8217;s embedded Python interpreter has been around since 2009 and is thus not particularly new.</p>
<h2>GDB 7&#8242;s Python extension system</h2>
<p>What exactly is GDB&#8217;s new Python extension system? Broadly speaking, it&#8217;s a way to script GDB using Python rather than GDB&#8217;s own internal language. From around version 7 onward, GDB embeds a Python interpreter that you can invoke from the prompt and from scripts. For example:</p>
<pre class="brush: plain; title: ; notranslate">
(gdb) python
&gt;import sys
</pre>
<p>To support writing extensions, you can import the module &#8220;gdb&#8221; from this embedded interpreter. This module provides access and hooks into GDB so that you can control it via Python scripts. You can read all about this Python extension support in <a href="http://sourceware.org/gdb/download/onlinedocs/gdb/Python.html#Python">GDB&#8217;s documentation</a>.</p>
<p>This new facility has been used to implement, for example, <a href="http://sourceware.org/gdb/wiki/STLSupport">pretty printers for STL containers</a>. But in this article we&#8217;re interested in improving the CPython debugging experience, so we&#8217;ll cover that in the next section.</p>
<h2>Python&#8217;s GDB extensions</h2>
<p>As previously mentioned, recent Python source releases (from about 3.2 onward) include a new build product: a GDB Python extension that helps you debug Python. What does this mean? The extension encodes knowledge about CPython&#8217;s actual C-level structures, function frame implementation, PyObject, and so forth. It hooks this knowledge into GDB so that you can interrogate the CPython runtime at the Python source level rather than the CPython level.</p>
<p>For example, here are some partial stack traces from a break point inside a C extension module. The first one is a raw stack trace showing the guts of CPython execution:</p>
<pre class="brush: plain; title: ; notranslate">
(gdb) bt
 #0 get_value () at some_lib.c:1
 #1 0x00007ffff686348c in ffi_call_unix64 () at /home/abingham/src/Python-3.2/Modules/_ctypes/libffi/src/x86/unix64.S:75
 #2 0x00007ffff6862bc3 in ffi_call (cif=0x7fffffffde40, fn=, rvalue=, avalue=)
 at /home/abingham/src/Python-3.2/Modules/_ctypes/libffi/src/x86/ffi64.c:485
 #3 0x00007ffff68574ec in _call_function_pointer (pProc=, argtuple=, flags=,
 argtypes=, restype=, checker=) at /home/abingham/src/Python-3.2/Modules/_ctypes/callproc.c:808
 #4 _ctypes_callproc (pProc=, argtuple=, flags=, argtypes=,
 restype=, checker=) at /home/abingham/src/Python-3.2/Modules/_ctypes/callproc.c:1151
 #5 0x00007ffff684f823 in PyCFuncPtr_call (self=0x7ffff7e3a600, inargs=0x7ffff7f87050, kwds=)
 at /home/abingham/src/Python-3.2/Modules/_ctypes/_ctypes.c:3766
 #6 0x00000000004db737 in PyObject_Call (func=0x7ffff7e3a600, arg=0x506417, kw=0x4) at Objects/abstract.c:2149
 #7 0x00000000004658d4 in do_call (f=0x987d20, throwflag=) at Python/ceval.c:4095
</pre>
<p>The next one shows the Python debugging extension getting loaded, followed by a new stack trace. This new trace is still at the C source level, but you&#8217;ll notice that many of the CPython calls are annotated with Python source level information (e.g. file names, line numbers, etc.):</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) python
 &gt;import python3_2_gdb
 &gt;(gdb) bt
 #0 get_value () at some_lib.c:1
 #1 0x00007ffff686348c in ffi_call_unix64 () at /home/abingham/src/Python-3.2/Modules/_ctypes/libffi/src/x86/unix64.S:75
 #2 0x00007ffff6862bc3 in ffi_call (cif=0x7fffffffde40, fn=, rvalue=, avalue=)
 at /home/abingham/src/Python-3.2/Modules/_ctypes/libffi/src/x86/ffi64.c:485
 #3 0x00007ffff68574ec in _call_function_pointer (pProc=, argtuple=, flags=,
 argtypes=, restype=, checker=) at /home/abingham/src/Python-3.2/Modules/_ctypes/callproc.c:808
 #4 _ctypes_callproc (pProc=, argtuple=, flags=, argtypes=,
 restype=, checker=) at /home/abingham/src/Python-3.2/Modules/_ctypes/callproc.c:1151
 #5 0x00007ffff684f823 in PyCFuncPtr_call (self=0x7ffff7e3a600, inargs=(), kwds=) at /home/abingham/src/Python-3.2/Modules/_ctypes/_ctypes.c:3766
 #6 0x00000000004db737 in PyObject_Call (func=, arg=, kw=)
 at Objects/abstract.c:2149
 #7 0x00000000004658d4 in do_call (f=
 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;), throwflag=) at Python/ceval.c:4095
 #8 call_function (f=
 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;), throwflag=) at Python/ceval.c:3898
 #9 PyEval_EvalFrameEx (f=
 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;), throwflag=) at Python/ceval.c:2673

</pre>
<p>In particular, notice that the &#8220;python&#8221; command changes the GDB prompt to &#8220;&gt;&#8221;. This is how you can tell when you&#8217;re in python mode. To exit python mode, you need to use Ctrl-D (on windows this might be Ctrl-Z&#8230;I haven&#8217;t checked.)</p>
<p>This final stack trace shows a Python source level stack trace provided by the extension:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) py-bt
 #9 (unable to read python frame information)
 #12 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;)
 print(lib.get_value())
 #15 Frame 0x98a700, for file bar.py, line 9, in baz ()
 llama()
</pre>
<p>It&#8217;s important to recognize that this was all done in the same GDB session, at the same break point, etc. What you can see is that the Python-provided extension gives you a very clear picture of the exact state of the Python stack along with the underlying C stack. If you&#8217;ve ever tried debugging C extensions through GDB, you&#8217;ll immediately appreciate the clarity this provides.</p>
<h3>Other extension features</h3>
<p>The CPython GDB extension provides more than just stack traces and frame annotation. You can also use it to navigate the Python stack:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) py-up
 #12 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;)
 print(lib.get_value())
 (gdb) py-up
 #15 Frame 0x98a700, for file bar.py, line 9, in baz ()
 llama()
 (gdb) py-down
 #12 Frame 0x987d20, for file bar.py, line 5, in llama (lib=&lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;)
 print(lib.get_value())
</pre>
<p>examine locals:</p>
<pre class="brush: plain; title: ; notranslate">
(gdb) py-locals

lib = &lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;
</pre>
<p>list source code:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) py-list
 1 import ctypes
 2
 3 def llama():
 4 lib = ctypes.cdll.LoadLibrary('libsome_lib.so')
 5 print(lib.get_value())
 6
 7 def baz():
 8 print('baz')
 9 llama()
 10
</pre>
<p>and print individual variables:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) py-print lib
 local 'lib' = &lt;CDLL(_FuncPtr=, get_value=, _handle=9720816, _name='libsome_lib.so') at remote 0x7ffff6ac53d0&gt;
</pre>
<h3>Limitations</h3>
<p>The CPython extension doesn&#8217;t (yet?) offer a complete debugging solution. For example, I haven&#8217;t found any way to set a break point in Python code. Likewise, you can&#8217;t set watches on Python variables. These features may not even be feasible with the GDB architecture. Nevertheless, the extension is a powerful tool for most debugging needs.</p>
<h2>Installation</h2>
<p>To install the CPython GDB extension, you need to do the following:</p>
<ol>
<li>Compile Python from source. This will produce the file &#8220;python-gdb.py&#8221; at the root of the Python source tree.</li>
<li>Tell GDB where to find extension modules.</li>
<li>Put the generated extension from step 1 where GDB can find it.</li>
</ol>
<p>To do step 1, simply compile Python as you normally would. This is covered extensively by Python, so I won&#8217;t go into the details here.</p>
<p>For step 2, you need to pick a place (or places) for GDB extension modules to live. I just created the directory &#8220;~/.gdb&#8221; for this purpose. To tell GDB to look here for extensions, what you really need to do is extend sys.path in GDB&#8217;s embedded Python interpreter. For example, I have this code in my .gdbinit:</p>
<pre class="brush: plain; title: ; notranslate">
 python
 import sys
 sys.path.insert(0, '/home/abingham/.gdb')
 end
</pre>
<p>This effectively puts GDB int python mode and then extends sys.path to look in ~/.gdb.</p>
<p>Finally, to activate the extension module &#8211; that is, to make it available in a particular GDB session &#8211; you need to import it. You do that like this:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) Python
 &gt;import python3_2_gdb
 &gt;(gdb)
</pre>
<p>(Again, remember that you exit python mode and return to the GDB prompt with Ctrl-D.)</p>
<p>Once you do this, all of the extension commands (py-list, py-up, etc.) and the frame annotations are activated.</p>
<h3>When to load the module</h3>
<p>There is one important point to remember with regard to the timing of the extension import. If you attempt to load the extension before the corresponding Python library has been loaded into memory, you will get errors like this:</p>
<pre class="brush: plain; title: ; notranslate">
 (gdb) python
 &gt;import python3_2_gdb
 &gt;Traceback (most recent call last):
 File &quot;&quot;, line 1, in
 File &quot;/home/abingham/.gdb/python3_2_gdb.py&quot;, line 52, in
 _type_size_t = gdb.lookup_type('size_t')
 RuntimeError: No type named size_t.
 Error while executing Python code.
</pre>
<p>Because of this, you generally can not import the CPython extension module in your standard .gdbinit. Rather, you need to load it manually when you need it. In practice this is just fine since you will probably have various versions of the extension that you need at different times (see next section.)</p>
<h3>Dealing with multiple Python versions</h3>
<p>It&#8217;s important to remember that different variants of the Python build will generate different extensions. This is because the variants (e.g. debug and non-debug) will, in general, have different C-level structure sizes. As a result, an extension built for debug Python will not work (or may work incorrectly) for release versions of Python. One way to cope with this is simply to name the different versions of the extension differently. For example, the extension for the normal build of Python 3.2 might be &#8220;python3_2_gdb.py&#8221; while the debug version might be &#8220;python3_2_debug_gdb.py&#8221;. It doesn&#8217;t really matter what naming scheme you use, so just find one that maps to your personal taste.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/405/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=405&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new-python-extension-support/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>Compiling dbus-python-1.0.0 for python3 on ubuntu&#8230;and making it work.</title>
		<link>http://misspent.wordpress.com/2012/02/11/compiling-dbus-python-1-0-0-for-python3-on-ubuntu-and-making-it-work/</link>
		<comments>http://misspent.wordpress.com/2012/02/11/compiling-dbus-python-1-0-0-for-python3-on-ubuntu-and-making-it-work/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 18:37:45 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=397</guid>
		<description><![CDATA[It took me a fair amount of time to get dbus-python-1.0.0 building and properly installing for python3 on my ubuntu system, so I figured I&#8217;d make a record of what I had to do. Note that I use the grep replacement grin in this work. After unpacking the source, first configure the build with the correct [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=397&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>It took me a fair amount of time to get dbus-python-1.0.0 building and properly installing for python3 on my ubuntu system, so I figured I&#8217;d make a record of what I had to do. Note that I use the <em>grep</em> replacement <em><a title="grin" href="http://pypi.python.org/pypi/grin">grin</a></em> in this work.</p>
<p>After unpacking the source, first configure the build with the correct version of python:</p>
<p><code>PYTHON=python3.2 ./configure</code></p>
<p>It&#8217;s critical that you use the full python version, not just e.g. &#8220;python3&#8243;. The build determines where to install stuff based on this string, and &#8220;python3&#8243; was putting code outside of my sys.path.</p>
<p>Then, I had to run &#8216;make&#8217; to sort of &#8220;wake up&#8221; the autoconf system. That stuff is all a big mystery to me, for the most part, but I&#8217;ve learned to work around it.</p>
<p>Any, after the initial build I had to replace all uses of &#8220;site-packages&#8221; in the source with &#8220;dist-packages&#8221;:</p>
<p><code>grin -l site-packages | xargs sed -i -e 's/site-packages/dist-packages/'</code></p>
<p>This again had to do with sys.path, which doesn&#8217;t include site-packages by default. Whatever. With that done, I did a &#8220;make clean&#8221; followed by another &#8220;make&#8221;. Finally, I did normal &#8220;make install&#8221; put everything in the right place.</p>
<p>Here the sum of the operations:<br />
<code><br />
tar zxvf dbus-python-1.0.0.tar.gz<br />
cd dbus-python-1.0.0<br />
PYTHON=python3.2 ./configure<br />
make<br />
grin -l site-packages | xargs sed -i -e 's/site-packages/dist-packages/'<br />
make clean<br />
make<br />
sudo make install<br />
</code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/397/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=397&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2012/02/11/compiling-dbus-python-1-0-0-for-python3-on-ubuntu-and-making-it-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>lazy-slides considers getting off its lazy butt and being constructive</title>
		<link>http://misspent.wordpress.com/2011/12/31/lazy-slides-considers-getting-off-its-lazy-butt-and-being-constructive/</link>
		<comments>http://misspent.wordpress.com/2011/12/31/lazy-slides-considers-getting-off-its-lazy-butt-and-being-constructive/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 08:08:58 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=393</guid>
		<description><![CDATA[I&#8217;m happy to announce the first &#8220;release&#8221; of lazy-slides, an experiment in slideshow generation for lazy bums. The idea is simple: You provide a list of keywords lazy-slides finds pictures from the internet matching those keywords lazy-slides creates a presentation/slideshow from those pictures You present! Right now it&#8217;s a bit rough. The only image source [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=393&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m happy to announce the first &#8220;release&#8221; of <a title="lazy-slides" href="http://code.google.com/p/lazy-slides/">lazy-slides</a>, an experiment in slideshow generation for lazy bums. The idea is simple:</p>
<ol>
<li>You provide a list of keywords</li>
<li>lazy-slides finds pictures from the internet matching those keywords</li>
<li>lazy-slides creates a presentation/slideshow from those pictures</li>
<li>You present!</li>
</ol>
<p>Right now it&#8217;s a bit rough. The only image source I&#8217;ve coded up is for <a title="flickr" href="http://www.flickr.com/">flickr</a> (if you don&#8217;t count the dummy test source.) Also, the only output backend it supports is <a title="beamer" href="http://en.wikipedia.org/wiki/Beamer_(LaTeX)">beamer</a>. In both cases, it should be relatively straightforward to extend lazy-slides.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=393&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/12/31/lazy-slides-considers-getting-off-its-lazy-butt-and-being-constructive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>parameterized-testcase 0.2 released</title>
		<link>http://misspent.wordpress.com/2011/08/16/parameterized-testcase-0-2-released/</link>
		<comments>http://misspent.wordpress.com/2011/08/16/parameterized-testcase-0-2-released/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 19:49:48 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=390</guid>
		<description><![CDATA[I&#8217;ve released parameterized-testcase 0.2. This is primarily just a documentation release, with lots of improvements to the sphinx docs. Get it here.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=390&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve released parameterized-testcase 0.2. This is primarily just a documentation release, with lots of improvements to the sphinx docs. Get it <a href="http://code.google.com/p/parameterized-testcase/">here</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/390/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=390&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/08/16/parameterized-testcase-0-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>ackward 0.4 is released</title>
		<link>http://misspent.wordpress.com/2011/07/31/ackward-0-4-is-released/</link>
		<comments>http://misspent.wordpress.com/2011/07/31/ackward-0-4-is-released/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 15:12:01 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=388</guid>
		<description><![CDATA[The 0.4 release of ackward is available now at the project site. This release is focused on the logging module. It addresses a number of design issue and defects, and the sphinx documentation for logging is much more complete. It even includes example code for much of the module.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=388&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The 0.4 release of ackward is available now at the <a href="http://code.google.com/p/ackward/">project site</a>.</p>
<p>This release is focused on the logging module. It addresses a number of design issue and defects, and the sphinx documentation for logging is much more complete. It even includes example code for much of the module.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/388/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=388&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/07/31/ackward-0-4-is-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>eproject + anything: simple emacs project management</title>
		<link>http://misspent.wordpress.com/2011/05/31/eproject-anything-simple-emacs-project-management/</link>
		<comments>http://misspent.wordpress.com/2011/05/31/eproject-anything-simple-emacs-project-management/#comments</comments>
		<pubDate>Tue, 31 May 2011 06:50:47 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[emacs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=381</guid>
		<description><![CDATA[The quest for &#8220;project&#8221; As many people have pointed out before, emacs does not come with any packages for managing software projects. It comes with almost all of the parts you would need &#8211; debugger support, compilation modes, etc. &#8211; but it doesn&#8217;t come bundled with any way to tie a bunch of files together [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=381&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h2>The quest for &#8220;project&#8221;</h2>
<p>As many people have pointed out before, emacs does not come with any packages for managing software projects. It comes with almost all of the parts you would need &#8211; debugger support, compilation modes, etc. &#8211; but it doesn&#8217;t come bundled with any way to tie a bunch of files together in to a project. Certainly this isn&#8217;t required to do software development, and, just as certainly, there are a myriad of ways to approach the concept of &#8220;projects&#8221;. This latter issue is likely why the basic emacs installation side-steps the issue.</p>
<p>In any case, I recently decided to look into the available project management options for emacs. I&#8217;ve used enough other big IDEs and tools to know that projects <em>can</em> be really useful, so I was curious what I could get for emacs. I wanted one that didn&#8217;t disrupt my normal emacs flow, one that had a clear and explicit model of what the project comprises, and ideally one that was highly hackable.</p>
<p>I looked at a number of tools, include <a title="CEDET" href="http://cedet.sourceforge.net/" target="_blank">CEDET</a> (probably good but too bulky-feeling), <a title="proel" href="http://www.stifflog.com/2008/12/14/proel-project-support-for-emacs/" target="_blank">proel</a> (nice, but I didn&#8217;t fit it&#8217;s model of the world), and <a title="mk-project" href="http://www.emacswiki.org/emacs/mk-project.el" target="_blank">mk-project</a> (not really sure&#8230;just didn&#8217;t work for me.) Honestly, I didn&#8217;t spend a whole lot of time vetting these. My sense was that if the package didn&#8217;t <em>click</em> with me quickly, then it wasn&#8217;t what I was looking for.</p>
<h2>The winner: eproject</h2>
<p>Ultimately, I settled on <a title="eproject" href="http://www.emacswiki.org/emacs/eproject" target="_blank">eproject</a>. <em>eproject</em> essentially comprises three concepts:</p>
<ul>
<li>a top-level directory for a project</li>
<li>a collection of files in the project</li>
<li>a collection of commands that can be run relative to the project directory</li>
</ul>
<p>A project is simply stored in a file in the project directory, and there is a central collection of projects stored in a file in your .emacs directory. It&#8217;s a very simple model, and everything is easily accessible.</p>
<p>I won&#8217;t go into any details on how to use<em> eproject</em>; the project page and emacswiki do a fine job of that, and I don&#8217;t really have anything to add. I do suggest, however, that you run <em> eproject </em>through its paces a bit on some smaller project just to get a feel for it. All in all, though, I found it intuitive, well documented, and easy to work with.</p>
<p><strong>NOTE:</strong> There is another emacs project package also named <a title="eproject" href="https://github.com/jrockway/eproject/wiki" target="_blank">eproject</a>. The name conflict is unfortunate and confusing, so be aware. I did try this second eproject in my search, and while it&#8217;s a fine piece of software it didn&#8217;t really fit my needs.</p>
<h2>Using eproject with anything</h2>
<p>Many emacs users are fans of the excellent <a title="Anything" href="http://www.emacswiki.org/emacs/Anything" target="_blank">anything</a><em>, </em>and for good reason: it&#8217;s awesome! Fortunately, Daniel Hackney (good programmer name) wrote <a title="anything-eproject" href="http://www.emacswiki.org/emacs/anything-eproject.el" target="_blank">anything-eproject</a> which marries the two projects. <em>anything-eproject</em> allows you to access your projects and project contents via the <em>anything</em> interface by providing two new &#8220;sources&#8221;.</p>
<h2>Making it work</h2>
<p>Putting this all together in your emacs configuration is pretty simple. Just download the eproject, anything, and anything-eproject packages to your .emacs directory and add something like this to your configuration:</p>
<pre class="brush: plain; title: ; notranslate">
; load eproject
(load-file &quot;~/.emacs.d/eproject/eproject.el&quot;)

; Disable automatic addition/removal of files from projects. Optional.
(setq prj-autotracking nil)

; anything + eproject integration
(require 'anything-eproject)

; let project files be sources in anything
(add-to-list 'anything-sources 'anything-c-source-eproject-files t)

; let projects be sources in anything
(add-to-list 'anything-sources 'anything-c-source-eproject-projects t)
</pre>
<h2>Future work</h2>
<p>While <em>eproject</em> works well, there are some things I would like to add. First, it can be a bit cumbersome to add a lot of files to a project, especially if the files in your project are spread across many directories. I&#8217;ve developed a small extension to <em>eproject</em> that tries to address this, and I&#8217;m working with the author to get this change in.</p>
<p>Second, I&#8217;d like support for &#8220;cloning&#8221; projects. I often work with multiple versions of very similar (often identical) projects, and it would be nice if <em>eproject</em> would let me bootstrap a new project definition based on an old one. This should be relatively simple, I think.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/381/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=381&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/05/31/eproject-anything-simple-emacs-project-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>Compiling g++-4.1 on Ubuntu Natty Narwhal</title>
		<link>http://misspent.wordpress.com/2011/04/26/compiling-g-4-1-on-ubuntu-natty-narwhal/</link>
		<comments>http://misspent.wordpress.com/2011/04/26/compiling-g-4-1-on-ubuntu-natty-narwhal/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 11:35:09 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=358</guid>
		<description><![CDATA[I recently upgraded my work machine to the latest Ubuntu version (natty narwhal, 11.&#60;something&#62;). By and large this went smoothly. However, we require gcc/g++-4.1 , and I had neglected to verify that this was available after the upgrade. It wasn&#8217;t. So, after a few abortive attempts to install packages I found on the web and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=358&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I recently upgraded my work machine to the latest Ubuntu version (natty narwhal, 11.&lt;something&gt;). By and large this went smoothly. However, we require gcc/g++-4.1 , and I had neglected to verify that this was available after the upgrade.</p>
<p>It wasn&#8217;t.</p>
<p>So, after a few abortive attempts to install packages I found on the web and such, I determined that what I really needed to do was just build gcc from source. I&#8217;ve done this a number of times in the past, so I knew what I was getting into, and by-and-large the process was very straightforward. I had to patch the gcc build files in a few places, though, so I figured I should document the process to save me and others time in the future.</p>
<p><em>NOTE:</em> This is on an amd64 machine, building a compiler for the same platform. YMMV.</p>
<h2>Install a few packages</h2>
<p>For the build to work, you&#8217;ll need to install a few other packages that provide headers files, etc. The packages you&#8217;ll need are:</p>
<ul>
<li>linux-header-&lt;kernel-version&gt;</li>
<li>gcc-multilib</li>
</ul>
<p>(There may be others, and I&#8217;ll try to update this list as I hear about them.)</p>
<h2>Make MULTILIB look in the right directories</h2>
<p>In <em>gcc/config/i386/t-linux64</em> you need to correct the directories used for MULTILIB stuff. Change line 9 from:<br />
<code>MULTILIB_OSDIRNAMES = ../lib64 ../lib</code><br />
to<br />
<code>MULTILIB_OSDIRNAMES = ../lib ../lib32</code></p>
<h2>Change the &#8220;version&#8221; string that the build expects from ld</h2>
<p>The gcc build parses the output of &#8220;ld &#8211;version&#8221;. Unfortunately, ubuntu decided to change that output, causing gcc to think that the ld version is really old. In <em>libstdc++-v3/configure</em> change line 8284 from:<br />
<code>sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`</code><br />
to<br />
<code>sed -e 's/GNU ld (GNU Binutils for Ubuntu) \([0-9.][0-9.]*\).*/\1/'`</code></p>
<h2>The full patch</h2>
<p>You can <a href="http://pastebin.com/FKkiciZz">download the patch from pastebin</a>.</p>
<p>Be aware that this patch is only against gcc-core and gcc-g++, not against the entire gcc suite.</p>
<h2>Step-by-step</h2>
<p>These steps should more-or-less do everything you need to download, patch, build, and install gcc/g++-4.1. Everything will get installed to /usr/local/gcc-4.1/[bin,lib], and the programs will have the suffix &#8220;-4.1&#8243;.</p>
<pre>wget ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-4.1.2/gcc-core-4.1.2.tar.bz2
wget ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-4.1.2/gcc-g++-4.1.2.tar.bz2
tar jxvf gcc-core-4.1.2.tar.bz2
tar jxvf gcc-g++-4.1.2.tar.bz2
&lt;download patch from pastebin&gt;
cd gcc-4.1.2
patch -p1 &lt; ../FKkiciZz.txt
./configure --prefix=/usr/local/gcc-4.1 --program-suffix=-4.1
make
make install
...set up symlinks to /usr/local/gcc-4.1/bin/g++-4.1, etc...</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/358/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=358&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/04/26/compiling-g-4-1-on-ubuntu-natty-narwhal/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>Thialfi: because I haven&#8217;t already got enough to work on!</title>
		<link>http://misspent.wordpress.com/2011/02/13/thialfi-because-i-havent-already-got-enough-to-work-on/</link>
		<comments>http://misspent.wordpress.com/2011/02/13/thialfi-because-i-havent-already-got-enough-to-work-on/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 20:22:55 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[appengine]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=350</guid>
		<description><![CDATA[I&#8217;ve recently started making some progress on a project that I&#8217;ve wanted to do for a while now. The project, Thialfi *, fills the vacancy left in my life&#8230;indeed, in my heart&#8230;when &#8220;I Want Sandy&#8221; went offline. Sandy was something of an online digital assistant, and it (she?) probably had lots of features I never [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=350&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently started making some progress on a project that I&#8217;ve wanted to do for a while now. The project, Thialfi <a href="#wtf">*</a>, fills the vacancy left in my life&#8230;indeed, in my heart&#8230;when &#8220;I Want Sandy&#8221; went offline. Sandy was something of an online digital assistant, and it (she?) probably had lots of features I never used. But it had one killer feature that I loved: You could send natural-language(-ish) emails to Sandy, asking to be reminded of something at a particular time, and Sandy would remind you. Simple, effective, practical, and nearly invisible.</p>
<p>Thialfi aims to emulate that feature. For example, I want to be able to send an email to Thialfi (using a custom address for my account, which only accepts emails from addresses I register) with a subject like &#8220;Remind me to top off the gas in the yacht next Wednesday at 5pm&#8221;. Next Wednesday, a little before 5, Thialfi will send me an email saying &#8220;Top off the gas in the yacht.&#8221; There are refinements and extensions to the idea (repeated events, SMS), but that&#8217;s the crux of it.</p>
<p>When Sandy went dark, some of its users talked about creating a replacement, but as far as I know none ever materialized. There are some other similar services I&#8217;ve tried, but none of them had the sheer simplicity and effectiveness (never mind the personality) of Sandy. That plus the fact that it&#8217;s an interesting project led me to start Thialfi. There&#8217;s not much there yet, and part of the curve will be learning more about Google&#8217;s AppEngine and web_app, but hopefully I&#8217;ll keep motivated long enough to create something really useful.</p>
<p>You can follow the action (or join in!) at the <a href="http://code.google.com/p/thialfi/">google code page</a>.</p>
<p><em><a name="wtf">*</a> Thialfi is, by some estimations, the messenger of the gods in Norse mythology.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/350/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=350&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/02/13/thialfi-because-i-havent-already-got-enough-to-work-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>An enum for Python</title>
		<link>http://misspent.wordpress.com/2011/02/04/an-enum-for-python/</link>
		<comments>http://misspent.wordpress.com/2011/02/04/an-enum-for-python/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 16:44:23 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=343</guid>
		<description><![CDATA[The internet abounds with implementations of enumerations for Python, but I thought it might be fun to take a crack at making one. My goals were: Immutability: users shouldn&#8217;t be able to modify the value at runtime Simplicity of definition: They should be easy to define Uniqueness: Two enum values aren&#8217;t equal unless they are [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=343&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The internet abounds with implementations of enumerations for Python, but I thought it might be fun to take a crack at making one. My goals were:</p>
<ol>
<li>Immutability: users shouldn&#8217;t be able to modify the value at runtime</li>
<li>Simplicity of definition: They should be easy to define</li>
<li>Uniqueness: Two enum values aren&#8217;t equal unless they are the same, no matter what their numeric value is</li>
<li>Iteration: The user can iterate over the values in the enum</li>
<li>Pickle-able: Naturally&#8230;</li>
</ol>
<p><a href="https://bitbucket.org/abingham/python_enum/overview">Here&#8217;s what I came up with.</a></p>
<p>It uses a metaclass to add a custom __setattr__, __getattr__, and __iter__ to the user&#8217;s &#8220;enum class&#8221;, and it looks like this:</p>
<pre class="brush: python; title: ; notranslate">
import enum

class Level(metaclass=enum.Enum):
  LOW=1
  MEDIUM=2
  HIGH=3
  
x = Level.LOW
Level.HIGH = 19 # Throws an AttributeError
etc...
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/343/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=343&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/02/04/an-enum-for-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
		<item>
		<title>linseed-0.2</title>
		<link>http://misspent.wordpress.com/2011/01/15/linseed-0-2/</link>
		<comments>http://misspent.wordpress.com/2011/01/15/linseed-0-2/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 14:49:41 +0000</pubDate>
		<dc:creator>abingham</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://misspent.wordpress.com/?p=341</guid>
		<description><![CDATA[When I started using wmii for my window manager, I wasn&#8217;t able to find a system-resources display tool that fit my needs. There&#8217;s probably one out there, but I figured it would be more fun to write one than look very hard, and thus the linseed project was born. It amounts to a collection of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=341&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>When I started using wmii for my window manager, I wasn&#8217;t able to find a system-resources display tool that fit my needs. There&#8217;s probably one out there, but I figured it would be more fun to write one than look very hard, and thus the <a title="linseed project page" href="http://code.google.com/p/linseed/">linseed</a> project was born. It amounts to a collection of modules which display various bits of system information: CPU utilization, used swap, and so forth. There is a top-level script that ties them together for convenience, though linseed is equally usable embedded inside another program.</p>
<p>I don&#8217;t know how or if linseed will continue to grow. I&#8217;m using it as a bit of a platform for learning things about distributing python, and especially using some of the new extension/plugin systems, so that may result in changes. Also, linseed is linux-only right now, so perhaps someone will decide that it needs to be extended for windows or something.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/misspent.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/misspent.wordpress.com/341/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=misspent.wordpress.com&#038;blog=7999256&#038;post=341&#038;subd=misspent&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://misspent.wordpress.com/2011/01/15/linseed-0-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0df634d79a731ee6eeee1b814726abb6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">abingham</media:title>
		</media:content>
	</item>
	</channel>
</rss>
