<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>gene's nerdery</title>
	
	<link>http://blog.eugeneoden.com</link>
	<description>random ramblings about nerdy things</description>
	<lastBuildDate>Tue, 17 Feb 2009 16:27:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/GenesNerdery" /><feedburner:info uri="genesnerdery" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>start and resize mac terminal windows</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/L5AWZtMSwRs/</link>
		<comments>http://blog.eugeneoden.com/2009/02/17/start-and-resize-mac-terminal-windows/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 16:27:45 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[mac]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[reposition]]></category>
		<category><![CDATA[resize]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=51</guid>
		<description><![CDATA[i work mostly on the command line and generally like to use two terminal windows splitting the screen as large as i can get them.
it can be somewhat tedious resizing and repositioning the windows all of the time so i figured out how to do it in applescript:
tell application "Terminal"
   do script ""

 [...]]]></description>
			<content:encoded><![CDATA[<p>i work mostly on the command line and generally like to use two terminal windows splitting the screen as large as i can get them.</p>
<p>it can be somewhat tedious resizing and repositioning the windows all of the time so i figured out how to do it in applescript:</p>
<pre>tell application "Terminal"
   do script ""

   tell front window
      set position to {1441, 0}
      set number of columns to 135
      set number of rows to 76
   end tell

   do script ""

   tell front window
      set position to {2277, 0}
      set number of columns to 135
      set number of rows to 76
   end tell
end tell</pre>
<p>each of the <em>do script &#8220;&#8221;</em> lines above tell the terminal application to run an empty script, causing it to open an empty window.  this new window becomes the <em>front window</em> which you can tell to resize and reposition itself.</p>
<p>i use a macbook pro with an external lcd positioned to the right.  the width of the macbook&#8217;s lcd in pixels is 1440 and the external lcd&#8217;s display begins at pixel 1441.  the script above opens one window in the upper left corner of the external lcd and another in the middle of the external lcd.</p>
<p>copy the script above into ScriptEditor and save it somewhere as a script.</p>
<p>you&#8217;ll probably need to iterate through a few cycles of running and tweaking the script to get the window placement as you&#8217;d like it.</p>
<p>you can open more windows by adding more sets of do script/tell front window lines.</p>
<p>when you are satisfied with your changes then save the script and then save it again as an application.  i called mine &#8220;twoBig&#8221;.</p>
<p>you can find it from spotlight by typing in the name of the application.  you might need to wait a few seconds the first time.</p>
<p>be sure to select the application version of the script and not the script version.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/8CrQL4z6-fns5clUeKLW9YruAUM/0/da"><img src="http://feedads.g.doubleclick.net/~a/8CrQL4z6-fns5clUeKLW9YruAUM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8CrQL4z6-fns5clUeKLW9YruAUM/1/da"><img src="http://feedads.g.doubleclick.net/~a/8CrQL4z6-fns5clUeKLW9YruAUM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/L5AWZtMSwRs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2009/02/17/start-and-resize-mac-terminal-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2009/02/17/start-and-resize-mac-terminal-windows/</feedburner:origLink></item>
		<item>
		<title>great guide for building a livecd from an existing linux distribution</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/gGviTkPjGc8/</link>
		<comments>http://blog.eugeneoden.com/2009/01/05/great-guide-for-building-a-livecd-from-an-existing-linux-distribution/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 04:13:09 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[system administration]]></category>
		<category><![CDATA[debootstrap]]></category>
		<category><![CDATA[linux livecd]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=49</guid>
		<description><![CDATA[it was relatively easy to build a livecd from a custom ubuntu distribution built using debootstrap following these directions:
http://www.remastersys.klikit-linux.com/capink.html
]]></description>
			<content:encoded><![CDATA[<p>it was relatively easy to build a livecd from a custom ubuntu distribution built using debootstrap following these directions:</p>
<p><a title="http://www.remastersys.klikit-linux.com/capink.html" href="http://www.remastersys.klikit-linux.com/capink.html" target="_blank">http://www.remastersys.klikit-linux.com/capink.html</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/3v0maayQcfym76nT_fUjKTHlhTQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/3v0maayQcfym76nT_fUjKTHlhTQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3v0maayQcfym76nT_fUjKTHlhTQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/3v0maayQcfym76nT_fUjKTHlhTQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/gGviTkPjGc8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2009/01/05/great-guide-for-building-a-livecd-from-an-existing-linux-distribution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2009/01/05/great-guide-for-building-a-livecd-from-an-existing-linux-distribution/</feedburner:origLink></item>
		<item>
		<title>disable kernel debugging before using ubuntu’s kernel config</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/6GlxmJfRugw/</link>
		<comments>http://blog.eugeneoden.com/2008/07/30/disable-kernel-debugging-before-using-ubuntus-kernel-config/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 20:02:11 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[system administration]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=43</guid>
		<description><![CDATA[if you ever need to rebuild an ubuntu kernel beware when using their supplied config file from /boot/config-$(uname -r)
i went through this exercise recently and wasted quite a bit of time trying to figure out why my new kernel package including modules was over 700mb uncompressed when the original package is around 60mb uncompressed.
once i [...]]]></description>
			<content:encoded><![CDATA[<p>if you ever need to rebuild an ubuntu kernel beware when using their supplied config file from /boot/config-$(uname -r)</p>
<p>i went through this exercise recently and wasted quite a bit of time trying to figure out why my new kernel package including modules was over 700mb uncompressed when the original package is around 60mb uncompressed.</p>
<p>once i found out that debugging symbols were to blame this was the process i used to rebuild the kernel:</p>
<p><code><br />
cd /usr/src</p>
<p>apt-get install build-essential kernel-package linux-kernel-devel</p>
<p>apt-get build-dep linux-image-$(uname -r)</p>
<p>apt-get source linux-image-$(uname -r)</p>
<p>cd linux-* # might fail if there's more than one match</p>
<p>make-kpkg clean</p>
<p>cp /boot/config-$(uname -r) .config</p>
<p>make-kpkg configure</p>
<p>make menuconfig</p>
<p># disable kernel debugging under "kernel hacking"</p>
<p># not sure how my copy keeps getting this sticky bit set but it causes a failure<br />
chmod -s debian</p>
<p>make-kpkg -us -uc binary<br />
</code></p>
<p>if everything works you should end up with some .deb files in the parent directory.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/nSf8aLtv0rmPo5eL2qImkYE30Vs/0/da"><img src="http://feedads.g.doubleclick.net/~a/nSf8aLtv0rmPo5eL2qImkYE30Vs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nSf8aLtv0rmPo5eL2qImkYE30Vs/1/da"><img src="http://feedads.g.doubleclick.net/~a/nSf8aLtv0rmPo5eL2qImkYE30Vs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/6GlxmJfRugw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/07/30/disable-kernel-debugging-before-using-ubuntus-kernel-config/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/07/30/disable-kernel-debugging-before-using-ubuntus-kernel-config/</feedburner:origLink></item>
		<item>
		<title>script to delete all iphone sms messages</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/6eTUzxw80-Y/</link>
		<comments>http://blog.eugeneoden.com/2008/07/28/script-to-delete-all-iphone-sms-messages/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 00:58:36 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[pyobjc]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sms]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[sqlite3]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=27</guid>
		<description><![CDATA[my coworker, dan smith, recently expressed frustration with apple&#8217;s lack of bulk message deletion in the iphone sms app.  sometimes our monitoring scripts go a little crazy and send hundreds of emails to us when things go wrong and its extremely tedious to delete these extra useless messages one at a time.
after jailbreaking my iphone [...]]]></description>
			<content:encoded><![CDATA[<p>my coworker, dan smith, recently expressed frustration with apple&#8217;s lack of bulk message deletion in the iphone sms app.  sometimes our monitoring scripts go a little crazy and send hundreds of emails to us when things go wrong and its extremely tedious to delete these extra useless messages one at a time.</p>
<p>after jailbreaking my iphone and installing several of the available packages i was poking around the filesystem and looking at the source code to the example python application.  the gui stuff is beyond me for now but the sqlite access caught my eye &#8211; from /Applications/HelloPython.app/HelloPython.py (with the iphone-python package installed through cydia):</p>
<p><code><br />
...<br />
from sqlite3 import dbapi2 as sqlite<br />
...<br />
db = sqlite.connect(self.userHomeDirectory() + "/Library/AddressBook/AddressBook.sqlitedb")<br />
...<br />
</code></p>
<p>next i did a search of /var/mobile for any other sqlite databases:</p>
<p><code><br />
cd /var/mobile<br />
find . -name '*.sqlitedb'<br />
</code></p>
<p>this returns:</p>
<p><code><br />
./Library/AddressBook/AddressBook.sqlitedb<br />
./Library/AddressBook/AddressBookImages.sqlitedb<br />
./Library/Caches/MapTiles/MapTiles.sqlitedb<br />
./Library/Calendar/Calendar.sqlitedb<br />
</code></p>
<p>hmm&#8230;no sms database.  poking around /var/mobile/Library i found the SMS directory.  in there is a file called &#8220;sms.db&#8221;.  at first i thought it was a berkley database or something but i wasn&#8217;t able to open it using python&#8217;s anydbm module so i tried the &#8220;file&#8221; command:</p>
<p><code><br />
iPhone:/var/mobile/Library/SMS root# file sms.db<br />
sms.db: SQLite 3.x database<br />
</code></p>
<p>sweet &#8211; its an sqlite database after all.  searching for other files ending with a .db in /var/mobile reveals several other sqlite databases including call_history.db, notes.db, voicemail.db, and databases for several of the installed applications.</p>
<p>using sqlite&#8217;s command line utility i inspected the schema:</p>
<p><code><br />
iPhone:/var/mobile/Library/SMS root# sqlite3 sms.db<br />
SQLite version 3.5.4<br />
Enter ".help" for instructions<br />
sqlite> .tables<br />
_SqliteDatabaseProperties  message<br />
group_member               msg_group<br />
sqlite> .schema message<br />
CREATE TABLE message (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT, date INTEGER, text TEXT, flags INTEGER, replace INTEGER, svc_center TEXT, group_id INTEGER, association_id INTEGER, height INTEGER, UIFlags INTEGER, version INTEGER);<br />
CREATE INDEX message_flags_index ON message(flags);<br />
CREATE INDEX message_group_index ON message(group_id, ROWID);<br />
CREATE TRIGGER delete_message AFTER DELETE ON message WHEN NOT read(old.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = old.group_id) - 1 WHERE ROWID = old.group_id; END;<br />
CREATE TRIGGER delete_newest_message AFTER DELETE ON message WHEN old.ROWID = (SELECT newest_message FROM msg_group WHERE ROWID = old.group_id) BEGIN UPDATE msg_group SET newest_message = (SELECT ROWID FROM message WHERE group_id = old.group_id AND ROWID = (SELECT max(ROWID) FROM message WHERE group_id = old.group_id)) WHERE ROWID = old.group_id; END;<br />
CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID >= IFNULL((SELECT MAX(ROWID) FROM message WHERE message.group_id = new.group_id), 0) BEGIN UPDATE msg_group SET newest_message = new.ROWID WHERE ROWID = new.group_id; END;<br />
CREATE TRIGGER insert_unread_message AFTER INSERT ON message WHEN NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;<br />
CREATE TRIGGER mark_message_read AFTER UPDATE ON message WHEN NOT read(old.flags) AND read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) - 1 WHERE ROWID = new.group_id; END;<br />
CREATE TRIGGER mark_message_unread AFTER UPDATE ON message WHEN read(old.flags) AND NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;<br />
</code></p>
<p>the hairy thing about this is that there are triggers on the table for deletes.  a &#8220;select * from message;&#8221; shows all sms messages so i first tried the easy route:</p>
<p><code><br />
sqlite> delete from message;<br />
SQL error: no such function: read<br />
</code></p>
<p>looking more closely at the triggers i saw where it was calling the read() function in the triggers.  googling for &#8220;sqlite user defined functions&#8221; provided some explanation on what they are and how to define them.  one of the results showed an example in python.</p>
<p>i did some experiments and found that the flags column appears to be a bitmap and that the second bit indicates whether a message has been read or not.  so the triggers update an unread message count in another table on deletion, the flags column is updated, or when a row is inserted.</p>
<p>so here&#8217;s my script to delete all sms messages:</p>
<p><code><br />
#! /usr/bin/env python</p>
<p>from sqlite3 import dbapi2 as sqlite</p>
<p>def message_read(flags):<br />
    """reimplementation of an sqlite user defined function called by a trigger<br />
    on the messages table.</p>
<p>    the trigger checks the message flags to see if a message has been read to<br />
    see if the counter of unread messages in another needs to be updated when<br />
    a message is deleted.<br />
    """</p>
<p>    # second bit is the "was read" flag<br />
    return (int(flags) &#038; 0x02) >> 1</p>
<p>db = sqlite.connect('/var/mobile/Library/SMS/sms.db')</p>
<p># register the user-defined function used by delete trigger<br />
db.create_function('read', 1, message_read)</p>
<p>c = db.cursor()</p>
<p>c.execute('delete from message;')</p>
<p>db.commit()</p>
<p># vim:set ts=4 sw=4 ai et tw=80:<br />
</code></p>
<p>you can download the source <a href="http://eugeneoden.com/delete_sms.py">here</a>.</p>
<p>i&#8217;m not much of a gui programmer and have no experience at all with apple&#8217;s cocoa interface or objective-c so for now this is just a command-line script.  i hope to spend some time learning how to use pyobjc and working with the cocoa libraries to make an interface for it.</p>
<p>its easy enough to run the script through the mobile terminal app after copying the script to the iphone, chmod 755 delete_sms.py, then run it:</p>
<p><code><br />
./delete_sms.py<br />
</code></p>
<p>no output from the script is a good thing.  if something goes wrong it should spew several lines of errors describing what happened.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/SfW2aH538HdUT9_aVWGe2G2-ndg/0/da"><img src="http://feedads.g.doubleclick.net/~a/SfW2aH538HdUT9_aVWGe2G2-ndg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SfW2aH538HdUT9_aVWGe2G2-ndg/1/da"><img src="http://feedads.g.doubleclick.net/~a/SfW2aH538HdUT9_aVWGe2G2-ndg/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/6eTUzxw80-Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/07/28/script-to-delete-all-iphone-sms-messages/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/07/28/script-to-delete-all-iphone-sms-messages/</feedburner:origLink></item>
		<item>
		<title>my favorite iphone apps</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/U0EKwe0hPp8/</link>
		<comments>http://blog.eugeneoden.com/2008/07/26/my-favorite-iphone-apps/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 19:25:18 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=24</guid>
		<description><![CDATA[after holding out and suffering with my treo 650 through the launch of the first iphone i couldn&#8217;t help myself when the iphone 3g came out and had to get one.
it&#8217;s awesome.
sure, it crashes at least once a day, apps randomly stop working, it doesn&#8217;t record video or send/receive mms, the on-screen keyboard takes some [...]]]></description>
			<content:encoded><![CDATA[<p>after holding out and suffering with my treo 650 through the launch of the first iphone i couldn&#8217;t help myself when the iphone 3g came out and had to get one.</p>
<p>it&#8217;s awesome.</p>
<p>sure, it crashes at least once a day, apps randomly stop working, it doesn&#8217;t record video or send/receive mms, the on-screen keyboard takes some getting used to, and apple has draconian software policies.</p>
<p>however, imho, the pros outweigh the cons.</p>
<p>by far the #1 app for the iphone is the safari web browser.  combined with faster 3g networking and taking advantage of wifi where it&#8217;s available, it makes my treo seem like a commodore 64 by comparison &#8211; not that the commodore 64 wasn&#8217;t a great machine in it&#8217;s time.</p>
<p>my second favorite app is airme.  with lots of out-of-state family who don&#8217;t get to see my kids very often i can take pictures of moments with my phone which typically would be lost before digging the nikon out.  that in itself isn&#8217;t impressive but what is impressive is how it immediately uploads to flickr so my family can actually see the pictures instead of them staying on my phone until i get around to uploading them.</p>
<p>next up is tuner.  i&#8217;m a news junkie.  it drives me nuts whenever i can&#8217;t listen to npr, preferably via kut, when i want to.  tuner lets you tune into any free mp3 stream on the net and kut has a great stream 24/7.</p>
<p>when i&#8217;m coding and want to listen to music &#8211; typically techno &#8211; i turn to the variety of streams available through pandora&#8217;s app.  the quality is good and there&#8217;s something for everyone.</p>
<p>one of the things that made the iphone 3g nearly irresistible for me was the likelihood that it would be jailbroken like its predecessor.  sure enough it took about two weeks before a jailbreaking app for macs was available.       i wasted no time liberating mine from apple&#8217;s lock over what i could install.  what makes this particularly appealing for this linux geek is that under the hood the iphone runs mac osx &#8211; apple&#8217;s variant of freebsd &#8211; which isn&#8217;t linux but still has a command prompt, a compiler and a nice selection of my favorite tools.</p>
<p>the jailbreaking utility provides a convenient package manager for installing non-sanctioned software.  the nes emulator available through this is awesome and already has consumed too much of my time.  the pacman game &#8211; macman &#8211; is also cool. i was also quick to install the terminal app &#8211; my preferred working environment.  it gives you a command prompt for the bsd system from which it&#8217;s possible to ssh to a server, run scripts, etc</p>
<p>after installing python and the sample python app i was pleased to discover while reading the sample code that apple uses sqlite for a few of it&#8217;s databases including contacts, calendar, and sms messages.  it took me about 20 minutes to write a script to purge all text messages &#8211; should be handy the next time a server decides to spam me with 200 text messages before someone can silence it.</p>
<p>i&#8217;m eagerly awaiting a video recording app &#8211; and will gladly pay for one.  a bonus goes to the one that can auto upload to flickr or youtube.  there&#8217;s an app already for the first iphone running the 1.x software so hopefully it won&#8217;t be long.</p>
<p>mms would be nice but with airme it isn&#8217;t that big of as deal without it.</p>
<p>i&#8217;m travelling next month and will post how ad-hoc tethering works.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/QwPDn20d7pr-zMfz-VwJvbFcIgA/0/da"><img src="http://feedads.g.doubleclick.net/~a/QwPDn20d7pr-zMfz-VwJvbFcIgA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QwPDn20d7pr-zMfz-VwJvbFcIgA/1/da"><img src="http://feedads.g.doubleclick.net/~a/QwPDn20d7pr-zMfz-VwJvbFcIgA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/U0EKwe0hPp8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/07/26/my-favorite-iphone-apps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/07/26/my-favorite-iphone-apps/</feedburner:origLink></item>
		<item>
		<title>testing threads with py.test</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/DIxCb8K0S5A/</link>
		<comments>http://blog.eugeneoden.com/2008/05/12/testing-threads-with-pytest/#comments</comments>
		<pubDate>Mon, 12 May 2008 19:58:59 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[py.test]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=17</guid>
		<description><![CDATA[i&#8217;m a big fan of automated unit tests.  my preferred testing utility is py.test.  for most things it works pretty well and its super easy to use.
threads are tricky to deal with but especially while trying to test them if you have a lot going on at the same time.  by default [...]]]></description>
			<content:encoded><![CDATA[<p>i&#8217;m a big fan of automated unit tests.  my preferred testing utility is <a href="http://codespeak.net/py/dist/test.html">py.test</a>.  for most things it works pretty well and its super easy to use.</p>
<p>threads are tricky to deal with but especially while trying to test them if you have a lot going on at the same time.  by default py.test will not catch exceptions which occur in threads which, unless you&#8217;re careful to check for them, could lead to inaccurate test results.</p>
<p>i wrote the following class to help with thread testing:</p>
<pre>
class ThreadMonitor(object):
   """Helper class for catching exceptions generated in threads.

   Usage:

      mon = ThreadMonitor() 

      th = threading.Thread(target=mon.wrap(myFunction))
      th.start()

      th.join()

      mon.check() # raises any exception generated in the thread

   Any raised exception will include a traceback from the original
   thread, not the function calling mon.check()

   Works for multiple threads
   """
   def __init__(self):
      self.queue = Queue.Queue()

   def wrap(self, function):
      def threadMonitorWrapper(*args, **kw):
         try:
            ret = function(*args, **kw)
         except Exception, e:
            self.queue.put(sys.exc_info())
            raise

         return ret

      return threadMonitorWrapper

   def check(self):
      try:
         item = self.queue.get(block=False)
      except Queue.Empty:
         return

      klass, value, tb = item

      raise klass, value, tb # note the last parameter - traceback
</pre>
<p>this doesn&#8217;t fill all of one&#8217;s py.test thread testing needs, but it helps for certain cases.</p>
<p>the final line with the &#8220;raise&#8221; keyword raises the exception caught in the thread but the traceback argument causes py.test to show the original context of the exception.  so with the &#8220;&#8211;pdb&#8221; option to py.test you&#8217;ll automatically drop into the context of the first exception on a failure in a monitored thread.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/hqoT_M8furtcwhO4mzw8gxYeRAE/0/da"><img src="http://feedads.g.doubleclick.net/~a/hqoT_M8furtcwhO4mzw8gxYeRAE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hqoT_M8furtcwhO4mzw8gxYeRAE/1/da"><img src="http://feedads.g.doubleclick.net/~a/hqoT_M8furtcwhO4mzw8gxYeRAE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/DIxCb8K0S5A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/05/12/testing-threads-with-pytest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/05/12/testing-threads-with-pytest/</feedburner:origLink></item>
		<item>
		<title>awesome screen/vim hack</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/PL9k98uPfPo/</link>
		<comments>http://blog.eugeneoden.com/2008/04/22/awesome-screen-vim-hack/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 03:20:07 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/?p=16</guid>
		<description><![CDATA[add this to ~/.vimrc:

if $TERM=='screen'
   exe "set title titlestring=vim:%f"
   exe "set title t_ts=\&#60;ESC&#62;k t_fs=\&#60;ESC&#62;\\"
endif

and vim will automatically set the title of screen windows to:

vim:&#60;file opened&#62;

thanks go to:
http://gunkies.org/blog/?p=19
]]></description>
			<content:encoded><![CDATA[<p>add this to ~/.vimrc:</p>
<pre>
if $TERM=='screen'
   exe "set title titlestring=vim:%f"
   exe "set title t_ts=\&lt;ESC&gt;k t_fs=\&lt;ESC&gt;\\"
endif
</pre>
<p>and vim will automatically set the title of screen windows to:</p>
<pre>
vim:&lt;file opened&gt;
</pre>
<p>thanks go to:</p>
<p>http://gunkies.org/blog/?p=19</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Avn6AAEACEYugwmSUje6Bj838Fg/0/da"><img src="http://feedads.g.doubleclick.net/~a/Avn6AAEACEYugwmSUje6Bj838Fg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Avn6AAEACEYugwmSUje6Bj838Fg/1/da"><img src="http://feedads.g.doubleclick.net/~a/Avn6AAEACEYugwmSUje6Bj838Fg/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/PL9k98uPfPo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/04/22/awesome-screen-vim-hack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/04/22/awesome-screen-vim-hack/</feedburner:origLink></item>
		<item>
		<title>back home from pycon</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/_s_aJv1EpJA/</link>
		<comments>http://blog.eugeneoden.com/2008/03/19/back-home-from-pycon/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 17:18:31 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[bazaar]]></category>
		<category><![CDATA[bzr-loom]]></category>
		<category><![CDATA[olpc]]></category>
		<category><![CDATA[pizza]]></category>
		<category><![CDATA[pycon]]></category>
		<category><![CDATA[pycon2008]]></category>
		<category><![CDATA[quilt]]></category>
		<category><![CDATA[sprint]]></category>
		<category><![CDATA[tortoisebzr]]></category>
		<category><![CDATA[tummy.com]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/2008/03/19/back-home-from-pycon/</guid>
		<description><![CDATA[made it back home yesterday with only a 45 minute delay after nearly getting stuck in san antonio because of bad weather in austin.
i hung out in the bazaar/olpc sprint room monday.  i&#8217;m pretty new to bazaar and wasn&#8217;t really able to contribute anything but i spent the time familiarizing myself with the code [...]]]></description>
			<content:encoded><![CDATA[<p>made it back home yesterday with only a 45 minute delay after nearly getting stuck in san antonio because of bad weather in austin.</p>
<p>i hung out in the bazaar/olpc sprint room monday.  i&#8217;m pretty new to bazaar and wasn&#8217;t really able to contribute anything but i spent the time familiarizing myself with the code and trying out the bzr-svn plugin to evaluate whether we&#8217;d be able to use it at work.  i listened to mark hammond and ian clatworthy discuss bazaar internals and mark&#8217;s strategy for developing <a href="http://bazaar-vcs.org/TortoiseBzr" title="TortoiseBzr" target="_blank">tortoisebzr</a>.</p>
<p><a href="http://www.tummy.com/" title="tummy.com" target="_blank">tummy.com</a> was very generous and ordered pizza for all of the sprinters <a href="http://flickr.com/photos/jacobian/2344478940/" target="_blank" title="35 pizzas for 300 people">(35 pizzas for 300 people)</a>.</p>
<p>in the airport and on the plane yesterday i spent more time digging around the bazaar code.  its quite readable and very well organized into layers where modules can be swapped out at various layers to change the behavior.  the <a href="https://launchpad.net/bzr-loom" title="bzr-loom plugin" target="_blank">bzr-loom plugin</a> adds <a href="http://savannah.nongnu.org/projects/quilt" title="quilt" target="_blank">quilt</a>-like functionality in bazaar.  looking around i saw that while its functional it doesn&#8217;t have the ability to change a loomified bazaar branch into a regular bazaar branch.  it seems straightforward to add this so i started working on it on the plane.  i got a crude version working which just discards any changes in threads but ran into some locking issues and wasn&#8217;t able to work them out before the battery died on my laptop.  i&#8217;ll write more about that once i have more time to look at it.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/QPI856UyNNFlcn_dPALMGly8u_w/0/da"><img src="http://feedads.g.doubleclick.net/~a/QPI856UyNNFlcn_dPALMGly8u_w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QPI856UyNNFlcn_dPALMGly8u_w/1/da"><img src="http://feedads.g.doubleclick.net/~a/QPI856UyNNFlcn_dPALMGly8u_w/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/_s_aJv1EpJA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/03/19/back-home-from-pycon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/03/19/back-home-from-pycon/</feedburner:origLink></item>
		<item>
		<title>pycon 2008 – day 3</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/ARXnFOnSl-A/</link>
		<comments>http://blog.eugeneoden.com/2008/03/16/pycon-2008-day-3/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 18:46:27 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[beautifulsoup]]></category>
		<category><![CDATA[figleaf]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[lxml]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[olpc]]></category>
		<category><![CDATA[pycon]]></category>
		<category><![CDATA[pycon2008]]></category>
		<category><![CDATA[pyxpcom]]></category>
		<category><![CDATA[slickedit]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[wing-ide]]></category>
		<category><![CDATA[wingware]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/2008/03/16/pycon-2008-day-3/</guid>
		<description><![CDATA[the first keynote address was really good, calling for an easier way of getting a standardized python distribution on windows to make it easier to distribute single python scripts.  the second keynote address, snake charming the dragon, was also good but dragged on a little too long with perhaps too much detail.  mark [...]]]></description>
			<content:encoded><![CDATA[<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/70/" title="first keynote address" target="_blank">first keynote address</a> was really good, <a href="http://www.toolness.com/wp/" title="call to action" target="_blank">calling</a> for an easier way of getting a standardized python distribution on windows to make it easier to distribute single python scripts.  the second keynote address, snake charming the dragon, was also good but dragged on a little too long with perhaps too much detail.  mark hammond discussed <a href="http://developer.mozilla.org/en/docs/PyXPCOM" title="pyxpcom">pyxpcom</a> and the lack of community support as well as the direction of the mozilla project.  the <a href="http://us.pycon.org/2008/conference/schedule/event/71/" title="olpc talk">olpc talk</a> was excellent.  despite <a href="http://radian.org/notebook/" title="ivan krstić">ivan</a> losing his original presentation and having to rewrite it during the first two on someone else&#8217;s computer, it was an excellent overview of where the <a href="http://laptop.org/" title="olpc project">olpc project</a> is and some of its <a href="http://radian.org/notebook/first-deployment" title="first olpc deployment">early</a> <a href="http://radian.org/notebook/astounded-in-arahuay" title="peru deployment">successes</a> in the field.</p>
<p>next i went to the <a href="http://us.pycon.org/2008/conference/schedule/event/74/" title="consuming html talk" target="_blank">consuming html talk</a> by <a href="http://blog.ianbicking.org/" title="ian bicking" target="_blank">ian bicking</a>.  he started with presenting a case why you might want to consume html instead of either xml or xhtml and continued by discussing various python libraries for parsing and working with html.  i didn&#8217;t realize that the <a href="http://codespeak.net/lxml/" title="lxml">lxml parser</a> was a suitable alternative to <a href="http://www.crummy.com/software/BeautifulSoup/" title="BeautifulSoup" target="_blank">BeautifulSoup</a> and will certainly give it a closer look.  there was a mini-argument about the merits of xhtml following ian&#8217;s assertion that xhtml will never be widely accepted, including annoying interjections during the talk.  otherwise it was a pretty good talk but the level of detail was a bit lower than i had expected.</p>
<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/81/" title="wingware presentation" target="_blank">wingware presentation</a> was interesting.  i&#8217;ve never been much of an IDE user &#8211; i&#8217;ve tried using slickedit and others but i keep falling back to trusty vim.  i  don&#8217;t expect to start using either wing or komodo &#8211; the nature of my company&#8217;s product makes it difficult to develop solely on one&#8217;s laptop and i haven&#8217;t been comfortable with remotely editing, given that i&#8217;ve typically had gateway hops between my workstation and the code i&#8217;m editing.  its impressive that the wing ide and the supporting business is managed by two guys.</p>
<p>titus brown&#8217;s <a href="http://us.pycon.org/2008/conference/schedule/event/83/" title="olpc testing talk">olpc testing techniques talk</a> was very informative and unexpectedly critical of the testing techniques, or lack thereof, used by the olpc project, asserting that without testing the project will inevitably lead to a quality death spiral.  he&#8217;s doing <a href="http://darcs.idyll.org/~t/projects/figleaf/doc/" title="figleaf code coverage tool" target="_blank">some cool stuff</a> with code coverage, using python&#8217;s sys.settrace() function to record the execution path of olpc&#8217;s sugar interface, sending it to a web server where it can be immediately analyzed with provisions for clearing previous history and omitting uninteresting execution paths.</p>
<p>i sat in on the wing ide <a href="http://wiki.python.org/moin/Birds_of_a_Feather" target="_blank" title="birds of a feather">bof</a>  for a bit while eating lunch but it was mostly wrapping up with discussions about possible and future features by the time i got there.</p>
<p>the lightning talks today were much better. you can see the links i saved on my <a href="http://del.icio.us/eugeneoden" title="my del.icio.us page" target="_blank">del.icio.us page</a>.  i was going to write more about each of them but i didn&#8217;t take any notes and don&#8217;t have a great memory.</p>
<p>following the lightning talks today was brett cannon&#8217;s humorous and well presented <a href="http://us.pycon.org/2008/conference/schedule/event/89/" title="intro to sprinting" target="_blank">intro to sprinting</a>, after which the sprint coaches introduced themselves and answered various questions about sprinting.</p>
<p>the superhuman duo from <a href="http://wingware.com/" title="wingware" target="_blank">wingware</a> described earlier were generous enough to provide free licenses of their <a href="https://wingware.com/wingide/index" title="wingware ide pro">premium product</a> to all sprinters.  i got my activation key without much delay and will download &amp; try it out in the next few days.</p>
<p>after considering the rather <a href="http://us.pycon.org/2008/sprints/rooms/" title="sprint room assignments">large list of of sprints</a> i settled on the <a href="http://us.pycon.org/2008/sprints/projects/#bazaar" title="bazaar sprint info">bazaar sprint</a> because it has the possibility of being most directly applicable to my day job and seems to have a low barrier to entry.  also version control is something i&#8217;ve spent quite a bit of time thinking about in the course of trying to implement release management for my employer.</p>
<p>there was a good turnout for the bazaar sprinting tutorial.  the core bazaar developers from canonical really have their stuff together and provided a very <a href="http://bazaar-vcs.org/Talks?action=AttachFile&amp;do=get&amp;target=Bazaar+Introduction.pdf" title="bazaar introduction">thorough introduction</a> of both how to use bazaar and how to <a href="http://doc.bazaar-vcs.org/bzr.dev/en/developer-guide/HACKING.html" title="developer docs">contribute to bazaar</a>, either by creating a plugin or changing the core project itself.  again, the core bazaar team and its surrounding community really deserve some recognition for the outstanding quality of the source code and development process &#8211; everything from a complete test suite to a <a href="http://bundlebuggy.aaronbentley.com/" title="bundle buggy patch submission tracking for bazaar" target="_blank">patch submission tracking page</a> where each patch must be reviewed by two core developers before it is allowed to be merged into the central bazaar repository.</p>
<p>tomorrow is my last day here in chicago and i plan to spend it sprinting with the bazaar bunch.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/deaufe9cj6_JoOYNxIjnYMGUCmw/0/da"><img src="http://feedads.g.doubleclick.net/~a/deaufe9cj6_JoOYNxIjnYMGUCmw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/deaufe9cj6_JoOYNxIjnYMGUCmw/1/da"><img src="http://feedads.g.doubleclick.net/~a/deaufe9cj6_JoOYNxIjnYMGUCmw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/ARXnFOnSl-A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/03/16/pycon-2008-day-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/03/16/pycon-2008-day-3/</feedburner:origLink></item>
		<item>
		<title>pycon 2008 – day 2</title>
		<link>http://feedproxy.google.com/~r/GenesNerdery/~3/qwnXt7xwtNE/</link>
		<comments>http://blog.eugeneoden.com/2008/03/15/pycon-2008-day-2/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 03:13:09 +0000</pubDate>
		<dc:creator>Gene Oden</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[apug]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[enthought]]></category>
		<category><![CDATA[iron-python]]></category>
		<category><![CDATA[multitouch]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[pycon]]></category>
		<category><![CDATA[pycon2008]]></category>
		<category><![CDATA[pypy]]></category>
		<category><![CDATA[resolver]]></category>
		<category><![CDATA[stackless]]></category>
		<category><![CDATA[stacklesssocket]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[supervisor]]></category>
		<category><![CDATA[supervisord]]></category>
		<category><![CDATA[tahoe]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[twisted]]></category>

		<guid isPermaLink="false">http://blog.eugeneoden.com/2008/03/15/pycon-2008-day-2/</guid>
		<description><![CDATA[some of the keynotes from this morning were great.  others, less than exciting &#8211; informative at best.  i used the time to check out allmydata.org&#8217;s tahoe distributed filesystem, connecting to an ad-hoc p2p network started by other pycon participants.  cool stuff.  i haven&#8217;t quite figured out how to replicate data from [...]]]></description>
			<content:encoded><![CDATA[<p>some of the keynotes from this morning were great.  others, less than exciting &#8211; informative at best.  i used the time to check out <a href="http://allmydata.org/trac/tahoe" title="tahoe website">allmydata.org&#8217;s tahoe distributed filesystem</a>, connecting to an ad-hoc p2p network started by other <a href="http://us.pycon.org/2008/about/" title="pycon 2008">pycon</a> participants.  cool stuff.  i haven&#8217;t quite figured out how to replicate data from other nodes, though.</p>
<p>the first talk i went to today was <a href="http://us.pycon.org/2008/conference/schedule/event/45/" target="_blank" title="supervisor as a platform">supervisor as a platform</a>, about <a href="http://supervisord.org/" title="http://supervisord.org/" target="_blank">http://supervisord.org</a>.  overall it seems like a cool project for managing processes on multiple machines.  however i wish that it didn&#8217;t require processes to run in the foreground &#8211; this might be nice for new programs but for well established programs which daemonize themselves i think it would have been better to use the standard /etc/init.d/ script interface.</p>
<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/47/" title="pypy talk" target="_blank">pypy talk</a> was pretty good.  i&#8217;ve been following their <a href="http://morepypy.blogspot.com" title="pypy blog" target="_blank">blog</a> for a while so i didn&#8217;t see much new but it was well presented and received a good response from the crowd.</p>
<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/50/" title="django talk" target="_blank">django talk</a> was really good.  the example showing how to make a view reusable by adding parameters for the form class, the template, and the redirect url makes a lot of sense.  its good to see there&#8217;s a way for doing reverse url lookups for dynamically determining where an application is rooted in the site&#8217;s url tree &#8211; that was a point of frustration for me before.  the emphasis on writing multiple smaller, narrowly defined applications made me realize that this would have been a much better way of working for the django apps i&#8217;ve written.</p>
<p>lunch was better today.</p>
<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/55/" target="_blank" title="multitouch presentation">multitouch presentation</a> was excellent.  i&#8217;ve met with the guys from <a href="http://enthought.com/" title="http://enthought.com/" target="_blank">enthought</a> at the <a href="http://wiki.python.org/moin/AustinPythonUserGroup" title="http://wiki.python.org/moin/AustinPythonUserGroup" target="_blank">austin python user&#8217;s group</a> meeting they host once a month and saw a preview of this presentation some months ago.  they&#8217;ve come a long way since then.  too bad it would be a monumental and/or expensive effort to get one of these things.</p>
<p>i haven&#8217;t looked at trac too much but the plugin architecture seems solid and well thought out.  the <a href="http://us.pycon.org/2008/conference/schedule/event/62/" target="_blank" title="trac presentation">presentation</a> was excellent and gave a great overview of what is possible when developing trac plugins and how to go about doing so.  the company i work for could probably benefit from switching to trac &#8211; seems like someone there looked at it before but i&#8217;m not sure where that ended.</p>
<p>the <a href="http://us.pycon.org/2008/conference/schedule/event/66/" title="stackless + twisted talk">stackless + twisted talk</a> is probably most directly relevant to my <a href="http://networkip.net/" title="NetworkIP">day job</a>.  a coworker and i implemented a test driver using <a href="http://stackless.com" title="stackless python" target="_blank">stackless</a> to take advantage of lightweight threads and were surprised to find no readily available solution for dealing with blocking socket operations.  the <a href="http://code.google.com/p/stacklessexamples/wiki/StacklessNetworking" title="stacklesssocket" target="_blank">stacklesssocket</a> module comes close but had some problems conforming to the socket module&#8217;s behavior and wastes quite a bit of processor (looking at the page for stacklesssocket now i see that richard tew has integrated some fixes for these issues).  after several rounds of finding and killing bugs we got something usable and have been quite happy with the results.  i&#8217;m not sure if using <a href="http://twistedmatrix.com/trac/" title="twisted python">twisted</a> is the best option for our environment because it doesn&#8217;t completely hide the fact that twisted is used.  i&#8217;ll have to make our changes to stacklesssocket available somewhere sometime.</p>
<p>the lightning talks were different today.  a few plugs for various projects, tripping over podiums, possessed computers, etc.  the <a href="http://resolversystems.com/" title="resolver">resolver spreadsheet product</a> is cooler than i had imagined it would be &#8211; generating ironpython code behind the scenes to reproduce the displayed spreadsheet, allowing python formulas, etc.  overall the talks from yesterday were better than today&#8217;s but i&#8217;ll admit that i zoned out after a few of the less interesting talks and bailed out early for food so i could make it to the bazaar introduction i mostly missed yesterday.</p>
<p>speaking of which, the <a href="http://bazaar-vcs.org" title="bazaar" target="_blank">bazaar</a> introduction was great.  before yesterday i had only briefly looked at bazaar and regarded it as one might a strange looking bug, much the same way i initially regarded python upon seeing the whitespace treatment.  but, like python, upon further inspection it appears to be more useful than i initially thought.  not requiring a centralized repository allows a more flexible workflow between coworkers.  merge tracking is far superior than subversion&#8217;s and would appear to eliminate spurious conflicts when merging multiple times from the same source.  additionally, much work has gone into not only allowing multiple use case scenarios with varying degrees of molding bazaar to work more like subversion on the one extreme or git on the other, but to provide some level of interaction between other version control systems.  the subversion plugin to bazaar appears to be the most mature and allegedly allows a nearly seemless flow of changes to and from subversion to a bazaar branch.  i&#8217;m certainly going to test this with our subversion-hosted source code to see if its feasible.</p>
<p>overall, today was good.  i think i learned more about more projects yesterday but perhaps i learned more about a few individual projects today, specifically tahoe and bazaar.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/mfmRcmtnsI1mEhJOGBO-3wuHB1o/0/da"><img src="http://feedads.g.doubleclick.net/~a/mfmRcmtnsI1mEhJOGBO-3wuHB1o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mfmRcmtnsI1mEhJOGBO-3wuHB1o/1/da"><img src="http://feedads.g.doubleclick.net/~a/mfmRcmtnsI1mEhJOGBO-3wuHB1o/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/GenesNerdery/~4/qwnXt7xwtNE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.eugeneoden.com/2008/03/15/pycon-2008-day-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.eugeneoden.com/2008/03/15/pycon-2008-day-2/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.478 seconds. --><!-- File not cached! Super Cache Couldn't write to: wp-content/cache/wp-cache-e5b8e7699443a60d24acfe7132746536.html -->
