<?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/"
	>

<channel>
	<title>the blixtra blog &#187; programming</title>
	<atom:link href="http://blixtra.org/blog/category/tech/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blixtra.org/blog</link>
	<description>Whoopie! You&#039;ve reached Chris Kühl&#039;s blog</description>
	<lastBuildDate>Thu, 24 Nov 2011 09:21:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Maintenance Mode</title>
		<link>http://blixtra.org/blog/2011/02/23/maintenance-mode/</link>
		<comments>http://blixtra.org/blog/2011/02/23/maintenance-mode/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 09:00:01 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[clutter]]></category>
		<category><![CDATA[cluttermm]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[gnome-system-monitor]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=438</guid>
		<description><![CDATA[In the last few weeks I&#8217;ve adopted a couple projects that, for whatever reason, had not been actively maintained for a while. Cluttermm Cluttermm wraps the Clutter Toolkit, &#8220;a software library for creating fast, compelling, portable, and dynamic graphical user interfaces&#8221;. Clutter has become an integral part of the GNOME project through its use in [...]]]></description>
			<content:encoded><![CDATA[<p>In the last few weeks I&#8217;ve adopted a couple projects that, for whatever reason, had not been actively maintained for a while.</p>
<p><strong>Cluttermm</strong></p>
<p><a href="http://git.gnome.org/browse/cluttermm/">Cluttermm</a> wraps the <a href="http://www.clutter-project.org/">Clutter Toolkit</a>, &#8220;a software library for creating fast, compelling, portable, and dynamic graphical user interfaces&#8221;. Clutter has become an integral part of the <a href="http://www.gnome.org/">GNOME project</a> through its use in the <a href="http://en.wikipedia.org/wiki/GNOME_Shell">GNOME Shell</a> featured in <a href="http://www.gnome3.org/">GNOME 3</a>. As such, I think it&#8217;d be a shame to not have high-quality C++ bindings.</p>
<p>Cluttermm had not really had much activity since early last year. With the rate of Clutter development, Cluttermm feel behind quickly. I&#8217;m trying to catch up now and as <a href="http://www.murrayc.com/blog/permalink/2011/02/03/handing-over-cluttermm/">Murray mentioned</a>, I&#8217;ve been able to wrap more API and fix a few bugs. So far I&#8217;ve got the <a href="http://docs.clutter-project.org/docs/clutter/stable/ix08.html">1.2 API</a> almost fully wrapped. There are certainly bugs, some of which I&#8217;m finding now that I&#8217;m actually writing some examples. As I&#8217;m very much new to this wrapping business, I want to write a number of examples using the newly wrapped API. Once I&#8217;m comfortable that things are in good order, I&#8217;ll move onto the <a href="http://docs.clutter-project.org/docs/clutter/stable/ix09.html">1.4</a> and then <a href="http://docs.clutter-project.org/docs/clutter/stable/ix10.html">1.6</a> APIs.</p>
<p><strong>GNOME System Monitor</strong></p>
<p>GNOME System Monitor (g-s-m) is the default process viewer and system monitor in GNOME. I got involved by responding to the call to port g-s-m to Gtk3. Thanks goes to <a href="http://www.openismus.com/">Openismus</a> for allowing me to spend work time doing the porting (which I&#8217;ll blog about in the next couple days). During this process one always finds areas for improvement which spurred my interest in becoming the maintainer.</p>
<p>From what I can tell g-s-m hasn&#8217;t been actively developed in well over a year. You can imagine that <a href="https://bugzilla.gnome.org/browse.cgi?product=system-monitor">bugzilla</a> has a lot of <em><a href="https://bugzilla.gnome.org/buglist.cgi?product=system-monitor&#038;bug_status=UNCONFIRMED&#038;bug_status=NEW&#038;bug_status=ASSIGNED&#038;bug_status=REOPENED">suggestions</a></em> for future tasks. My first order of business will be dealing with neglected patches and responding to bug reports.</p>
<p>So it appears as if I&#8217;ve filled all my free time for the foreseeable future. We&#8217;ll see how much I can get done between changing diapers and playing with the kids. <img src='http://blixtra.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Oh, and lastly&#8230; patches welcome. <img src='http://blixtra.org/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2011/02/23/maintenance-mode/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>First experiences with the OpenSUSE Build Service (OBS).</title>
		<link>http://blixtra.org/blog/2011/01/21/first-experiences-with-the-opensuse-build-service-obs/</link>
		<comments>http://blixtra.org/blog/2011/01/21/first-experiences-with-the-opensuse-build-service-obs/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 14:29:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[openismus]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=422</guid>
		<description><![CDATA[As part of my Openismus training, I was recently tasked with packaging a Qt application using the OpenSUSE Build Service (OBS). Here I&#8217;ll try to note my first impressions as well as offer some solutions to problems I encountered. Note: This was my first attempt at packaging anything and the application I&#8217;m packaging (ConferenceGoer) is [...]]]></description>
			<content:encoded><![CDATA[<p>As part of my <a href="http://www.openismus.com/">Openismus</a> <a href="http://www.murrayc.com/blog/permalink/2010/03/09/what-our-trainees-learn/">training</a>, I was recently tasked with packaging a <a href="http://developer.qt.nokia.com/">Qt</a> application using the <a href="https://build.opensuse.org/">OpenSUSE Build Service</a> (OBS). Here I&#8217;ll try to note my first impressions as well as offer some solutions to problems I encountered.</p>
<p><em>Note: This was my first attempt at packaging anything and the application I&#8217;m packaging (<a href="http://gitorious.org/conferencegoer">ConferenceGoer</a>) is a personal project which is in an unusably-early state. So let&#8217;s ignore all that and focus on OBS itself.</em></p>
<p><strong>What is OBS</strong></p>
<p>The OBS allows a packager to create packages for multiple distributions and architectures using one spec file for <a href="http://en.wikipedia.org/wiki/RPM_Package_Manager">RPM packages</a> or one set of debian packaging files for <a href="http://en.wikipedia.org/wiki/Deb_(file_format)">debian packages</a>. For example, in <a href="https://build.opensuse.org/project/show?project=home:blixtra">my OpenSUSE OBS repository</a> I&#8217;ve built packages for multiple releases of <a href="http://fedoraproject.org/">Fedora</a>, <a href="http://www.ubuntu.com/">Ubuntu</a>, <a href="http://www.opensuse.org">OpenSUSE</a>, <a href="http://www.mageia.org">Mandriva</a> and <a href="http://www.debian.org/">Debian</a> for the i586 and x86_64 architectures from one set of package files.</p>
<p>Despite the &#8220;<em>OpenSUSE</em>&#8221; in the name, the OBS is useful for other distros as well. For example, the <a href="http://meego.com/">MeeGo project</a> has adopted it as its build-service of choice. I&#8217;ve used both and will refer to them as the <a href="https://build.opensuse.org/">OpenSUSE OBS</a> and <a href="https://build.pub.meego.com">MeeGo OBS</a>.</p>
<p>This is <em>not</em> an OBS how-to. See the <a href="http://en.opensuse.org/openSUSE:Build_Service_Tutorial">OBS tutorial</a> for getting started with OBS.</p>
<p><strong>Some notes</strong> (in no particular order)</p>
<p><em><strong>Generated moc_ files in tarball</strong></em></p>
<p>One of the problems I ran into while packaging ConferenceGoer was that the tarball that is generated from the Makefile (which is generated from <a href="http://en.wikipedia.org/wiki/Qmake">qmake</a>), includes <a href="http://doc.qt.nokia.com/latest/moc.html">moc_* files</a>. As anyone familiar with Qt knows, these are genereted files. The problem that this causes is that moc_* files generated with a newer version of Qt (4.7 in my case) will not always be compatible with older versions of Qt. As older distros do not package the newer version that you may be developing against, this will cause build problems. The easy fix for this is to remove the moc_* files from the tarball. qmake will regenerate these files for you anyway during the build process making them unnecessary.</p>
<p><em><strong>Interacting with the OBS</strong></em></p>
<p>There are 2 ways to interact with the OBS. The first way is using the <a href="https://build.opensuse.org/">web interface</a> and the other is using the command-line tool (<a href="http://www.gitorious.org/opensuse/osc">osc</a>). I found that a mix of these worked best. The web interface can be annoying and slow for certian tasks. Triggering a build and uploading new versions of your files takes far too long. You can use the command line tool much like you would any svn client. You make you local changes, commit them with a message, and repeat. The commit will trigger an automatic rebuild. This seems to happen much faster using osc than with the web-interface. In short, use osc when you can and use the web-interface for watching the packages build status.</p>
<p><em><strong>OpenSUSE OBS downtime</strong></em></p>
<p>Annoyingly, the OpenSUSE OBS site seems to be unreachable rather often. It&#8217;s also rather slow. The MeeGo OBS is fast and seems reliable though. I&#8217;m guessing this has to do with the <a href="https://build.opensuse.org/monitor">high load on the OpenSUSE OBS</a>. Still it&#8217;s annoying.</p>
<p><em><strong>Moving from the OpenSUSE OBS to the MeeGo OBS</strong></em></p>
<p>If you &#8216;ve managed to get everything working in the OpenSUSE OBS, moving to the MeeGo OBS should be simple. For ConferenceGoer I just needed to remove the ifdef&#8217;s for all OS&#8217;s other than the redhat-based distros. We then need to remove all Qt version info from the package names. For example, <em>qt4</em> becomes <em>qt</em> and <em>qmake-qt4</em> becomes just <em>qmake</em>. MeeGo only has Qt4 packages so this distinction is not needed.</p>
<p>Also to note is that getting access to the MeeGo OBS is a manual process. You&#8217;ve got to have a meego acount set up and <a href="http://wiki.meego.com/Build_Infrastructure/Packagers_Developers#How_to_get_started">request access on irc</a>.</p>
<p><em><strong>Font problem with Qt apps in MeeGo.</strong></em></p>
<p>Once the package was installed on MeeGo (on the nice netbook we were given at the Dublin conference), I found that the fonts looked terrible. This turned out to be a <a href="http://bugs.meego.com/show_bug.cgi?id=10258">known bug</a>. Seems you can tweak a config file to get it looking OK but hopefully this is now fixed.</p>
<p><em><strong>Conclusion</strong></em></p>
<p>Overall I think the OBS is a very nice tool.  It&#8217;s rather gratifying to be able to build for so many different distro/version combinations with such little effort. The command-line tool is intuitive and works well. I&#8217;d like to be able to access the OpenSUSE OBS instants on a more regular basis however.</p>
<p>I plan on building some new <a href="http://git.gnome.org/browse/cluttermm/">cluttermm</a> packages soon to encourage more people to start testing and using it as well as to practice packaging libraries. So keep an eye on <a href="http://download.opensuse.org/repositories/home:/blixtra/">my repository</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2011/01/21/first-experiences-with-the-opensuse-build-service-obs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Thoughts coming out of the GNOME Developer Documentation and Tools Hackfest</title>
		<link>http://blixtra.org/blog/2010/12/19/thoughts-coming-out-of-the-gnome-developer-documentation-and-tools-hackfest/</link>
		<comments>http://blixtra.org/blog/2010/12/19/thoughts-coming-out-of-the-gnome-developer-documentation-and-tools-hackfest/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 16:13:57 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[gnome]]></category>
		<category><![CDATA[openismus]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=409</guid>
		<description><![CDATA[I&#8217;m a bit late in the game regarding blogging about the GNOME Developer Documentation and Tools Hackfest that we hosted at the Openismus Berlin office a couple weeks ago. There have been a number of good posts made summarizing what we talked about and worked on. In this post, rather than providing another summary, I&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a bit late in the game regarding blogging about the <a href="http://live.gnome.org/Hackfests/DevDocTools">GNOME Developer Documentation and Tools Hackfest</a> that we hosted at the <a href="http://www.openismus.com/">Openismus</a> Berlin office a couple weeks ago. There have been a <a href="http://psconboard.blogspot.com/2010/12/gnome-development-documentation-and.html">number</a> <a href="http://www.0d.be/2010/12/07/dev-doc-tools-hackfest-2/">of</a> <a href="http://blogs.gnome.org/shaunm/2010/12/09/developer-documentation-hackfest/">good</a> <a href="http://blogs.gnome.org/johannes/2010/12/06/development-documentation-and-tools-hackfest-wrap-up/">posts</a> <a href="http://philbull.livejournal.com/57007.html">made</a> <a href="http://blogs.gnome.org/aklapper/2010/12/16/evolution-user-documentation-in-mallard/">summarizing</a> what we talked about and worked on. In this post, rather than providing another summary, I&#8217;d like to share my thoughts about how we can get the most out of the demos (examples, tutorials&#8230; whatever) we started during the hackfest. Some of what I&#8217;m going to talk about was discussed at the hackfest, but much was not. Also, be warned that this will have quite a few references to Qt documentation practices.</p>
<p><strong>A Tutorial for Tutorials?</strong><br />
So here we are, we&#8217;ve got some nice, simple code examples, some even with tutorial-style documentation. But if you look through the examples you&#8217;ll find that the documentation style varies dramatically. Before we go and write too many of these tutorials maybe we need to standardize how we write these. Some issues that arise when writing the tutorials are:</p>
<ul>
<li>how do we structure the tutorial? <a href="http://library.gnome.org/devel/demos/nightly/magic-mirror.vala.html.en">Daniel&#8217;s Magic Mirror example</a> incrementally builds up the program while others, including mine, explain the finished program.
</li>
<li>how does one reference the code? Do we use line numbers, show full functions/classes? Do we include unexplained code in the code snippets?
</li>
<li>how do you show a full listing? Do we append a full code listing at the bottom of the tutorial or provide links to files?
</li>
<li>how much should we comment the code? If the code is going to be explained, do we need to repeat the same thing in the code comments?
</li>
<li>and so on&#8230;
</li>
</ul>
<p><em>Some of these have answers. For example, we decided that we should build up the programs incrementally and that referencing line numbers is probably going to be more trouble than it&#8217;s worth.</em></p>
<p>When I was writing my <a href="http://library.gnome.org/devel/demos/nightly/photo-wall.c.html.en">photo-wall tutorial</a> I knew that I was writing it not in isolation but as a larger collection. Thus, I wanted my tutorial to fit in with the other tutorials in the collection. As there was no guide to go by, I poked around the repository to see how others were doing it. I found one I liked and went with it.</p>
<p>The point is that because there is no canonical tutorial or document to go by, we are adding a possible barrier to those wishing to create such tutorials. During the hackfest it was mentioned that <em><strong>we can not motivate people to contribute, we can only demotivate them</strong></em>. Let&#8217;s not do that. <img src='http://blixtra.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>For completeness these are my opinions about the above-listed issues.</p>
<ul>
<li>structuring the tutorial: Incremental build up is nice for GNOME beginners and that seems to be the target group so let&#8217;s go with that.
</li>
<li>referencing the code: No line number referencing. Break the code up into small logical blocks and describe. Blocks need to be small so that one can read the description and see the code without having to scroll up and down repeatedly.
</li>
<li>showing a full listing: Do like the Qt examples do; list all files at the beginning of the tutorial. This gives quick access to folks who don&#8217;t need the description.
</li>
<li>commenting the code: Heavily comment the code so that is descriptive outside the context of the tutorial and probably remove the comments when placing segments in the tutorial in order to save space.
</li>
</ul>
<p><strong>Dealing with undocumented code examples</strong></p>
<p><em>Right now I don&#8217;t know that we have a plan for dealing with this so here are my thoughts.</em></p>
<p>In a perfect world we are going to have a tutorial written for each example in each of the core programming languages. As perfection is rather boring, lets think about the alternatives. </p>
<p>I think in this case we should simply look at the <a href="http://doc.qt.nokia.com/stable/examples-network.html">Qt examples</a>. They either have a tutorial-like description or they don&#8217;t. The one&#8217;s that do have an asterisks, those without don&#8217;t.</p>
<p>Regardless of whether the coder is willing or able to write an accompanying tutorial, we should promote getting as many code examples in as many core languages. In fact some example may be too large to expect a tutorial. Take a look at the <a href="http://doc.qt.nokia.com/stable/network-torrent.html">Qt Network torrent example</a> for one instance of this being the case. Looking at that example you&#8217;ll see that even though there is no tutorial, a file listing and description is available. If we were to standardize on having a file listing and functional description of the example at the top of each tutorial we could just copy the description and list the files for each newly added example port. Of course, hopefully someone would eventually get around to writing a tutorial as well.</p>
<p><strong>Relating reference documentation with examples</strong></p>
<p>One of the nice things about the Qt reference documentation is that it often references examples in the <em>See also</em> section. With one click your sent to an example that&#8217;s probably more complete than the small snippets you usually find in the API reference. Looking at the <a href="http://doc.qt.nokia.com/stable/qtcpsocket.html">QTcpSocket</a> class you&#8217;ll find 6 referenced examples. Some have documentation while some are just commented code. Maybe <a href="http://blogs.gnome.org/shaunm/">Shaun</a> has something up his sleeve for something like this using Mallard.</p>
<p><strong>Closing words</strong><br />
Basically, I would like to see a consistent, wide-ranging, integrated and ever growing set of examples and tutorials to help developers get started with developing with GNOME technologies. I think the Hackfest was a great start to getting us there. The <a href="http://live.gnome.org/DocumentationProject">documentation team</a> has done a great job laying the foundations and providing infrastructure for getting us where we want to be with GNOME 3 regarding developer docs. We just need to finish ironing out a few things before we are quite there.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2010/12/19/thoughts-coming-out-of-the-gnome-developer-documentation-and-tools-hackfest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Merkmal, a concentration game for GNOME.</title>
		<link>http://blixtra.org/blog/2010/11/03/introducing-merkmal-a-concentration-game-for-gnome/</link>
		<comments>http://blixtra.org/blog/2010/11/03/introducing-merkmal-a-concentration-game-for-gnome/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 14:16:52 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[clutter]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[openismus]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=325</guid>
		<description><![CDATA[For the last few week I&#8217;ve been working on a version of GMemory written using the gtkmm and cluttermm bindings. The project is called Merkmal. Currently the functionality is on par with that of GMemory. It requires at least cluttermm 1.1.2, clutter-gtkmm 0.9.6. Here is a video of Merkmal in action. As you should see, [...]]]></description>
			<content:encoded><![CDATA[<p>For the last few week I&#8217;ve been working on a version of <a href="http://blixtra.org/blog/2010/07/27/introducing-gmemory-v0-1/">GMemory</a> written using the <a href="http://www.gtkmm.org/">gtkmm</a> and cluttermm bindings. The project is called <a href="http://gitorious.org/merkmal">Merkmal</a>.  </p>
<div id="attachment_326" class="wp-caption aligncenter" style="width: 410px"><a href="http://blixtra.org/blog/wp-content/uploads/2010/11/Merkmal-0.1.0-screenshot.png"><img src="http://blixtra.org/blog/wp-content/uploads/2010/11/Merkmal-0.1.0-screenshot.png" alt="" title="Merkmal-0.1.0-screenshot" width="400" height="500" class="size-full wp-image-326" /></a><p class="wp-caption-text">Merkmal 0.1.0 screenshot</p></div>
<p>Currently the functionality is on par with that of GMemory. It requires at least <a href="http://ftp.gnome.org/pub/GNOME/sources/cluttermm/1.1/">cluttermm 1.1.2</a>, <a href="http://ftp.gnome.org/pub/GNOME/sources/clutter-gtkmm/0.9/">clutter-gtkmm 0.9.6</a>.</p>
<p>Here is a video of Merkmal in action. As you should see, basic game play is working but there are tons of things to be added to make the game more interesting. I listed some of those in the <a href="http://blixtra.org/blog/2010/07/27/introducing-gmemory-v0-1/">GMemory post</a>.</p>
<p><iframe src="http://player.vimeo.com/video/16463917" width="400" height="300" frameborder="0"></iframe>
<p><a href="http://vimeo.com/16463917">Merkmal 0.1.0 screencast</a> from <a href="http://vimeo.com/user924768">Chris Kuehl</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>Cluttermm</strong></p>
<p>Now that I&#8217;ve ported the game to C++, adding these features should be much easier. However, there are some issues that I&#8217;ve been running into. I seem to be among the first (if not the only) consumer of cluttermm at the moment. This has of course meant that I&#8217;ve been running into bugs here and there. I&#8217;ve fixed the ones I&#8217;ve run into. I&#8217;ve also started filing bugs for missing api. For example, the new layout classes and animation framework have yet to be wrapped. I&#8217;ve filed some <a href="https://bugzilla.gnome.org/show_bug.cgi?id=633787">b</a><a href="https://bugzilla.gnome.org/show_bug.cgi?id=633789">u</a><a href="https://bugzilla.gnome.org/show_bug.cgi?id=633790">g</a><a href="https://bugzilla.gnome.org/show_bug.cgi?id=633791">s</a> for the ones that I&#8217;d most like to use.</p>
<p><strong>GNOME Bindings</strong></p>
<p>Having written the same application in both <a href="http://www.gtk.org/">gtk+</a> and <a href="http://www.gtkmm.org/">gtkmm</a>, I don&#8217;t see why one would not use one of the bindings to write user apps. One of the beauties of GNOME is that there are so many high-quality bindings available. Bindings are a top priority for the project and it shows. With the <a href="http://live.gnome.org/GObjectIntrospection">introspection</a> work that is going on, the situation will only get better.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2010/11/03/introducing-merkmal-a-concentration-game-for-gnome/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debugging reference counting in GNOME C++ bindings with GDB</title>
		<link>http://blixtra.org/blog/2010/09/20/debugging-reference-counting-in-gnome-cp-bindings-with-gdb/</link>
		<comments>http://blixtra.org/blog/2010/09/20/debugging-reference-counting-in-gnome-cp-bindings-with-gdb/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 10:27:51 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[debugging]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=302</guid>
		<description><![CDATA[Overview For the last couple days I&#8217;ve been tracking down some reference counting problems in cluttermm. In the course of this I&#8217;ve been working on figuring out how GDB can help me do this. Here is what I&#8217;ve come up with. If you have improvements please let me know. Watching the reference count variable The [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Overview</strong></p>
<p>For the last couple days I&#8217;ve been tracking down some reference counting problems in cluttermm. In the course of this I&#8217;ve been working on figuring out how <a href="http://www.gnu.org/software/gdb/">GDB</a> can help me do this. Here is what I&#8217;ve come up with. If you have improvements please let me know.</p>
<p><strong>Watching the reference count variable</strong></p>
<p>The first small obstacle is that pretty much all objects are wrapped in a RefPtr, <a href="http://www.gtkmm.org/en/">glibmm</a>&#8216;s reference-counting shared smartpointers. This is a good thing and gdb makes accessing the underlying C++ object pretty painless. The following command demonstrates this.</p>
<p><code>p alpha.pCppObject_<br />
</code></p>
<p>For this example I&#8217;m using the <em>alpha</em> variable of type Glib::RefPtr&lt;Clutter::Alpha&gt;. In this command we used the fact that gdb gives you access to any member of a class, whether public or private. You should have gotten output similar to the following.</p>
<p><code>$1 = (Clutter::Alpha *) 0x9cfe40</code></p>
<p>Now the interesting part. We want to detect any changes in the <em>ref_count</em> variable. To do this we need to watch the <em>ref_count</em> field. The following command does this.</p>
<p><code>watch alpha.pCppObject_->gobject_->ref_count </code></p>
<p>To make this a bit more convenient, I&#8217;ve used the gdb define command to create a shortcut. Here is an example session.</p>
<p><code>(gdb) define watchRefCnt<br />
Type commands for definition of "watchRefCnt".<br />
End with a line saying just "end".<br />
>watch ($arg0).pCppObject_->gobject_->ref_count<br />
>end</code></p>
<p>Now you just need to use the shortcut like this.</p>
<p><code>watchRefCnt alpha</code></p>
<p>Which should give you a confirmation similar to the following.</p>
<p><code>Hardware watchpoint 2: (alpha).pCppObject_->gobject_->ref_count</code></p>
<p>The obvious thing to do next is to place this command in a .gdbinit file so that it can be pulled in automatically.</p>
<p><strong>Breaking on last unreference</strong></p>
<p>One of things I was most interested in catching was when the <em>g_object_unref</em> function was called with the condition that the <em>_object</em> pointer was equal to a certian pointer and the <em>ref_count</em> variable == 1. This would indicate that the object is ready to be disposed. To do this we first need to get the address of the underlying GObject like this.</p>
<p><code>(gdb) p alpha.pCppObject_->gobject_<br />
$3 = (GObject *) 0x9c91e0</code></p>
<p>You now have a convenience variable, <em>$3</em>, which you can use in the conditions. You then need to set a breakpoint on <em>g_object_unref</em> and set the conditions like this.</p>
<p><code>b g_object_unref<br />
cond 4 _object==$3&#038;&#038;((GObject*)$3)->ref_count==1</code></p>
<p>This, of course, would also be nice as a custom command. I&#8217;ll leave that as an exercise for the reader. <img src='http://blixtra.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Future explorations</strong></p>
<p>I forsee future blog entries along these lines so stay tuned. There are quite a few things that interest me in gdb right now.</p>
<p>The <a href="http://sourceware.org/gdb/wiki/ProjectArcher">Archer project</a> is quickly improving C++ support in gdb. I&#8217;ve been using gdb 7.2 for my debugging as I wanted to have a stable debugging platform with all the new C++ enhancements. They have a git repository for those who want the bleeding edge.</p>
<p><a href="http://sourceware.org/gdb/wiki/PythonGdb">Python scripting</a> has been available in gdb since 7.0. I plan on looking into this as a way of streamlining debugging tasks and honing my Python skills which are pretty rusty.</p>
<p>Please let me know if you see any areas for improvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2010/09/20/debugging-reference-counting-in-gnome-cp-bindings-with-gdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing GMemory v0.1</title>
		<link>http://blixtra.org/blog/2010/07/27/introducing-gmemory-v0-1/</link>
		<comments>http://blixtra.org/blog/2010/07/27/introducing-gmemory-v0-1/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 14:21:59 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[clutter]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[openismus]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=254</guid>
		<description><![CDATA[For the last few weeks I&#8217;ve been working on a small concentration game called GMemory. This was done as a part of the Openismus trainee program. Update: See below. For those not familiar with the game Concentration, or Memory as I grew up knowing it, the basic idea is that one has a number of [...]]]></description>
			<content:encoded><![CDATA[<p>For the last few weeks I&#8217;ve been working on a small <a href="http://en.wikipedia.org/wiki/Concentration_%28game%29">concentration game</a> called <a href="http://gitorious.org/gmemory">GMemory</a>. This was done as a part of the <a href="http://www.openismus.com/">Openismus</a> <a href="http://www.murrayc.com/blog/permalink/2010/03/09/what-our-trainees-learn/">trainee program</a>.</p>
<p><strong>Update</strong>: See below.</p>
<p><a href="http://blixtra.org/blog/wp-content/uploads/2010/07/GMemory_screenshot.png"><img src="http://blixtra.org/blog/wp-content/uploads/2010/07/GMemory_screenshot.png" alt="" title="GMemory_screenshot" width="488" height="614" class="aligncenter size-full wp-image-260" /></a></p>
<p>For those not familiar with the game Concentration, or Memory as I grew up knowing it, the basic idea is that one has a number of matching card pairs turned face down. The player(s) then attempt(s) to match these pairs by turning over two cards. If the cards match those two cards remain face up. Otherwise, the cards are returned to the face down position. This is repeated until all cards are face up. Here&#8217;s a <a href="http://www.youtube.com/user/blixtra2#p/a/u/0/RRwluRDgfZg">screencast of GMemory</a> being played.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/RRwluRDgfZg&amp;hl=en_US&amp;fs=1?hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/RRwluRDgfZg&amp;hl=en_US&amp;fs=1?hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>As you can hopefully see, GMemory is currently in a playable state and it actual quite enjoyable if you&#8217;re into these types of games. However, there is a lot more to do to reach what I&#8217;d consider a 1.0 release. Besides some code reworking and some known bugs, I&#8217;d like to see a score tracker, multi-player mode, card animation and selectable themes.</p>
<p>The game is written in C using <a href="http://www.gtk.org/">GTK+</a>, <a href="http://en.wikipedia.org/wiki/GObject">GObject</a>, <a href="http://www.clutter-project.org/">Clutter</a> and <a href="http://cairographics.org/">Cairo</a>. In the course of writing GMemory I ran into a few bugs in clutter-gtk. The first bug was that no events were being received when using the embedded clutter gtk widget. You can find the bug report <a href="https://bugzilla.redhat.com/show_bug.cgi?id=611833">here</a>. The second major bug I ran into was that once I got a version combination that gave me events, I always received double the events that I expected. This is a known bug and I&#8217;ve got a work around in the code for that.</p>
<p>There are also a number of known bugs. As you may have noticed from the screencast, the last card of the last successful match does not get shown before the statistics dialog box pops up. It seems the dialog blocks the drawing even thought the function to draw the card is called before the call to show the dialog box. Another bug is that once the game is over the playing area does not resize when the window is resized. I&#8217;ll tackle this once I&#8217;ve reworked the code some.</p>
<p>You can find <a href="http://gitorious.org/gmemory/gmemory">GMemory&#8217;s git repository</a> at <a href="http://gitorious.org">Gitorious</a> and the <a href="http://blixtra.org/public/gmemory/gmemory-0.1.tar.gz">tarball</a> can be had here.</p>
<p>Unfortunately, right now I&#8217;m building against the master branches of clutter and clutter-gtk. Expect breakage.</p>
<p>Btw, <a title="GUADEC 2010" rel="external" href="http://guadec.org/"> <img src="http://guadec.org/img/guadec-oranje.png" alt="I'm attending GUADEC" /> right now.</a></p>
<p><strong>Update</strong>: After trying this on Ubuntu Lucid, I experienced none of the event-related problems with clutter-gtk. This seems to be Fedora 13 specific. Thus, I&#8217;ve removed the workaround for the double event issue and changed the configure.ac file to rely on the clutter and clutter-gtk versions shipped with Ubuntu Lucid. The new tarball is <a href="http://blixtra.org/public/gmemory/gmemory-0.1.1.tar.gz">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2010/07/27/introducing-gmemory-v0-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Senior Design Project</title>
		<link>http://blixtra.org/blog/2010/04/14/senior-design-project/</link>
		<comments>http://blixtra.org/blog/2010/04/14/senior-design-project/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 06:18:03 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[avr]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[school]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/?p=209</guid>
		<description><![CDATA[In order to graduate from the Engineering program at San Diego State University, each student needs to complete a senior design project with a team of between 6 to 10 students. The group that I&#8217;m apart of is working on building a system to localize nodes in a wireless sensor network (WSN). We do this [...]]]></description>
			<content:encoded><![CDATA[<p>In order to graduate from the Engineering program at San Diego State University, each student needs to complete a senior design project with a team of between 6 to 10 students. The group that I&#8217;m apart of is working on building a system to localize nodes in a wireless sensor network (WSN). We do this by using signal strength and, when nodes are in line of sight of each other, ultrasonic transducers to measure the time difference of the received ultrasonic signal and the radio signal. This is a problem that has been tackled many times and I&#8217;m pretty sure we won&#8217;t be able to come up with anything novel in the short time we have, but the task of building the working system is what is important.</p>
<div id="attachment_211" class="wp-caption aligncenter" style="width: 310px"><a href="http://blixtra.org/blog/wp-content/uploads/2010/04/PinPointProtoBoard.jpg"><img src="http://blixtra.org/blog/wp-content/uploads/2010/04/PinPointProtoBoard-300x225.jpg" alt="Partially populated node rototype board" title="Prototype board" width="300" height="225" class="size-medium wp-image-211" /></a><p class="wp-caption-text">Partially populated prototype board</p></div>
<p>I&#8217;m in charge of building the GUI and integrating the software side of the system. For the GUI I&#8217;m using Qt. I&#8217;ve used this before and found it pleasant enough although I still run into issues that cause me to waste more time than I&#8217;d like. The most important thing for me was that Qt is cross-platform and has great documentation. Having some high-profile applications such as Google Earth and Skype using it makes it easier to &#8220;sell&#8221; to the other team members as well.</p>
<p>For the WSN we chose Atmel Zigbit modules. These have a ZigBee wireless chip and an ATMEGA128 microcontroller embedded within. This module was chosen because much of the difficult circuitry was taken care of, previous good experiences with AVRs, and the low-cost of the hardware and development tools. Thus far we&#8217;ve created custom PCB&#8217;s to hold the Zigbit modules, a pair of ultrasonic transducers, and the accompanying circuitry. We are currently testing those so that we can get about 20 boards professionally made.</p>
<p>We&#8217;ve got less than a month to finish up and are working feverishly to get everything brought together and integrated. With luck we&#8217;ll have a working system in a couple of weeks.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2010/04/14/senior-design-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting background color of SWT buttons in Windows not supported</title>
		<link>http://blixtra.org/blog/2009/04/14/setting-background-color-of-swt-buttons-in-windows-not-supported/</link>
		<comments>http://blixtra.org/blog/2009/04/14/setting-background-color-of-swt-buttons-in-windows-not-supported/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 00:14:25 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/2009/04/14/setting-background-color-of-swt-buttons-in-windows-not-supported/</guid>
		<description><![CDATA[Just wasted a while to figure this out only to find out that it&#8217;s not supported because it&#8217;s not supported in the Windows native widget.]]></description>
			<content:encoded><![CDATA[<p>Just wasted a while to figure this out only to find out that it&#8217;s not supported because it&#8217;s not supported in the Windows native widget.</p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2009/04/14/setting-background-color-of-swt-buttons-in-windows-not-supported/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top 30 Django Tutorials and Articles</title>
		<link>http://blixtra.org/blog/2006/07/17/top-30-django-tutorials-and-articles/</link>
		<comments>http://blixtra.org/blog/2006/07/17/top-30-django-tutorials-and-articles/#comments</comments>
		<pubDate>Mon, 17 Jul 2006 11:19:01 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/2006/07/17/top-30-django-tutorials-and-articles/</guid>
		<description><![CDATA[As a response to the Top 30 Ruby on Rails Tutorials, I&#8217;ve compiled a list of the top 30 Django tutorials and articles. These links are in addition to the great documentation on the Django project site. For those who don&#8217;t know, Django is a Python web development framework that makes development super fast. The [...]]]></description>
			<content:encoded><![CDATA[<p>As a response to the <a href="http://www.econsultant.com/web-developer/ruby-rails-tutorials/">Top 30 Ruby on Rails Tutorials</a>, I&#8217;ve compiled a list of the top 30 <a href="http://www.djangoproject.com/">Django</a> tutorials and articles. These links are in addition to the <a href="http://www.djangoproject.com/documentation/">great documentation</a> on the Django project site.</p>
<p>For those who don&#8217;t know, <a href="http://www.djangoproject.com/">Django</a> is a <a href="http://www.python.org/">Python</a> web development framework that makes development super fast.</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6177640580512042";
google_ad_width = 468;
google_ad_height = 15;
google_ad_format = "468x15_0ads_al";
google_ad_channel ="";
google_color_border = "272727";
google_color_bg = "F5ECE3";
google_color_link = "447E44";
google_color_url = "FF3333";
google_color_text = "272727";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>The list in no particular order&#8230;</p>
<ol>
<li><a href="http://www.wilsonminer.com/posts/2006/may/10/are-you-generic/">Are you generic?</a></li>
<li><a href="http://www.rossp.org/blog/2006/jul/11/sending-e-mails-templates/">Sending E-Mails via Templates</a></li>
<li><a href="http://www2.jeffcroft.com/2006/jul/14/django-admin-your-php-app/">Django admin for your PHP app?</a></li>
<li><a href="http://www.b-list.org/weblog/2006/07/16/django-tips-hacking-freecomment">Hacking FreeComment</a></li>
<li><a href="http://www.b-list.org/weblog/2006/06/28/django-tips-difference-between-blank-and-null">the difference between ‘blank’ and ‘null’</a></li>
<li><a href="http://www.rossp.org/blog/2006/jun/23/building-blog-django-4/">Using Django&#8217;s TemplateTags</a></li>
<li><a href="http://lukeplant.me.uk/blog.php?id=1107301641">A Django website that took (a lot) more than 20 minutes</a></li>
<li><a href="http://www.pointy-stick.com/blog/2006/07/03/django-tips-forms-multiple-inline-objects/">Forms With Multiple Inline Objects</a></li>
<li><a href="http://www.pointy-stick.com/blog/2006/06/29/django-tips-extending-generic-views/">Extending Generic Views</a></li>
<li><a href="http://www.b-list.org/weblog/2006/06/14/django-tips-template-context-processors">Template context processors</a></li>
<li><a href="http://www.pointy-stick.com/blog/2006/06/14/custom-sql-django/">Custom SQL In Django</a></li>
<li><a href="http://www.b-list.org/weblog/2006/06/13/how-django-processes-request">How Django processes a request</a></li>
<li><a href="http://www.b-list.org/weblog/2006/06/07/django-tips-write-better-template-tags">Write better template tags</a></li>
<li><a href="http://www.b-list.org/weblog/2006/06/06/django-tips-extending-user-model">Extending the User model</a></li>
<li><a href="http://feh.holsman.net/articles/2006/06/03/django-contenttype">Django&#8217;s Undocumented contenttype app</a></li>
<li><a href="http://www.b-list.org/weblog/2006/05/21/django-gzip-and-wsgi">Django, gzip and WSGI</a></li>
<li><a href="http://www2.jeffcroft.com/2006/may/02/django-non-programmers/">Django for non-programmers</a></li>
<li><a href="http://www2.jeffcroft.com/2006/feb/25/django-templates-the-power-of-inheritance/">Django Templates: The Power of Inheritance</a></li>
<li><a href="http://www2.jeffcroft.com/2006/feb/21/django-templates-an-introduction/">Django Templates: An Introduction</a></li>
<li><a href="http://www2.jeffcroft.com/2006/may/11/django-dreamhost/">Setting up Django on Dreamhost</a></li>
<li><a href="http://thinkhole.org/wp/2006/04/03/django-on-windows-howto/">Django on Windows HOWTO</a></li>
<li><a href="http://lukeplant.me.uk/blog.php?id=1107301634">Django Admin Hack &#8211; Fields varying with user permissions</a></li>
<li><a href="http://www.carcosa.net/jason/blog/computing/django/gotchas-2006-04-19">Some django gotchas</a></li>
<li><a href="http://rfc1437.de/page/django-templates-are-not-limited/">Django Templates are not limited</a></li>
<li><a href="http://www-128.ibm.com/developerworks/linux/library/l-django/index.html">Develop for the Web with Django and Python</a></li>
<li><a href="http://code.djangoproject.com/wiki/AJAXWidgetComboBox">An AJAX ComboBox Widget for Django</a></li>
<li><a href="http://code.djangoproject.com/wiki/UsingFreeComment">Using Django&#8217;s Free Comments</a></li>
<li><a href="http://grindhaug.org/?p=157">MochiKit and Django</a></li>
<li><a href="http://www.oreillynet.com/onlamp/blog/2006/06/django_rss_made_stupidly_simpl.html">RSS made stupidly simple</a></li>
<li><a href="http://toolmantim.com/article/2006/5/31/installing_django_on_osx">Installing Django on OSX</a></li>
</ol>
<p><em>Note: keep an eye out at Django&#8217;s <a href="http://www.djangoproject.com/community/">community page</a> for new tutorials and articles.</em></p>
<p><strong>Related Links</strong></p>
<ul>
<li><a href="http://www.djangoproject.com/documentation/">Official Documentation</a></li>
<li><a href="http://video.google.com/videoplay?docid=-70449010942275062">Web Development for Perfectionists with Deadlines (VIDEO)</a></li>
<li><a href="http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts">Django-friendly web hosts</a></li>
<li><a href="http://code.djangoproject.com/wiki/DjangoPoweredSites">Sites using Django</a></li>
</ul>
<p>If you have an additional tutorial, put it in the comments.</p>
<p><a href="http://digg.com/programming/Top_30_Django_Tutorials_and_Articles">digg story</a></p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6177640580512042";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text";
google_ad_channel ="";
google_color_border = "272727";
google_color_bg = "F5ECE3";
google_color_link = "272727";
google_color_url = "FF3333";
google_color_text = "437D42";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2006/07/17/top-30-django-tutorials-and-articles/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>In search of the perfect vimrc</title>
		<link>http://blixtra.org/blog/2006/06/22/in-search-of-the-perfect-vimrc/</link>
		<comments>http://blixtra.org/blog/2006/06/22/in-search-of-the-perfect-vimrc/#comments</comments>
		<pubDate>Thu, 22 Jun 2006 09:05:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blixtra.org/blog/2006/06/22/in-search-of-the-perfect-vimrc/</guid>
		<description><![CDATA[I&#8217;ve been using Vim for the last couple years on and off. Over the last few months (since the Vim 7 release) I&#8217;ve been forcing myself to use it exclusively. To make working with Vim more intuitive for me, I&#8217;ve been trying to get my vimrc just right. Of course, this will probably be a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://www.vim.org/">Vim</a> for the last couple years on and off. Over the last few months (since the <a href="ftp://ftp.vim.org/pub/vim/unix/vim-7.0.tar.bz2">Vim 7</a> release) I&#8217;ve been forcing myself to use it exclusively. To make working with Vim more intuitive for me, I&#8217;ve been trying to get my <a href="http://vimdoc.sourceforge.net/htmldoc/starting.html#.vimrc">vimrc</a> just right. Of course, this will probably be a never ending quest.</p>
<p>Currently it looks like this&#8230;</p>
<p><code><br />
" set appearance<br />
syn on<br />
colorscheme torte<br />
set vb " visual beep instead of audible beep<br />
set nu</p>
<p>" tab behavior<br />
set ai<br />
set tabstop=4<br />
set sts=4<br />
set et<br />
set shiftwidth=4</p>
<p>" backspace behavior<br />
set backspace=2<br />
set backspace=indent,eol,start " redundent?</p>
<p>" backup behavior<br />
set backup<br />
set backupdir=~/.vim/backup/</p>
<p>" search behavior<br />
set incsearch<br />
</code></p>
<p>I&#8217;ve been googling and adding, googling and adding. I&#8217;ve tried to avoid the complicated stuff so far. The <a href="http://vimdoc.sourceforge.net/">vim documentation</a> is great but a little overwhelming at first. <a href="http://jmcpherson.org/">Jonathan McPherson</a> has a <a href="http://jmcpherson.org/editing.html">nice</a> <a href="http://jmcpherson.org/windows.html">series</a> of <a href="http://jmcpherson.org/vimrc.html">articles</a> that gives a really <a href="http://jmcpherson.org/howto.html">friendly intro to Vim</a>.</p>
<p>I&#8217;m mostly doing python programming so if you have any tips please leave a comment.</p>
<p><!--adsense--></p>
]]></content:encoded>
			<wfw:commentRss>http://blixtra.org/blog/2006/06/22/in-search-of-the-perfect-vimrc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

