<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-9238405</id><updated>2008-07-23T03:27:21.756-07:00</updated><title type='text'>Agile Testing</title><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>316</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9238405.post-2482171048545847946</id><published>2008-07-16T18:23:00.000-07:00</published><updated>2008-07-16T18:25:05.983-07:00</updated><title type='text'>This just in: Google releases Mox</title><content type='html'>...which is a YAPMOF (yet another Python mock object framework). Find it &lt;a href="http://code.google.com/p/pymox/"&gt;here&lt;/a&gt;, and read more about it &lt;a href="http://google-opensource.blogspot.com/2008/07/check-out-mox-our-mock-object-framework.html"&gt;here&lt;/a&gt;. I'll definitely check it out soon.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/07/this-just-in-google-releases-mox.html' title='This just in: Google releases Mox'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=2482171048545847946' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/2482171048545847946/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/2482171048545847946'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/2482171048545847946'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-4354467701974992631</id><published>2008-07-14T09:54:00.000-07:00</published><updated>2008-07-14T10:21:11.930-07:00</updated><title type='text'>Zach and sugarbot going strong in Google SoC</title><content type='html'>&lt;a href="http://gsoc-sugarbot.blogspot.com/"&gt;Zach Riggle&lt;/a&gt; has made very strong progress with his Google SoC project, &lt;a href="http://code.google.com/p/sugarbot/"&gt;sugarbot&lt;/a&gt;. The goal of the project is to create a tool that runs and tests &lt;a href="http://laptop.org/"&gt;OLPC&lt;/a&gt; &lt;a href="http://wiki.laptop.org/go/Sugar"&gt;Sugar&lt;/a&gt; activities automatically. Zach needed a way to hook into the PyGTK code that Sugar is based on. After looking at various tools, he settled on &lt;a href="http://www.async.com.br/projects/kiwi/api/"&gt;kiwi&lt;/a&gt;. He managed to have sugarbot run as an activity inside Sugar, then launch any other activities that need to be tested. The test scripts are kept by an XML-RPC server that Zach wrote, and sugarbot-based clients get them from the server and run them. Just these last couple of days, Zach also managed to get the sugarbot activity &lt;a href="http://gsoc-sugarbot.blogspot.com/2008/07/automated-launching-go.html"&gt;launch automatically&lt;/a&gt; when the Sugar environment starts up.&lt;br /&gt;&lt;br /&gt;You can see a screencast that Zach put together, as well as a list of his accomplishments so far, in this &lt;a href="http://gsoc-sugarbot.blogspot.com/2008/07/mid-summer-screencast.html"&gt;blog post&lt;/a&gt;. In the screencast, Zach shows how he automates the launching and testing of two Sugar activities, the Calculator and the Terminal. Very cool stuff.&lt;br /&gt;&lt;br /&gt;It's been a pleasure mentoring Zach on his SoC project. He has already proven himself to possess strong software engineering skills, not only in programming, but also in designing complex pieces of software. I only had to provide minimal guidance to Zach, and he has been very receptive with all the advice I have given him. I liked the fact that he implemented an automated test suite for sugarbot, and he included it in a buildbot continuous integration process, only days after I suggested that to him. It has also been very satisfying to me as a mentor to see his progress as exemplified by his almost-daily blog posts. I believe he is the most active blogger on Planet SoC. Good job, Zach!</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/07/zach-and-sugarbot-going-strong-in.html' title='Zach and sugarbot going strong in Google SoC'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=4354467701974992631' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/4354467701974992631/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4354467701974992631'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4354467701974992631'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7909948071369315174</id><published>2008-06-18T07:36:00.000-07:00</published><updated>2008-06-18T07:40:49.554-07:00</updated><title type='text'>Celtics use Ubuntu to beat Lakers</title><content type='html'>Excerpt from the Associated Press article about the Celtics-Lakers game last night:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-family:verdana,sans-serif;font-size:85%;color:black;"&gt;It was a group effort by this gang in green, which bonded behind Rivers, who borrowed an African word ubuntu (pronounced Ooh-BOON-too) and roughly means "I am, because we are" in English, as the Celtics' unifying team motto. &lt;/span&gt;&lt;span id="article"&gt;&lt;span name="intelliTxt" id="intelliTXT"&gt;&lt;p&gt;&lt;span style="font-family:verdana,sans-serif;font-size:85%;color:black;"&gt;   The Celtics gave the Lakers a 12-minute crash course of ubuntu in the second quarter.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span id="article"&gt;&lt;span name="intelliTxt" id="intelliTXT"&gt;&lt;span style="font-family:verdana,sans-serif;font-size:85%;color:black;"&gt;Boston outscored Los Angeles 34-19, getting 11 field goals on 11 assists. The Celtics toyed with the Lakers, outworking the Western Conference's best inside and out and showing the same kind of heart that made Boston the center of pro basketball's universe in the '60s. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana,sans-serif;font-size:85%;color:black;"&gt;"&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="article"&gt;&lt;span name="intelliTxt" id="intelliTXT"&gt;&lt;p&gt;It's not what you thought, but it's still nice to see that the ubuntu concept is used successfully in sports too. I wonder what parallel we can make between the Lakers' game last night and an operating system. The Windows Blue Screen of Death comes to mind.&lt;span style="font-family:verdana,sans-serif;font-size:85%;color:black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/06/celtics-use-ubuntu-to-beat-lakers.html' title='Celtics use Ubuntu to beat Lakers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7909948071369315174' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7909948071369315174/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7909948071369315174'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7909948071369315174'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-5375018713072888063</id><published>2008-06-17T15:40:00.001-07:00</published><updated>2008-06-17T15:50:55.079-07:00</updated><title type='text'>Security testing for agile testers</title><content type='html'>I've been asked by Lisa Crispin to contribute a few paragraphs on security testing to an &lt;a href="http://www.agiletester.ca/"&gt;upcoming book on agile testing&lt;/a&gt; that she and Janet Gregory are co-authoring. Here's what I came up with:&lt;br /&gt;&lt;br /&gt;Security testing is a broad topic that cannot be possibly covered in a few paragraphs. Whole books have been devoted to this subject. Here we will try to at least provide some guidelines and pointers to books and tools that might prove useful to agile teams interested in security testing.&lt;br /&gt;&lt;br /&gt;Just like functional testing, security testing can be viewed and conducted from two perspectives: from the inside out (white-box testing) and from the outside in (black-box testing).&lt;br /&gt;&lt;br /&gt;Inside-out security testing assumes that the source code for the application under test is available to the testers. The code can be analyzed statically with a variety of tools that try to discover common coding errors which can make the application vulnerable to attacks such as buffer overflows or format string attacks. (Resources:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Buffer_overflow" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_0"&gt;http://en.wikipedia.org/wiki/Buffer_overflow&lt;/span&gt;&lt;/a&gt; and&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Format_string_vulnerabilities" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_1"&gt;http://en.wikipedia.org/wiki/Format_string_vulnerabilities&lt;/span&gt;&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;A list of tools that can be used for static code analysis can be found here:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_2"&gt;http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The fact that the testers have access to the source code of the application also means that they can map what some books call "the attack surface" of the application, which is the list of all the inputs and resources used by the program under test. Armed with a knowledge of the attack surface, testers can then apply a variety of techniques that attempt to break the security of the application. A very effective class of such techniques is called fuzzing and is based on fault injection. Using this technique, the testers try to make the application fail by feeding it various types of inputs (hence the term fault injection). These inputs range from carefully crafted strings used in SQL Injection attacks, to random byte changes in given input files, to random strings fed as command line arguments. (Resources:&lt;br /&gt;&lt;a href="http://www.fuzzing.org/category/fuzzing-book/" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_3"&gt;http://www.fuzzing.org/category/fuzzing-book/&lt;/span&gt;&lt;/a&gt; and&lt;br /&gt;&lt;a href="http://www.fuzzing.org/fuzzing-software" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_4"&gt;http://www.fuzzing.org/fuzzing-software&lt;/span&gt;&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;The outside-in approach is the one mostly used by attackers that try to penetrate into the servers or the network hosting your application. As a security tester, you need to have the same mindset that attackers do, which means that you have to use your creativity in discovering and exploiting vulnerabilities in your own application. You also need to stay up to date with the latest security news and updates related to the platform/operating system your application runs on. These tasks are by no means easy, they require extensive knowledge, and as such are mostly outsourced to third parties that specialize in security testing.&lt;br /&gt;&lt;br /&gt;So what are agile testers to do when faced with the apparently insurmountable task of testing the security of their application? Here are some practical, pragmatic steps that anybody can follow:&lt;br /&gt;&lt;br /&gt;1. Adopt a continuous integration (CI) process that periodically runs a suite of automated tests against your application.&lt;br /&gt;&lt;br /&gt;2. Learn how to use one or more open source static code analysis tools. Add a step to your CI process which consists of running these tools against your application code. Mark the step as failed it the tools find any critical vulnerabilities.&lt;br /&gt;&lt;br /&gt;3. Install an automated security vulnerability scanner such as Nessus&lt;br /&gt;(&lt;a href="http://www.nessus.org/nessus/" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1213742293_5"&gt;http://www.nessus.org/nessus/&lt;/span&gt;&lt;/a&gt;). Nessus can be run in a command-line, non-GUI mode, which makes it suitable for inclusion in a CI tool. Add a step to your CI process which consists of running Nessus against your application. Capture the Nessus output in a file and parse that file for any high importance security holes found by the scanner. Mark the step as FAIL when any such holes are found.&lt;br /&gt;&lt;br /&gt;4. Learn how to use one or more open source fuzzing tools. Add a step to your CI process which consists of running these tools against your application code. Mark the step as failed it the tools find any critical vulnerabilities.&lt;br /&gt;&lt;br /&gt;As with any automated testing effort, running these tools is no guarantee that your code and your application will be free of security defects. However, running these tools will go a long way towards improving the quality of your application in terms of security. As always, the 80/20 rule applies. These tools will probably find the 80% most common security bugs out there while requiring 20% of your security budget.&lt;br /&gt;&lt;br /&gt;To find the remaining 20% security defects, you're well advised to spend the other 80% of your security budget on high quality security experts. They will be able to test your application security thoroughly by the use of techniques such as SQL injection, code injection, remote code inclusion and cross-site scripting. While there are some tools that try to automate some of these techniques, they are no match for a trained professional who takes the time to understand the inner workings of your application in order to craft the perfect attack against it.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/06/security-testing-for-agile-testing.html' title='Security testing for agile testers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=5375018713072888063' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/5375018713072888063/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5375018713072888063'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5375018713072888063'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-8354354410382795999</id><published>2008-06-17T15:00:00.001-07:00</published><updated>2008-06-17T15:03:01.232-07:00</updated><title type='text'>Tools for troubleshooting Web app performance</title><content type='html'>I came across this &lt;a href="http://sixrevisions.com/tools/faster_web_page/"&gt;blog post&lt;/a&gt; which talks about 15 tools that can make your life easier when you need to troubleshoot the performance of your Web application. I knew about most of them, but a new addition to my arsenal is definitely &lt;a href="http://hping.org/wbox/"&gt;wbox&lt;/a&gt; -- think of it as an HTTP-based ping. Very simple, but extremely useful.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/06/tools-for-troubleshooting-web-app.html' title='Tools for troubleshooting Web app performance'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=8354354410382795999' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/8354354410382795999/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/8354354410382795999'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/8354354410382795999'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7315355817242862941</id><published>2008-06-12T17:47:00.001-07:00</published><updated>2008-06-12T17:50:28.357-07:00</updated><title type='text'>What does your Wordle look like?</title><content type='html'>The &lt;a href="http://www.swordstyle.com/blog2/?p=1634"&gt;meme du jour&lt;/a&gt; seems to be &lt;a href="http://www.wordle.net/"&gt;Wordle&lt;/a&gt; tag clouds. I couldn't resist generating one out of the text on the first page of my blog. Here it is, in all its splendor:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wordle.net/gallery/Agile_Testing_Blog" title="Wordle: Agile Testing Blog"&gt;&lt;img src="http://www.wordle.net/thumb/Agile_Testing_Blog" style="border: 1px solid rgb(221, 221, 221); padding: 4px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You would think I'm very self-centered, since my first and last names appear so prominently. But I think it's because every blog post ends with "posted by Grig Gheorghiu at &lt;current&gt;". The next biggest word is Python, so there's some redemption for me right there :-)</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/06/what-does-your-wordle-look-like.html' title='What does your Wordle look like?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7315355817242862941' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7315355817242862941/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7315355817242862941'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7315355817242862941'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-5724152665307800029</id><published>2008-05-23T15:49:00.000-07:00</published><updated>2008-05-23T16:34:29.753-07:00</updated><title type='text'>Incremental backups to Amazon S3</title><content type='html'>Based on this great &lt;a href="http://www.brainonfire.net/2007/08/11/remote-encrypted-backup-duplicity-amazon-s3/"&gt;blog post&lt;/a&gt; by Tim McCormack, I managed to write some scripts that back up files to Amazon S3. The files are encrypted with GnuPG and rsync-ed to S3 using a Python-based tool called &lt;a href="http://duplicity.nongnu.org/"&gt;duplicity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's what I did in order to get all this going on a CentOS 5.1 server running Python 2.5.&lt;br /&gt;&lt;br /&gt;1) Signed up for Amazon S3 and got the AWS_ACCESS_KEY_ID and the AWS_SECRET_ACCESS_KEY.&lt;br /&gt;&lt;br /&gt;2) Downloaded and installed the following packages: &lt;a href="http://code.google.com/p/boto/"&gt;boto&lt;/a&gt;, &lt;a href="http://py-gnupg.sourceforge.net/"&gt;GnuPGInterface&lt;/a&gt;, &lt;a href="http://librsync.sourceforge.net/"&gt;librsync&lt;/a&gt;, &lt;a href="http://duplicity.nongnu.org/"&gt;duplicity&lt;/a&gt;. All of them except librsync are Python-based, so they can be installed via 'python setup.py install'. For librsync you need to use './configure; make; make install'.&lt;br /&gt;&lt;br /&gt;3) Generated a GPG key pair using "gpg --gen-key". Made a note of the hex fingerprint of the key (you can list the fingerprints of your keys via "gpg --fingerprint").&lt;br /&gt;&lt;br /&gt;4) Wrote a simple boto-based Python script to create and list S3 buckets (the equivalent of directories in S3 parlance). Note that boto uses SSL, so your Python installation &lt;a href="http://agiletesting.blogspot.com/2008/05/compiling-python-25-with-ssl-support.html"&gt;needs to have SSL enabled&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's how the script looks:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;ACCESS_KEY_ID = 'theaccesskeyid'&lt;br /&gt;SECRET_ACCESS_KEY = 'thesecretaccesskey'&lt;br /&gt;&lt;br /&gt;from boto.s3.connection import S3Connection&lt;br /&gt;conn = S3Connection(ACCESS_KEY_ID, SECRET_ACCESS_KEY)&lt;br /&gt;buckets = [&lt;br /&gt;         'mybuckets_myserver_mysqldump',&lt;br /&gt;         'mybuckets_myserver_full',&lt;br /&gt;     ]&lt;br /&gt;for bucket in buckets:&lt;br /&gt; conn.create_bucket(bucket)&lt;br /&gt;rs = conn.get_all_buckets()&lt;br /&gt;print 'Bucket listing:'&lt;br /&gt;for b in rs:&lt;br /&gt; print b.name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5) Wrote a bash script (heavily influenced by Tim McCormack's post) that runs duplicity and backs up the root partition of my Linux server (minus some directories) to S3. The nice thing about duplicity is that it uses rsync, so it only transfers the diffs over the wire. Here's how my script looks like:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;export myEncryptionKeyFingerprint=somehexnumber&lt;br /&gt;export mySigningKeyFingerprint=somehexnumber&lt;br /&gt;export AWS_ACCESS_KEY_ID=accesskeyid&lt;br /&gt;export AWS_SECRET_ACCESS_KEY=secretaccesskey&lt;br /&gt;export PASSPHRASE=mypassphrase&lt;br /&gt;&lt;br /&gt;/usr/local/bin/duplicity --encrypt-key=$myEncryptionKeyFingerprint&lt;br /&gt;--sign-key=$mySigningKeyFingerprint --exclude=/sys --exclude=/dev&lt;br /&gt;--exclude=/proc --exclude=/tmp --exclude=/mnt --exclude=/media /&lt;br /&gt;s3+http://mybuckets_myserver_full&lt;br /&gt;&lt;br /&gt;export AWS_ACCESS_KEY_ID=&lt;br /&gt;export AWS_SECRET_ACCESS_KEY=&lt;br /&gt;export PASSPHRASE=&lt;br /&gt;&lt;/pre&gt;NOTE: duplicity will interactively prompt you for your GPG key's passphrase, unless you have a variable called PASSPHRASE that contains the passphrase. Since I wanted to run this script as a cron job, I chose the less secure way of specifying the passphrase in clear inside the script. YMMV.&lt;br /&gt;&lt;br /&gt;That's about it. Running the script produces an output such as this:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;--------------[ Backup Statistics ]--------------&lt;br /&gt;StartTime 1211482825.55 (Thu May 22 12:00:25 2008)&lt;br /&gt;EndTime 1211488426.17 (Thu May 22 13:33:46 2008)&lt;br /&gt;ElapsedTime 5600.62 (1 hour 33 minutes 20.62 seconds)&lt;br /&gt;SourceFiles 174531&lt;br /&gt;SourceFileSize 5080402735 (4.73 GB)&lt;br /&gt;NewFiles 174531&lt;br /&gt;NewFileSize 5080402735 (4.73 GB)&lt;br /&gt;DeletedFiles 0&lt;br /&gt;ChangedFiles 0&lt;br /&gt;ChangedFileSize 0 (0 bytes)&lt;br /&gt;ChangedDeltaSize 0 (0 bytes)&lt;br /&gt;DeltaEntries 174531&lt;br /&gt;RawDeltaSize 1200920038 (1.12 GB)&lt;br /&gt;TotalDestinationSizeChange 2702953170 (2.52 GB)&lt;br /&gt;Errors 0&lt;br /&gt;-------------------------------------------------&lt;br /&gt;&lt;/pre&gt;The first time you run the script it will take a while, but subsequent runs will only back up the files that were changed since the last run. For example, my second run transferred only 19.3 MB:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;--------------[ Backup Statistics ]--------------&lt;br /&gt;StartTime 1211529638.99 (Fri May 23 01:00:38 2008)&lt;br /&gt;EndTime 1211529784.18 (Fri May 23 01:03:04 2008)&lt;br /&gt;ElapsedTime 145.19 (2 minutes 25.19 seconds)&lt;br /&gt;SourceFiles 174522&lt;br /&gt;SourceFileSize 5084478500 (4.74 GB)&lt;br /&gt;NewFiles 64&lt;br /&gt;NewFileSize 2280357 (2.17 MB)&lt;br /&gt;DeletedFiles 28&lt;br /&gt;ChangedFiles 418&lt;br /&gt;ChangedFileSize 217974696 (208 MB)&lt;br /&gt;ChangedDeltaSize 0 (0 bytes)&lt;br /&gt;DeltaEntries 510&lt;br /&gt;RawDeltaSize 2465010 (2.35 MB)&lt;br /&gt;TotalDestinationSizeChange 20211663 (19.3 MB)&lt;br /&gt;Errors 0&lt;br /&gt;&lt;br /&gt;ASas&lt;br /&gt;-------------------------------------------------&lt;/pre&gt;To restore files from S3, you use duplicity and specify the source as s3+http://mybuckets_myserver_full and the destination as a local directory.&lt;br /&gt;&lt;br /&gt;Thanks to Tim McCormack for his detailed blog post, it made things so much easier than digging all this info by Google Fu.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/incremental-backups-to-amazon-s3.html' title='Incremental backups to Amazon S3'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=5724152665307800029' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/5724152665307800029/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5724152665307800029'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5724152665307800029'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-6228952258136536524</id><published>2008-05-19T14:25:00.001-07:00</published><updated>2008-05-19T14:32:01.201-07:00</updated><title type='text'>Compiling Python 2.5 with SSL support</title><content type='html'>If you compile Python 2.5.x from source, you need to jump through some hoops so that SSL support is enabled. Googling around, I found Patrick Altman's excellent &lt;a href="http://paltman.com/2007/11/15/getting-ssl-support-in-python-251/"&gt;blog post&lt;/a&gt; talking about this very issue.&lt;br /&gt;&lt;br /&gt;In my case, I needed to enable SSL support for Python 2.5.2 on CentOS 5.1. I already had the openssl development libraries installed:&lt;br /&gt;&lt;br /&gt;# yum list installed | grep ssl&lt;br /&gt;mod_ssl.i386                             1:2.2.3-11.el5_1.cento installed&lt;br /&gt;openssl.i686                             0.9.8b-8.3.el5_0.2     installed&lt;br /&gt;openssl-devel.i386                       0.9.8b-8.3.el5_0.2     installed&lt;br /&gt;&lt;br /&gt;Here's what I did next, following Patrick's post:&lt;br /&gt;&lt;br /&gt;1) edited Modules/Setup.dist from the Python 2.5.2 source distribution and made sure the correct lines were put back in (they were commented out by default):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;_socket socketmodule.c&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Socket module helper for SSL support; you must comment out the other&lt;br /&gt;# socket line above, and possibly edit the SSL variable:&lt;br /&gt;#SSL=/usr/local/ssl&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;_ssl _ssl.c \&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    -L$(SSL)/lib -lssl -lcrypto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2) ran ./configure; make; make install&lt;br /&gt;&lt;br /&gt;3) verified that I can access socket.ssl:&lt;br /&gt;&lt;br /&gt;# python2.5&lt;br /&gt;Python 2.5.2 (r252:60911, May 19 2008, 14:23:27)&lt;br /&gt;[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; import socket&lt;br /&gt;&gt;&gt;&gt; socket.ssl&lt;br /&gt;&lt;function&gt;function ssl at 0xb7ef410c&gt;&lt;br /&gt;&lt;br /&gt;That's it. Not sure why it's so non-intuitive though.&lt;/function&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/compiling-python-25-with-ssl-support.html' title='Compiling Python 2.5 with SSL support'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=6228952258136536524' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/6228952258136536524/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/6228952258136536524'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/6228952258136536524'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-1508452509221019277</id><published>2008-05-15T10:52:00.000-07:00</published><updated>2008-05-15T11:34:48.115-07:00</updated><title type='text'>Encrypting a Linux root partition with LUKS and DM-CRYPT</title><content type='html'>One of our customers needed to have his Linux laptop's root partition encrypted. We found a &lt;a href="http://musialek.org/?p=3"&gt;HOWTO&lt;/a&gt; on achieving this with RHEL5, and we adapted it for CentOS 5. The technique is based on &lt;a href="http://luks.endorphin.org/"&gt;LUKS&lt;/a&gt; and &lt;a href="http://www.saout.de/misc/dm-crypt/"&gt;DM-CRYPT&lt;/a&gt;. Kudos to my colleague Chris Evans for going through the exercise of getting this to work on CentOS 5 and for producing the documentation that follows, which I'm posting here hoping that it will benefit somebody at some point.&lt;br /&gt;&lt;br /&gt;* Boot off of a Live CD, I used Fedora Core 9 Preview&lt;br /&gt;* Find out which disk is which; for me /dev/sda was the external usb, and /dev/sdb was the internal&lt;pre&gt;sfdisk -d /dev/sdb | sfdisk /dev/sda&lt;br /&gt;pvcreate --verbose /dev/sda2&lt;br /&gt;vgextend --verbose VolGroup00 /dev/sda2&lt;br /&gt;pvmove --verbose /dev/sdb2 /dev/sda2 # This takes ages&lt;br /&gt;vgreduce --verbose VolGroup00 /dev/sdb2&lt;br /&gt;pvremove --verbose /dev/sdb2&lt;br /&gt;fdisk /dev/sdb&lt;br /&gt;&lt;/pre&gt;* Change the partition type to 83 for /dev/sdb2&lt;br /&gt;* Here is when you get to choose the password that will protect your partition:&lt;br /&gt;&lt;pre&gt;cryptsetup --verify-passphrase --key-size 256 luksFormat /dev/sdb2&lt;br /&gt;&lt;br /&gt;cryptsetup luksOpen /dev/sdb2 cryptroot&lt;br /&gt;pvcreate --verbose /dev/mapper/cryptroot&lt;br /&gt;vgextend --verbose VolGroup00 /dev/mapper/cryptroot&lt;br /&gt;pvmove --verbose /dev/sda2 /dev/mapper/cryptroot # This takes ages&lt;br /&gt;vgreduce --verbose VolGroup00 /dev/sda2&lt;br /&gt;pvremove --verbose /dev/sda2&lt;br /&gt;mkdir /mnt/tmp&lt;br /&gt;mount /dev/VolGroup00/LogVol00 /mnt/tmp&lt;br /&gt;cp -ax /dev/* /mnt/tmp/dev # I said no to overwriting any files&lt;br /&gt;chroot /mnt/tmp/&lt;br /&gt;(chroot) # mount -t proc proc /proc&lt;br /&gt;(chroot) # mount -t sysfs sysfs /sys&lt;br /&gt;(chroot) # mount /boot&lt;br /&gt;(chroot) # swapon -a&lt;br /&gt;(chroot) # vgcfgbackup&lt;/pre&gt;&lt;p&gt;For the initrd, the blog mentions /etc/sysconfig/mkinitrd as a file. CentOS had a directory, I tried doing their suggestion as a file in there, moving the directory out, and making the file as they suggested. Both failed. So I ran the following command: &lt;/p&gt; &lt;pre&gt;(chroot) # mkinitrd -v /boot/initrd-2.6.18-53.el5.crypt.img --with=aes --with=sha256 --with=dm-crypt 2.6.18-53.el5&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Now we need to modify the initrd so that it will decrypt the partition at boot time &lt;/p&gt; &lt;pre&gt;(chroot) # cd /boot&lt;br /&gt;(chroot) # mkdir /boot/initrd-2.6.18-53.el5.crypt.dir&lt;br /&gt;(chroot) # cd /boot/initrd-2.6.18-53.el5.crypt.dir&lt;br /&gt;(chroot) # gunzip &lt; ../initrd-2.6.18-53.el5.crypt.img | cpio -ivd &lt;/pre&gt;&lt;p&gt;Now, we need to modify init by adding the following lines after the line which reads “mkblkdevs” and before “echo Scanning and configuring dmraid supported devices.”: &lt;/p&gt; &lt;pre&gt;echo Decrypting root device&lt;br /&gt;cryptsetup luksOpen /dev/sda2 cryptroot&lt;br /&gt;echo Scanning logical volumes&lt;br /&gt;lvm vgscan --ignorelockingfailure&lt;br /&gt;echo Activating logical volumes&lt;br /&gt;lvm vgchange -ay --ignorelockingfailure vg00&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Copy cryptsetup and lvm to be put into the initrd, the blog doesn't mention it, but I'm sure it needs it. &lt;/p&gt; &lt;pre&gt;cp /sbin/cryptsetup bin/&lt;br /&gt;cp /sbin/lvm bin/&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Compress the new initrd &lt;/p&gt; &lt;pre&gt;find ./ | cpio -H newc -o | gzip -9 &gt; /boot/initrd-2.6.18-53.el5.crypt.img&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Modify the grub.conf. Copy the grub entry for the current kernel, and change as follows &lt;/p&gt; &lt;pre&gt;title Centos &lt;b&gt;Encrypted&lt;/b&gt; Server (2.6.18-53.1.4.el5)&lt;br /&gt;initrd /initrd-2.6.18-53.el5.&lt;b&gt;crypt&lt;/b&gt;.img&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Unmount the fs's in the chroot, and exit &lt;/p&gt; &lt;pre&gt;cd /&lt;br /&gt;umount /boot&lt;br /&gt;umount /proc&lt;br /&gt;umount /sys&lt;br /&gt;exit&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;NOTE: Don't upgrade the kernel without upgrading the initrd and grub.conf. &lt;/p&gt;&lt;p&gt;Reboot and test :)&lt;br /&gt;&lt;/p&gt;At this point you have an encrypted root partition. You should be prompted for a password during the boot process (the boot partition is not encrypted). If somebody steals your laptop, they won't be able to mount the root partition without knowing the password.&lt;br /&gt;&lt;p&gt;After you have crypto setup, you can find out information about it (such as the crypto algorithm used) via this command:&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;# cryptsetup luksDump /dev/sda2&lt;br /&gt;LUKS header information for /dev/sda2&lt;br /&gt;&lt;br /&gt;Version:        1&lt;br /&gt;Cipher name:    aes&lt;br /&gt;Cipher mode:    cbc-essiv:sha256&lt;br /&gt;Hash spec:      sha1&lt;br /&gt;Payload offset: 2056&lt;br /&gt;MK bits:        256&lt;br /&gt;MK digest:      af 2e e6 39 3e 79 60 bb 4a 2b 33 05 1c 86 3a 83 bc a0 ef c1&lt;br /&gt;MK salt:        79 b2 13 53 6f 52 72 a1 b5 3d dc d3 72 cd d6 f4&lt;br /&gt;               e3 25 3c 6e 08 00 f3 1d 44 1e 90 47 bc 43 e7 07&lt;br /&gt;MK iterations:  10&lt;br /&gt;UUID:           721abe52-5122-447b-8ed0-5ca3b2b32366&lt;br /&gt;&lt;br /&gt;Key Slot 0: ENABLED&lt;br /&gt;       Iterations:             247223&lt;br /&gt;       Salt:                   86 c7 53 6a 13 a9 77 81 89 ec 90 b3 e5 6a ea 8d&lt;br /&gt;                               da 0c 6f ad ec 3e 3c 47 2d 6e 5f 59 28 4e 7c 63&lt;br /&gt;       Key material offset:    8&lt;br /&gt;       AF stripes:             4000&lt;br /&gt;Key Slot 1: DISABLED&lt;br /&gt;Key Slot 2: DISABLED&lt;br /&gt;Key Slot 3: DISABLED&lt;br /&gt;Key Slot 4: DISABLED&lt;br /&gt;Key Slot 5: DISABLED&lt;br /&gt;&lt;/pre&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/encrypting-linux-root-partition-with.html' title='Encrypting a Linux root partition with LUKS and DM-CRYPT'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=1508452509221019277' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/1508452509221019277/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1508452509221019277'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1508452509221019277'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7663945367612013621</id><published>2008-05-08T17:16:00.000-07:00</published><updated>2008-05-12T14:16:22.443-07:00</updated><title type='text'>Notes from the latest SoCal Piggies meeting</title><content type='html'>...have been &lt;a href="http://python-groups.blogspot.com/2008/05/notes-from-socal-piggies-meeting-on-may.html"&gt;posted&lt;/a&gt; to the "Happenings in Python User groups" blog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Ben Bangert sent me the slides he used. You can download or view the PDF from &lt;a href="http://socal-piggies.org/presentations/ben_bangert/2008_05_01/Pylons.pdf"&gt;here&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/notes-from-latest-socal-piggies-meeting.html' title='Notes from the latest SoCal Piggies meeting'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7663945367612013621' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7663945367612013621/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7663945367612013621'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7663945367612013621'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7176615188103657724</id><published>2008-05-05T15:29:00.000-07:00</published><updated>2008-05-05T15:34:54.368-07:00</updated><title type='text'>Guido open sources Code Review app running on GAPE</title><content type='html'>Not sure why this wasn't publicized more, but Guido van Rossum announced today that he open sourced the code for &lt;a href="http://codereview.appspot.com"&gt;Code Review&lt;/a&gt;, a Google AppEngine app he released last week. Code Review is based on Mondrian, the internal code review tool that Guido wrote for Google. The relationship between the two apps in terms of features is: Code Review &lt; Mondrian.&lt;br /&gt;&lt;br /&gt;The code for Code Review is part of a Google code project called &lt;a href="http://code.google.com/p/rietveld/"&gt;Rietveld&lt;/a&gt;. I haven't looked at it yet, but I'll certainly do so soon, just to see the master's view on how to write a GAPE application.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/guido-open-sources-code-review-app.html' title='Guido open sources Code Review app running on GAPE'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7176615188103657724' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7176615188103657724/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7176615188103657724'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7176615188103657724'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-4147717348339647963</id><published>2008-05-05T14:07:00.000-07:00</published><updated>2008-05-05T14:11:56.157-07:00</updated><title type='text'>Ruby to Python bytecode compiler</title><content type='html'>&lt;a href="http://farmdev.com/thoughts/49/after-the-release-of-google-app-engine-the-rubyists-/"&gt;Kumar&lt;/a&gt; beat me to it, but I'll mention it here too: &lt;a href="http://whytheluckystiff.net/"&gt;Why the Lucky Stiff&lt;/a&gt; published a &lt;a href="http://github.com/why/unholy/tree/master"&gt;Ruby-to-Python-bytecode compiler&lt;/a&gt;, as well as tools to decompile the byte code into source code. According to the README file, he based his work on blog posts by &lt;a href="http://nedbatchelder.com/"&gt;Ned Batchelder&lt;/a&gt; related to dissecting Python bytecode. I wholeheartedly agree with Why's comment at the end of the README file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  You know, it's crazy that Python&lt;br /&gt; and Ruby fans find themselves&lt;br /&gt; battling so much.  While syntax&lt;br /&gt; is different, this exercise&lt;br /&gt; proves how close they are to&lt;br /&gt; each other!  And, yes, I like&lt;br /&gt; Ruby's syntax and can think much&lt;br /&gt; better in it, but it would be&lt;br /&gt; nice to share libs with Python&lt;br /&gt; folk and not have to wait forever&lt;br /&gt; for a mythical VM that runs all&lt;br /&gt; possible languages.&lt;/pre&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/05/ruby-to-python-bytecode-compiler.html' title='Ruby to Python bytecode compiler'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=4147717348339647963' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/4147717348339647963/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4147717348339647963'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4147717348339647963'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-2905170341532078423</id><published>2008-04-29T11:08:00.000-07:00</published><updated>2008-04-29T12:57:36.576-07:00</updated><title type='text'>Special guest for next SoCal Piggies meeting</title><content type='html'>We'll have the &lt;a href="http://socal-piggies.org/scp"&gt;SoCal Piggies&lt;/a&gt; meeting this Thursday May 1st at the &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Gorilla+Nation&amp;amp;sll=33.733477,-117.328491&amp;amp;sspn=3.001089,5.559082&amp;amp;ie=UTF8&amp;amp;ll=34.002866,-118.345413&amp;amp;spn=0.093497,0.173721&amp;amp;z=13&amp;amp;iwloc=A&amp;amp;om=0"&gt;Gorilla Nation office&lt;/a&gt; in Culver City. Our special guest will be &lt;a href="http://www.groovie.org/"&gt;Ben Bangert&lt;/a&gt;, the creator of &lt;a href="http://pylonshq.com/"&gt;Pylons&lt;/a&gt;, who will give us an introduction to his framework. We'll also have a presentation from Pablo Noego from Gorilla Nation on a chat application he wrote using Google App Engine. We'll probably also have an informal discussion on Python mock testing tools and techniques.&lt;br /&gt;&lt;br /&gt;BTW, I am putting together a Google code project for mock testing techniques in Python, in preparation for a presentation I would like to give to the group at some point. I called the project &lt;a href="http://code.google.com/p/moctep/"&gt;moctep&lt;/a&gt;, in honor of that ancient Egyptian deity, the protector of testers (or mockers, or maybe both). It doesn't have much so far, but there's some sample code you can browse through in the svn repository if you're curious. I'll be adding more meat to it soon.&lt;br /&gt;&lt;br /&gt;Anyway, if you're a Pythonista who happens to be in the L.A. area on Thursday, please consider attending our meeting. It will be lots of fun, guaranteed.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/special-guest-for-next-socal-piggies.html' title='Special guest for next SoCal Piggies meeting'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=2905170341532078423' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/2905170341532078423/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/2905170341532078423'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/2905170341532078423'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-5789133249506193540</id><published>2008-04-22T12:03:00.000-07:00</published><updated>2008-04-22T12:06:41.743-07:00</updated><title type='text'>"OLPC Automated Testing" project accepted for SoC</title><content type='html'>I'm happy to say that Zach Riggle's application for this year's Google Summer of Code, "&lt;a href="http://code.google.com/soc/2008/psf/appinfo.html?csaid=F89A4969030B59E6"&gt;OLPC Project Automated Testing&lt;/a&gt;", was accepted. I'm looking forward to mentoring Zach, and having Titus as a backup mentor. There's some very cool stuff that can be done in this area, and I hope that at the end of the summer we'll have some solid automated testing techniques and tools that can be applied to any Python project, not only to the OLPC Sugar environment. Stay tuned for more info on this project. BTW, here is the &lt;a href="http://code.google.com/soc/2008/psf/about.html"&gt;list of PSF-sponsored applications&lt;/a&gt; accepted for this years' SoC.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/olpc-automated-testing-project-accepted.html' title='&quot;OLPC Automated Testing&quot; project accepted for SoC'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=5789133249506193540' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/5789133249506193540/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5789133249506193540'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/5789133249506193540'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-8140015552038814154</id><published>2008-04-17T14:28:00.000-07:00</published><updated>2008-04-17T14:32:59.782-07:00</updated><title type='text'>Come work for RIS Technology</title><content type='html'>&lt;span style="font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: rgb(66, 65, 66);"&gt;We just posted this on craigslist, but it never hurts to blog about it too. If you're interested, send an email to techjobs at ristech.net. You and I might get to work together on the same team!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Open Source Tech Top Guns Wanted&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: rgb(66, 65, 66);"&gt;Are you a passionate Linux user? Are you running the latest Ubuntu alpha release on your laptop just because you can? Are you wired to the latest technologies -- things like Amazon EC2/S3 and Google AppEngine? Are you a virtuoso when it comes to virtualization (Xen/VMWare)?&lt;br /&gt;&lt;br /&gt;Do you program in Python? Do you take hard problems as personal challenges and don't give up until you solve them?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ristech.net"&gt; RIS Technology Inc.&lt;/a&gt; is a rapidly growing Los Angeles-based premium managed hosting provider that hosts and manages internet applications for medium to large size organizations nationwide. We have grown consistently at 100% each of the past four years and are currently hiring for additional growth at our corporate operations center near LAX, in Los Angeles, CA. We have immediate openings for dedicated and knowledgeable technology engineers. If the answer to the questions above is YES, then we'd like to extend an invitation to interview with us.&lt;br /&gt;&lt;br /&gt;We are an equal opportunity employer and have excellent benefits. We realize that one of the main things that makes us excellent are the people we choose to work with. We look for the best and brightest and our goal is to make work less "work" and more fun.&lt;/span&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/come-work-for-ris-technology.html' title='Come work for RIS Technology'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=8140015552038814154' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/8140015552038814154/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/8140015552038814154'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/8140015552038814154'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-1523522134437380032</id><published>2008-04-16T15:19:00.000-07:00</published><updated>2008-04-16T15:30:18.780-07:00</updated><title type='text'>Google App Engine feels constrictive</title><content type='html'>I've been toying a bit with &lt;a href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt;. I was lucky enough to score one of the 10,000 developer accounts. I first went through their tutorial, which was fine. Then I tried to port a simple application that I used to run from the command line, which queried a range of IP addresses for their reverse DNS names. No luck. I was using the &lt;a href="http://www.dnspython.org/"&gt;dnspython&lt;/a&gt; module, which in turn uses the Python socket module -- and socket is not available within the Google App Engine sandbox environment.&lt;br /&gt;&lt;br /&gt;Also, I was talking to Michał on rewriting the &lt;a href="http://mousebender.wordpress.com/2007/02/09/cheesecake-for-all/"&gt;Cheesecake service&lt;/a&gt; to run on Google App Engine, but he pointed out that cron jobs are not allowed, so that won't work either... It seems that with everything I've tried with GAE I've run into a wall so far. I know it's a 'paradigm change' for Web development, but still, I can't help wishing I had my favorite Python modules to play with.&lt;br /&gt;&lt;br /&gt;What has your experience been with GAE so far? I know &lt;a href="http://farmdev.com/"&gt;Kumar&lt;/a&gt; wrote a cool &lt;a href="http://farmdev.com/thoughts/44/pypi-cheeseshop-on-google-app-engine/"&gt;PyPI mirror in GAE&lt;/a&gt;, but I haven't seen many other 'real life' applications mentioned on Planet Python.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/google-app-engine-feels-constrictive.html' title='Google App Engine feels constrictive'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=1523522134437380032' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/1523522134437380032/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1523522134437380032'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1523522134437380032'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7658883971259092053</id><published>2008-04-11T14:07:00.000-07:00</published><updated>2008-04-11T14:17:41.030-07:00</updated><title type='text'>Ubuntu Gutsy woes with Intel 801 graphics card</title><content type='html'>I just upgraded my Dell Inspiron 6000 laptop to Ubuntu Gutsy last night. My graphics card is based on the Intel 810 chipset. After the upgrade, everything graphics-related was dog-slow. Scrolling in Firefox was choppy, IM-ing was choppy, even typing at the console was choppy. Surprisingly, I didn't find a lot of solutions to this problem. But many people on Ubuntu forums suggested disabling &lt;a href="https://help.ubuntu.com/community/CompositeManager"&gt;compiz/xgl&lt;/a&gt;, so that's what I ended up doing. In fact, I uninstalled all compiz and xgl-related packages, rebooted, and graphics became snappy again. Now back to trying to write an application to run on &lt;a href="http://blag.whit537.org/2008/04/simplates-biblical-greek-on-google-app.html"&gt;THE GOOGLE&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/ubuntu-gutsy-woes-with-intel-801.html' title='Ubuntu Gutsy woes with Intel 801 graphics card'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7658883971259092053' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7658883971259092053/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7658883971259092053'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7658883971259092053'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-1639169302906674601</id><published>2008-04-10T16:22:00.000-07:00</published><updated>2008-04-10T16:23:55.964-07:00</updated><title type='text'>Meme du jour: shell history</title><content type='html'>Here's mine from my Ubuntu laptop:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;$ history|awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head&lt;br /&gt;121 cd&lt;br /&gt;91 ssh&lt;br /&gt;82 ls&lt;br /&gt;46 vi&lt;br /&gt;28 python&lt;br /&gt;26 scp&lt;br /&gt;16 dig&lt;br /&gt;12 more&lt;br /&gt;7 twistd&lt;br /&gt;6 rm&lt;br /&gt;&lt;/pre&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/meme-du-jour-shell-history.html' title='Meme du jour: shell history'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=1639169302906674601' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/1639169302906674601/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1639169302906674601'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1639169302906674601'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-39140761307615214</id><published>2008-04-03T08:46:00.000-07:00</published><updated>2008-04-03T13:16:13.016-07:00</updated><title type='text'>Steve Loughran on 'Farms, Fabrics and Clouds'</title><content type='html'>Yesterday I and my colleagues at RIS Technology had the pleasure of attending a remote presentation given to us by &lt;a href="http://www.1060.org/blogxter/publish/5"&gt;Steve Loughran&lt;/a&gt;, who works as a researcher at HP Labs and is also a committer on the Ant project. I had seen Steve's slides from a &lt;a href="http://www.1060.org/blogxter/entry?publicid=23AE9FADDAE7A343528B4FAF6244949A"&gt;presentation&lt;/a&gt; he gave at the University of Bristol on 'Farms, Fabrics and Clouds' back in December 2007, and I have been pestering him via email ever since, hoping to have him release a screencast. After much back and forth, Steve offered to simply present for now directly to us via Skype. He did it out of the goodness of his heart, but both he and I realized that there's a nice little business opportunity in this type of presentation: you release the slides with no audio, then you get hired to present to interested parties in person, remotely, via Skype and a shared set of slides, with a Q&amp;amp;A session at the end. Everybody wins in this scenario. Filing it in the 'ideas worth trying' category.&lt;br /&gt;&lt;br /&gt;To come back to Steve's presentation -- here are the &lt;a href="http://people.apache.org/%7Estevel/slides/farms_fabrics_and_clouds.pdf"&gt;slides&lt;/a&gt; from a previous version. I hope he will soon post the updated version we saw yesterday, but the differences are not major. The co-author of the talk is Julio Guijarro. Their area of interest within HP Labs is the deployment of large applications across distributed resources and the management of these apps/resources with an eye to maximizing their output and minimizing their cost. A familiar (and hard) problem for everybody who works in the hosting industry.&lt;br /&gt;&lt;br /&gt;Steve talked about how the infrastructure architectures have changed over the years from a single web server talking to a single database server, to clustering, and finally to server farms and computing-on-demand. The challenge for us 'server farmers' is to figure a way to manage thousands of servers, heaps of storage, a myriad of network infrastructure devices, and large distributed applications on top of that -- all while keeping everything purring and happy, running to their maximum potential. Sounds impossible, but Amazon seems to be doing a decent job at it. And in fact Steve spent quite some time talking about how Amazon changed the game by their S3 and EC2 offerings. Even though they're not quite ready for prime time in terms of production deployments, Amazon will soon get there. As a proof, see their recent introduction of static IP addresses in EC2, and of the possibility of running your application in different data centers.&lt;br /&gt;&lt;br /&gt;In my opinion, the best of Steve's slides are the 'Assumptions that are now invalid' ones. They really turn the 'established facts and best practices' of infrastructure and application design on their heads. Here are some examples of assumptions that don't hold anymore in our day and time:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it is expensive to create, deploy and duplicate a new system, running a Linux image of your choice (see &lt;a href="http://www.instalinux.com/howto.php"&gt;Instalinux&lt;/a&gt; as a counter-example)&lt;/li&gt;&lt;li&gt;system failure is unusal and 100% availability can be achieved&lt;/li&gt;&lt;li&gt;databases are the best form of storage&lt;/li&gt;&lt;li&gt;you need physical access to the data center&lt;/li&gt;&lt;li&gt;a single server farm needs to scale to infinity&lt;/li&gt;&lt;/ul&gt;My other favorite part, which is not in the online slides yet, is the concept of '&lt;span style="font-weight: bold;"&gt;agile infrastructure&lt;/span&gt;'. I haven't seen this concept before applied to server hosting, but Steve has a great point here. If you look at something like Amazon EC2, where you can pay as you go, you can test you application in a smaller environment and then scale it up, you can move your application between data centers -- this is indeed an agile environment that also imposes some new demands on your application.&lt;br /&gt;&lt;br /&gt;I really recommend that you check out Steve's slides. There's a lot to chew on, but you can't afford not to chew on it, if you have anything to do with the IT industry these days.&lt;br /&gt;&lt;br /&gt;Here are a couple more links that might prove useful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wiki.smartfrog.org/wiki/display/sf/Anubis"&gt;Anubis&lt;/a&gt;: a tuple-space implementation that uses multicast to share information between hosts within a site&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smartfrog.org/"&gt;SmartFrog&lt;/a&gt;: a technology from HP used to distribute and manage applications (think &lt;a href="http://puppet.reductivelabs.com/"&gt;puppet&lt;/a&gt; but geared towards application deployment); see also &lt;a href="http://video.google.com/videoplay?docid=-4478242864801668108"&gt;Google video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Thanks again to Steve for presenting to us. Now, as a server farmer, I need to go back to my plow and try to improve it (maybe buy a tractor?)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Steve has some &lt;a href="http://www.1060.org/blogxter/entry?publicid=A4E44B16B7DFF9574F07795DC734C782&amp;amp;token="&gt;more thoughts on the Agile Infrastructure concept&lt;/a&gt;. Intriguing. This is something I'll definitely keep a very close eye on and tinker with.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/steve-loughran-on-farms-fabrics-and.html' title='Steve Loughran on &apos;Farms, Fabrics and Clouds&apos;'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=39140761307615214' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/39140761307615214/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/39140761307615214'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/39140761307615214'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-4722364007115444741</id><published>2008-04-02T15:11:00.001-07:00</published><updated>2008-04-02T15:13:57.529-07:00</updated><title type='text'>For you students interested in GSoC</title><content type='html'>If you're a student and you want to apply for a Python-related project for Google Summer of Code 2008, Matt Harrison has &lt;a href="http://panela.blog-city.com/gsoc_project_for_branch_coverage_reporting_for_python.htm"&gt;just the project for you&lt;/a&gt;. The project has to do with branch coverage analysis and reporting. Matt is willing to mentor too. It's a really good opportunity, so don't hesitate to apply. Hurry up though, the deadline is April 8th.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/for-you-students-interested-in-gsoc.html' title='For you students interested in GSoC'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=4722364007115444741' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/4722364007115444741/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4722364007115444741'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4722364007115444741'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-4096476391991893883</id><published>2008-04-01T08:00:00.000-07:00</published><updated>2008-04-01T08:05:54.312-07:00</updated><title type='text'>TurboGears and Pylons finally merging</title><content type='html'>This has been a long time coming, and fans of both projects have been eagerly waiting for it, but it's finally happened. Not sure if you've seen the announcements from Kevin Dangoor, Mark Ramm and Ben Bangert on their projects' mailing lists, but basically they boil down to "we feel like after the sprints at PyCon we made enough progress so that we can pull the trigger on merging the source code from the 2 projects in one common trunk." They make it sound like it was purely a technological problem, but I have my doubts about that. I think it was driven in part by the increasing popularity of Django. Unifying TurboGears and Pylons is a somewhat desperate measure to chip away at the Django market share. We'll see if it works or not. Check out the brand new page of the TurboPylons project.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/04/turbogears-and-pylons-finally-merging.html' title='TurboGears and Pylons finally merging'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=4096476391991893883' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/4096476391991893883/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4096476391991893883'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4096476391991893883'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-4034119983905010702</id><published>2008-03-31T10:15:00.000-07:00</published><updated>2008-03-31T10:24:27.560-07:00</updated><title type='text'>ReviewBoard: open source code review tool</title><content type='html'>Via Marc Hedlund's &lt;a href="http://radar.oreilly.com/archives/2008/03/review-board-is-good-software.html"&gt;post&lt;/a&gt; on O'Reilly Radar, here's an open source code review tool from VMWare:&lt;a href="http://review-board.org/"&gt; ReviewBoard&lt;/a&gt;. For all of us non-googlers out there, it's probably the next best thing to Guido's Mondrian (question: why has that tool not been released as open source?). Check out the sweet &lt;a href="http://flickr.com/photos/chipx86/sets/72157600297790516/detail/"&gt;screenshots&lt;/a&gt;. The kicker though is that &lt;a href="http://code.google.com/p/reviewboard/"&gt;it uses Python and Django&lt;/a&gt;. Way to go, VMWare!</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/03/reviewboard-open-source-code-review.html' title='ReviewBoard: open source code review tool'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=4034119983905010702' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/4034119983905010702/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4034119983905010702'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/4034119983905010702'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-1695291957816043153</id><published>2008-03-31T09:55:00.001-07:00</published><updated>2008-03-31T12:46:26.981-07:00</updated><title type='text'>Python code complexity metrics and tools</title><content type='html'>There's a buzz in the air around code complexity, metrics, code coverage, etc. It started with Matt Harrison's &lt;a href="http://panela.blog-city.com/pycon_2008_managing_complexity_slides.htm"&gt;PyCon presentation&lt;/a&gt;, then Ned Batchelder &lt;a href="http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html"&gt;jumped in&lt;/a&gt; with a nice McCabe &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;cyclomatic complexity&lt;/a&gt; computation/visualization tool, and now David Stanek posted about his &lt;a href="http://www.traceback.org/2008/03/31/measuring-cyclomatic-complexity-of-python-code/"&gt;pygenie&lt;/a&gt; tool -- which also measures the McCabe cyclomatic complexity of Python code. Now it's time to unify all these ideas in one powerful tool that computes not only complexity but also path or at least branch coverage. This would make a nice Google Summer of Code project. Too bad the deadline for 2008 GSoC applications is in 7 hours...Maybe for next year.&lt;br /&gt;&lt;br /&gt;Update: David Goodger left a comment pointing me to Martin Blais's &lt;a href="http://furius.ca/snakefood/"&gt;snakefood&lt;/a&gt; package, which computes and shows dependencies for your Python code. It's a good complement to the tools I mentioned above.</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/03/python-code-complexity-metrics-and.html' title='Python code complexity metrics and tools'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=1695291957816043153' title='7 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/1695291957816043153/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1695291957816043153'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/1695291957816043153'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-6977316933082901710</id><published>2008-03-28T10:59:00.000-07:00</published><updated>2008-03-28T11:05:37.823-07:00</updated><title type='text'>Recommended testing conference: CAST 2008</title><content type='html'>If you're a tester and are serious about learning and advancing in your trade, I warmly recommend the &lt;a href="http://www.associationforsoftwaretesting.org/drupal/CAST2008"&gt;CAST 2008&lt;/a&gt; conference which will be held in Toronto, July 14-16. The theme of the conference is "Beyond the Boundaries:  Interdisciplinary Approaches to Software Testing" and the keynote speaker is none other than &lt;a href="http://www.blogger.com/profile/05902673055244863609"&gt;Jerry Weinberg&lt;/a&gt;. And it's REALLY hard to get Jerry Weinberg to speak at a conference, so you might as well take advantage of this opportunity. For more details on CAST 2008, download the &lt;a href="http://www.associationforsoftwaretesting.org/drupal/files/CAST_Brochure.pdf"&gt;PDF brochure&lt;/a&gt;. &lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/03/recommended-testing-conference-cast.html' title='Recommended testing conference: CAST 2008'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=6977316933082901710' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/6977316933082901710/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/6977316933082901710'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/6977316933082901710'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-9238405.post-7113470616182713855</id><published>2008-03-28T10:24:00.000-07:00</published><updated>2008-03-28T10:41:33.304-07:00</updated><title type='text'>It's a good time to be a Python programmer</title><content type='html'>We had the SoCal Piggies meeting at the Disney Animation Studios last night. It was a great meeting -- great presentations from Disney engineers on how they use Python at Disney (and they use it A LOT!), great food, great turnout, and great atmosphere. Let me tell you -- the Disney Animation Studios are *lush*. Thanks to Paul Hildebrandt for organizing the meeting.&lt;br /&gt;&lt;br /&gt;I'll probably blog separately about the technical content of the presentations, but for now I just wanted to comment on the fact that everybody seems to be hiring Python programmers -- &lt;a href="http://gorillanation.com/"&gt;Gorilla Nation&lt;/a&gt; and &lt;a href="http://https://www.virgincharter.com/"&gt;Virgin Charter&lt;/a&gt; are just two companies in the L.A. area that are aggressively looking to hire Python talent. Another thing: we used to have difficulties in finding venues for our meetings. We used to meet at either USC or Caltech, and around 10-12 people max. would show up. Now companies are clamoring for organizing the meetings at their offices, and we have 20-30 people in the audience, with many new faces at every meeting. Even more: Ruby on Rails programmers are showing up at our meetings, looking for an opportunity to be more involved with Python!&lt;br /&gt;&lt;br /&gt;I take that as a sign that Python has arrived. It's a good time to be a Python programmer (or tester, for that matter.)</content><link rel='alternate' type='text/html' href='http://agiletesting.blogspot.com/2008/03/its-good-time-to-be-python-programmer.html' title='It&apos;s a good time to be a Python programmer'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9238405&amp;postID=7113470616182713855' title='9 Comments'/><link rel='replies' type='application/atom+xml' href='http://agiletesting.blogspot.com/feeds/7113470616182713855/comments/default' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7113470616182713855'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9238405/posts/default/7113470616182713855'/><author><name>Grig Gheorghiu</name><uri>http://www.blogger.com/profile/17863511617654196370</uri><email>noreply@blogger.com</email></author></entry></feed>