<?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>Musings of an Anonymous Geek</title>
	
	<link>http://www.protocolostomy.com</link>
	<description>Made with only the finest 1's and 0's</description>
	<lastBuildDate>Fri, 24 Feb 2012 19:10:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MusingsOfAnAnonymousGeek" /><feedburner:info uri="musingsofananonymousgeek" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>MusingsOfAnAnonymousGeek</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FMusingsOfAnAnonymousGeek" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMusingsOfAnAnonymousGeek" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/MusingsOfAnAnonymousGeek" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMusingsOfAnAnonymousGeek" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMusingsOfAnAnonymousGeek" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMusingsOfAnAnonymousGeek" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Sending Alerts With Graphite Graphs From Nagios</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/qlzG_1UziWY/</link>
		<comments>http://www.protocolostomy.com/2012/02/24/sending-alerts-with-graphite-graphs-from-nagios/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 19:08:36 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Hacks]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=959</guid>
		<description><![CDATA[Disclaimer The way I&#8217;m doing this relies on a feature I wrote for Graphite that was only recently merged to trunk, so at time of writing that feature isn&#8217;t in a stable release. Hopefully it&#8217;ll be in 0.9.10. Until then, you can at least test this setup using Graphite&#8217;s trunk version. Oh yeah, the new [...]]]></description>
			<content:encoded><![CDATA[<h2 id="SendingAlertsWithGraphiteGraphsFromNagios-DefiningContacts">Disclaimer</h2>
<p>The way I&#8217;m doing this relies on a feature I wrote for Graphite that was only recently merged to trunk, so at time of writing that feature isn&#8217;t in a stable release. Hopefully it&#8217;ll be in 0.9.10. Until then, you can at least test this setup using Graphite&#8217;s trunk version.</p>
<p>Oh yeah, the new feature is the ability to send graph images (not links) via email. I surfaced this feature in Graphite through the graph menus that pop up when you click on a graph in Graphite, but implemented it such that it&#8217;s pretty easy to call from a script (which I also wrote &#8211; you&#8217;ll see if you read the post).</p>
<p>Also, note that I assume you already know Nagios, how to install new command scripts, and all that. It&#8217;s really easy to figure this stuff out in Nagios, and it&#8217;s well-documented elsewhere, so I don&#8217;t cover anything here but the configuration of this new feature.</p>
<h2>The Idea</h2>
<p>I&#8217;m not a huge fan of Nagios, to be honest. As far as I know, nobody really is. We all just use it because it&#8217;s there, and the alternatives are either overkill, unstable, too complex, or just don&#8217;t provide much value for all the extra overhead that comes with them (whether that&#8217;s config overhead, administrative overhead, processing overhead, or whatever depends on the specific alternative you&#8217;re looking at). So&#8230; Nagios it is.</p>
<p>One thing that *is* pretty nice about Nagios is that configuration is really dead simple. Another thing is that you can do pretty much whatever you want with it, and write code in any language you want to get things done. We&#8217;ll take advantage of these two features to actually do a couple of things:</p>
<ul>
<li>Monitor a metric by polling Graphite for it directly</li>
<li>Tell Nagios to fire off a script that&#8217;ll go get the graph for the problematic metric, and send email with the graph embedded in it to the configured contacts.</li>
<li>Record that we sent the alert back in Graphite, so we can overlay those events on the corresponding metric graph and verify that alerts are going out when they should, that the outgoing alerts are hitting your phone without delay, etc.</li>
</ul>
<h2>The Candy</h2>
<p>Just to be clear, we&#8217;re going to set things up so you can get alert messages from Nagios that look like this (click to enlarge):</p>
<p><a href="http://www.protocolostomy.com/wp-content/uploads/2012/02/iphone-graphite.png"><img class="alignnone size-medium wp-image-961" title="iphone-graphite" src="http://www.protocolostomy.com/wp-content/uploads/2012/02/iphone-graphite-200x300.png" alt="" width="200" height="300" /></a></p>
<p>And you&#8217;ll also be able to track those alert events in Graphite in graphs that look like this (click to enlarge, and note the vertical lines &#8211; those are the alert events.):</p>
<p><a href="http://www.protocolostomy.com/wp-content/uploads/2012/02/overlay-alert-events1.png"><img class="alignnone size-medium wp-image-963" title="overlay-alert-events" src="http://www.protocolostomy.com/wp-content/uploads/2012/02/overlay-alert-events1-300x171.png" alt="" width="300" height="171" /></a></p>
<h2>Defining Contacts</h2>
<p>In production, it&#8217;s possible that the proper contacts and contact groups already exist. For testing (and maybe production) you might find that you want to limit who receives graphite graphs in email notifications. To test things out, I defined:</p>
<ul>
<li>A new contact template that&#8217;s configured specifically to receive the graphite graphs. Without this, no graphs.</li>
<li>A new contact that uses the template</li>
<li>A new contact group containing said contact.</li>
</ul>
<p>For testing, you can create a test contact in templates.cfg:</p>
<div>
<div>
<div>
<div id="highlighter_615404">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define contact{</code></div>
<div><code>        </code><code>name                            graphite-contact </code></div>
<div><code>        </code><code>service_notification_period     24x7            </code></div>
<div><code>        </code><code>host_notification_period        24x7 </code></div>
<div><code>        </code><code>service_notification_options    w,u,c,r,f,s </code></div>
<div><code>        </code><code>host_notification_options       d,u,r,f,s  </code></div>
<div><code>        </code><code>service_notification_commands   notify-svcgraph-by-email</code></div>
<div><code>        </code><code>host_notification_commands      notify-host-by-email</code></div>
<div><code>        </code><code>register                        </code><code>0</code></div>
<div><code>        </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>You&#8217;ll notice a few things here:</p>
<ul>
<li>This is not a contact, only a template.</li>
<li>Any contact defined using this template will be notified of <strong>service</strong> issues with the command &#8216;notify-svcgraph-by-email&#8217;, which we&#8217;ll define in a moment.</li>
</ul>
<p>In contacts.cfg, you can now define an individual contact that uses the graphite-contact template we just assembled:</p>
<div>
<div>
<div>
<div id="highlighter_781276">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define contact{</code></div>
<div><code>        </code><code>contact_name    graphiteuser</code></div>
<div><code>        </code><code>use             graphite-contact </code></div>
<div><code>        </code><code>alias           Graphite User</code></div>
<div><code>        </code><code>email           someone</code><code>@example</code><code>.com </code></div>
<div><code>        </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>Of course, you&#8217;ll want to change the &#8216;email&#8217; attribute here, even for testing.</p>
<p>Once done, you also want to have a contact group set up that contains this new &#8216;graphiteuser&#8217;, so that you can add users to the group to expand the testing, or evolve things into production. This is also done in contacts.cfg:</p>
<div>
<div>
<div>
<div id="highlighter_342288">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define contactgroup{</code></div>
<div><code>        </code><code>contactgroup_name       graphiteadmins</code></div>
<div><code>        </code><code>alias                   Graphite Administrators</code></div>
<div><code>        </code><code>members                 graphiteuser</code></div>
<div><code>        </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<h2 id="SendingAlertsWithGraphiteGraphsFromNagios-DefiningaService">Defining a Service</h2>
<p>Also for testing, you can set up a test service, necessary in this case to bypass default settings that seek to <strong>not</strong> bombard contacts by sending an email for every single aberrant check. Since the end result of this test is to see an email, we want to get an email for every check where the values are in any way out of bounds. In templates.cfg put this:</p>
<div>
<div>
<div>
<div id="highlighter_429252">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define service{</code></div>
<div><code>    </code><code>name                        test-service</code></div>
<div><code>    </code><code>use                         generic-service</code></div>
<div><code>    </code><code>passive_checks_enabled      </code><code>0</code></div>
<div><code>    </code><code>contact_groups              graphiteadmins</code></div>
<div><code>    </code><code>check_interval              </code><code>20</code></div>
<div><code>    </code><code>retry_interval              </code><code>2</code></div>
<div><code>    </code><code>notification_options        w,u,c,r,f</code></div>
<div><code>    </code><code>notification_interval       </code><code>30</code></div>
<div><code>    </code><code>first_notification_delay    </code><code>0</code></div>
<div><code>    </code><code>flap_detection_enabled      </code><code>1</code></div>
<div><code>    </code><code>max_check_attempts          </code><code>2</code></div>
<div><code>    </code><code>register                    </code><code>0</code></div>
<div><code>    </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>Again, the key point here is to insure that <strong>no</strong> notifications are ever silenced, deferred, or delayed by nagios in any way, for any reason. You probably don&#8217;t want this in production. The other point is that when you set up an alert for a service that uses &#8216;test-service&#8217; in its definition, the alerts will go to our previously defined &#8216;graphiteadmins&#8217;.</p>
<p>To make use of this service, I&#8217;ve defined a service in &#8216;localhost.cfg&#8217; that will require further explanation, but first let&#8217;s just look at the definition:</p>
<div>
<div>
<div>
<div id="highlighter_533070">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define service{</code></div>
<div><code>        </code><code>use                             test-service </code></div>
<div><code>        </code><code>host_name                       localhost</code></div>
<div><code>        </code><code>service_description             Some Important Metric</code></div>
<div><code>        </code><code>_GRAPHURL           </code><code>"<a href="http://graphite01.scs.myyearbook.com/render?width=800&amp;from=-1hours&amp;until=now&amp;target=derivative(myyearbook.mobile.MobileBugReports.ConnectException.Reports.bug.crashreports)">http://graphite.example.com/render?width=800&amp;from=-1hours&amp;until=now&amp;target=graphite.path.to.target"</a></code></div>
<div><code>        </code><code>check_command                   check_graphite_data!</code><code>24</code><code>!</code><code>36</code></div>
<div><code>        </code><code>notifications_enabled           </code><code>1</code></div>
<div><code>        </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>There are two new things we need to understand when looking at this definition:</p>
<ul>
<li>What is &#8216;check_graphite_data&#8217;?</li>
<li>What is &#8216;_GRAPHURL&#8217;?</li>
</ul>
<p>These questions are answered in the following section.</p>
<p>In addition, you should know that the value for _GRAPHURL is intended to come straight from the Graphite dashboard. Go to your dashboard, pick a graph of a single metric, grab the URL for the graph, and paste it in (and double-quote it).</p>
<h2 id="SendingAlertsWithGraphiteGraphsFromNagios-DefiningthecheckgraphitedataCommand">Defining the &#8216;check_graphite_data&#8217; Command</h2>
<p>This command relies on a small script written by the folks at Etsy, which can be found on github: <a href="https://github.com/etsy/nagios_tools/blob/master/check_graphite_data" rel="nofollow">https://github.com/etsy/nagios_tools/blob/master/check_graphite_data</a></p>
<p>Here&#8217;s the commands.cfg definition for the command:</p>
<div>
<div>
<div>
<div id="highlighter_773344">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code># </code><code>'check_graphite_data'</code> <code>command definition</code></div>
<div><code>define command{</code></div>
<div><code>        </code><code>command_name    check_graphite_data</code></div>
<div><code>        </code><code>command_line    $USER1$/check_graphite_data -u $_SERVICEGRAPHURL$ -w $ARG1$ -c $ARG2$</code></div>
<div><code>        </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>The &#8216;command_line&#8217; attribute calls the check_graphite_data script we got on github earlier. The &#8216;-u&#8217; flag is a URL, and this is actually using the custom object attribute &#8216;_GRAPHURL&#8217; from our service definition. You can see more about custom object variables here: <a href="http://nagios.sourceforge.net/docs/3_0/customobjectvars.html" rel="nofollow">http://nagios.sourceforge.net/docs/3_0/customobjectvars.html</a> - the short story is that, since we defined _GRAPHURL in a service definition, it gets prepended with &#8216;SERVICE&#8217;, and the underscore in &#8216;_GRAPHURL&#8217; moves to the front, giving you &#8216;$_SERVICEGRAPHURL&#8217;. More on how that works at the link provided.</p>
<p>The &#8216;-w&#8217; and &#8216;-c&#8217; flags to check_graphte_data are &#8216;warning&#8217; and &#8216;critical&#8217; thresholds, respectively, and they correlate to the positions of the service definition&#8217;s &#8216;check_command&#8217; arguments (so, check_graphite_data!24!36 maps to &#8216;check_graphite_data -u &lt;url&gt; -w 24 -c 36&#8242;)</p>
<h2 id="SendingAlertsWithGraphiteGraphsFromNagios-Definingthenotify-svcgraph-by-emailCommand">Defining the &#8216;notify-svcgraph-by-email&#8217; Command</h2>
<p>This command relies on a script that I wrote in Python called &#8216;sendgraph.py&#8217;, which also lives in github: <a href="https://gist.github.com/1902478">https://gist.github.com/1902478</a></p>
<p>The script does two things:</p>
<ul>
<li>It emails the graph that corresponds to the metric being checked by Nagios, and</li>
<li>It pings back to graphite to record the alert itself as an event, so you can define a graph for, say, &#8216;Apache Load&#8217;, and if you use this script to alert on that metric, you can also overlay the alert events on top of the &#8216;Apache Load&#8217; graph, and vet that alerts are going out when you expect. It&#8217;s also a good test to see that you&#8217;re actually getting the alerts this script tries to send, and that they&#8217;re not being dropped or seriously delayed.</li>
</ul>
<p>To make use of the script in nagios, lets define the command that actually sends the alert:</p>
<div>
<div>
<div>
<div id="highlighter_982380">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div title="Hint: double-click to select code">
<div><code>define command{</code></div>
<div><code>    </code><code>command_name    notify-svcgraph-by-email</code></div>
<div><code>    </code><code>command_line    /path/to/sendgraph.py -u </code><code>"$_SERVICEGRAPHURL$"</code> <code>-t $CONTACTEMAIL$ -n </code><code>"$SERVICEDESC$"</code> <code>-s $SERVICESTATE$</code></div>
<div><code>    </code><code>}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<p>A couple of quick notes:</p>
<ul>
<li>Notice that you need to double-quote any variables in the &#8216;command_line&#8217; that might contain spaces.</li>
<li>For a definition of the command line flags, see sendgraph.py&#8217;s &#8211;help output.</li>
<li>Just to close the loop, note that notify-svcgraph-by-email is the &#8216;service_notification_commands&#8217; value in our initial contact template (the very first listing in this post)</li>
</ul>
<h2 id="SendingAlertsWithGraphiteGraphsFromNagios-FireItUp">Fire It Up</h2>
<p>Fire up your Nagios daemon to take it for a spin. For testing, make sure you set the check_graphite_data thresholds to numbers that are pretty much guaranteed to trigger an alert when Graphite is polled. Hope this helps! If you have questions, first make sure you&#8217;re using Graphite&#8217;s &#8216;trunk&#8217; branch, and not 0.9.9, and then give me a shout in the comments.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/tiGZTwH8LkVwtBpQr0Bgc0vUG2A/0/da"><img src="http://feedads.g.doubleclick.net/~a/tiGZTwH8LkVwtBpQr0Bgc0vUG2A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tiGZTwH8LkVwtBpQr0Bgc0vUG2A/1/da"><img src="http://feedads.g.doubleclick.net/~a/tiGZTwH8LkVwtBpQr0Bgc0vUG2A/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=qlzG_1UziWY:-xKwpG2xT5k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=qlzG_1UziWY:-xKwpG2xT5k:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=qlzG_1UziWY:-xKwpG2xT5k:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=qlzG_1UziWY:-xKwpG2xT5k:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/qlzG_1UziWY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2012/02/24/sending-alerts-with-graphite-graphs-from-nagios/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2012/02/24/sending-alerts-with-graphite-graphs-from-nagios/</feedburner:origLink></item>
		<item>
		<title>The Python User Group in Princeton (PUG-IP): 6 months in</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/7DD5t7QqiRo/</link>
		<comments>http://www.protocolostomy.com/2011/11/02/the-python-user-group-in-princeton-pug-ip-6-months-in/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 04:08:40 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Big Ideas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=956</guid>
		<description><![CDATA[In May, 2011, I started putting out feelers on Twitter and elsewhere to see if there might be some interest in having a Python user group that was not in Philadelphia or New York City. A single tweet resulted in 5 positive responses, which I took as a success, given the time-sensitivity of Twitter, my [...]]]></description>
			<content:encoded><![CDATA[<p>In May, 2011, I started putting out feelers on Twitter and elsewhere to see if there might be some interest in having a Python user group that was not in Philadelphia or New York City. A single tweet resulted in 5 positive responses, which I took as a success, given the time-sensitivity of Twitter, my &#8220;reach&#8221; on Twitter (which I assume is far smaller than what might be the entire target audience for that tweet), etc.</p>
<p>Happy with the responses I received, I still wanted to take a baby step in getting the group started. Rather than set up a web site that I&#8217;d then have to maintain, a mailing list server, etc., I went to the cloud. I started a <a href="http://meetup.com/pug-ip">group on meetup.com</a>, and started looking for places to hold our first meeting.</p>
<h3>Meetup.com</h3>
<p>Meetup.com, I&#8217;m convinced, gives you an enormous value if you&#8217;re looking to start a user group Right Now, Today™. For $12/mo., you get a place where you can announce future meetups, hold discussions, collect RSVPs so you have a head count for food or space or whatever, and vendors can also easily jump in to provide sponsorship or &#8216;perks&#8217; in the form of discounts on services to user group members and the like. It&#8217;s a lot for a little, and it&#8217;s worked well enough. If we had to stick with it for another year, I&#8217;d have no real issue with that.</p>
<h3>Google Groups</h3>
<p>I set up a mailing list using Google Groups about 2-3 months ago now. I only waited so long because I thought meetup.com&#8217;s discussion forum might work for a while. After a few meetings, though, I noticed that there were always about five more people in attendance than had RSVP&#8217;d on meetup.com. Some people just aren&#8217;t going to be bothered with having yet another account on yet another web site I guess. If that&#8217;s the case, then I have two choices (maybe more, but these jumped to mind): force the issue by constantly trumpeting meetup.com&#8217;s service, or go where everyone already was. Most people have a Google account, and understand its services. Also, since the group is made up of technical people, they mostly like the passive nature of a mailing list as opposed to web forums.</p>
<p>If you&#8217;re setting up a group, I&#8217;d say that setting up a group on meetup.com and simultaneously setting up a Google group mailing list is the way to go if you want to get a fairly complete set of services for very little money and about an hour&#8217;s worth of time.</p>
<h3>Meeting Space</h3>
<p>Meeting space can come from a lot of different places, but I had a bit of trouble settling on a place at first. Princeton University is an awesome place and has a ton of fantastic places to meet with people, but if you&#8217;re not living on campus (almost no students are group members, btw), parking can be a bit troublesome, and Princeton University is famous for having little or no signage, and that includes building names, so finding where to go even if you did find parking can be problematic. So, so far, the University is out.</p>
<p>The only sponsor I had that was willing to provide space was my employer, but we&#8217;re nowhere near Princeton, and don&#8217;t really have the space. Getting a sponsor for space can be a bit difficult when your group doesn&#8217;t exist yet, in part because none of them have engaged with you or your group until the first meeting, when the attendees, who all work for potential sponsors, show up.</p>
<p>I started looking at the web site for the <a href="http://www.princeton.lib.nj.us/">Princeton Public Library</a>. I&#8217;ve been involved in the local Linux user group for several years, and they use free meeting space made available by the public library in Lawrenceville, which borders Princeton. I wondered if the Princeton Public Library did this as well, but they don&#8217;t, actually. In fact, meeting space at that location can get pretty expensive, since they charge for the space and A/V equipment like projectors and stuff separately (or they did when I started the group &#8211; I believe it&#8217;s still the case).</p>
<p>I believe I tweeted my disappointment about the cost of meeting at the Princeton Public Library, and did a callout on Twitter for space sponsors and other ideas about meeting space in or near Princeton. The Princeton Public Library got in touch through their @PrincetonPL Twitter account, and we were able to work out a really awesome deal where they became a sponsor, and agreed to host our group for 6 months, free of charge. Awesome!</p>
<p>Now, six months in, we either had to come to some other agreement with the library, or move on to a new space. After six months, it&#8217;s way easier to find space, or sponsors who might provide space, but I felt if we could find some way to continue the relationship with the library, it&#8217;d be best not to relocate the group. We wound up finding a deal that does good things for the group, the library, the local Python user community, and the evangelism of the Python language&#8230;.</p>
<h3>Knowledge for Space</h3>
<p>Our group got a few volunteers together to commit to providing a 5-week training course to the public, held at the Princeton Public Library. Adding public offerings like this adds value to the library, attracts potential new members (they&#8217;re a member-supported library, not a state/municipality-funded one), etc. In exchange for providing this service to the library, the library provides us with free meeting space, including the A/V equipment.</p>
<p>If you don&#8217;t happen to have a public library that offers courses, seminars, etc., to the general public, you might be able to cut a similar deal with a local community college, or even high school. If you know of a corporation locally that uses Python or some other technology the group can speak or train people in, you might be able to trade training for meeting space in their offices. Training is a valued perk to the employees of most corporations.</p>
<h3>How To Get Talks (or &#8220;How we stopped caring about getting talks&#8221;)</h3>
<p>Whether you&#8217;re running a publishing outfit, a training event, or user group, getting people to deliver content is a challenge. Some people don&#8217;t think they have any business talking to what they perceive as a roomful of geniuses about anything. Some just aren&#8217;t comfortable talking in front of audiences, but are otherwise convinced of their own genius. Our group is trying to attack this issue in various ways, and so far it seems to be working well enough, though more ideas are welcome!</p>
<p>Basically, the group isn&#8217;t necessarily locked into traditions like &#8220;Thou shalt provide a speaker, who shalt bequeath upon our many wisdom of the ages&#8221;. Once you&#8217;ve decided as a group that having cookie-cutter meetings isn&#8217;t necessary, you start to think of all sorts of things you could all be doing together.</p>
<p>Below are some ideas, some in the works, some in planning, that I hope help other would-be group starters to get the ball rolling, and keep it in motion!</p>
<h3>Projects For the Group, By the Group</h3>
<p>Some members of PUG-IP are working together on building the pugip.org website, which is housed in a GitHub repository under the <a href="https://github.com/pugip">&#8216;pugip&#8217; GitHub organization</a>. This one project will inevitably result in all kinds of home-grown presentations &amp; events within the group. As new ideas come up and new features are implemented, people will give lightning talks about their implementation, or we&#8217;ll do a group peer review of the code, or we&#8217;ll have speakers give talks about third-party technologies we might use (so, we might have two speakers each give a 30-minute talk about two different NoSQL solutions, for example. We&#8217;ve already had a great overview of about 10 different Python micro-frameworks), etc.</p>
<p>We may also decide to break up into pairs, and then sprint together on a set of features, or a particularly large feature, or something like that.</p>
<p>As of now, we&#8217;ve made enough decisions as a group to get the ball rolling. If there&#8217;s any interest I can blog about the setup that allows the group to easily share, review, and test code, provide live demos of their work, etc. The tl;dr version is we use GitHub and free heroku accounts, but new ideas come into play all the time. Just today I was wondering if we could, as a group, make use of the cloud9 IDE (http://cloud9ide.com).</p>
<p>The website is a great idea, but other group projects are likely to come up.</p>
<h3>Community Outreach</h3>
<p>PUG-IPs first official community outreach project will be the training we provide through the Princeton Public library. A few of us will collaborate on delivering the training, but the rest of the group will be involved in providing feedback on various aspects of the material, etc., so it&#8217;s a &#8216;whole group&#8217; project, really. On top of increasing interactivity among the group members, outreach is also a great way to grow and diversify the group, and perhaps gain sponsorships as well!</p>
<p>There&#8217;s another area group called <a href="http://lugip.org">LUG-IP</a> (a Linux user group) that also does some community outreach through a hardware SIG (special interest group), certification training sessions, and participating in local computing events and conferences. I&#8217;d like to see PUG-IP do this, too, maybe in collaboration with the LUG (they&#8217;re a good and passionate group of technologists).</p>
<p>Community outreach can also mean teaming up with various other technology groups, and one event I&#8217;m really looking forward to is a RedSnake meeting to be held next February. A RedSnake meeting is a combined meeting between <a href="http://www.meetup.com/phillypug/">PhillyPUG</a> (the Philadelphia Python User Group) and <a href="http://phillyrb.org/">Philly.rb</a> (the Philadelphia Ruby Group). As a member of PhillyPUG I participated in last year&#8217;s RedSnake meeting, and it was a fantastic success. Probably 70+ people in attendance (<a href="http://twitpic.com/3xv2fi">here&#8217;s a pic</a> at the end &#8211; some had already left by the time someone snapped this), and perhaps 10 or so lightning talks given by members of both organizations. We tried to do a &#8216;matching&#8217; talk agenda at the meeting, so if someone on the Ruby side did a testing talk, we followed that with a Python testing talk, etc. It was a ton of fun, and the audience was amazing.</p>
<h3>Socials</h3>
<p>Socials don&#8217;t have to be dedicated events, per se. For example, PUG-IP has a sort of mini-social after every single meetup. We&#8217;re lucky to have our meetings located about a block away from a brewpub, so after each meeting, perhaps half of us make it over for a couple of beers and some great conversations. After a few of these socials, I started noticing that more talk proposals started to spring up.</p>
<p>Of course, socials can also be dedicated events. Maybe some day PUG-IP will&#8230;. I dunno&#8230; go bowling? Or maybe we&#8217;ll go as a group to see the next big geeky movie that comes out. Maybe we&#8217;ll have some kind of all-inclusive, bring-the-kids BBQ next summer. Who knows?</p>
<p>As a sort of sideshow event to the main LUG meetings, LUG-IP has a regularly-scheduled <a href="http://lugip.org/node/326">&#8216;coffee klatch&#8217;</a>. Some of the members meet up one Sunday per month at (if memory serves) 8-11AM at a local Panera for coffee, pastries, and geekery. It&#8217;s completely informal, but it&#8217;s a good time.</p>
<h3>Why Not Having Talks Will Help You Get Talks</h3>
<p>I have a theory that is perhaps half-proven through my experiences with technology user groups: increasing engagement among and between the members of the group in a way that doesn&#8217;t shine a huge floodlight on a single individual (like a talk would) eventually breaks down whatever fears or resistance there is to proposing and giving a talk. Sometimes it&#8217;s just a comfort level thing, and working on projects, or having a beer, or sprinting on code, etc. &#8212; together &#8212; turns a &#8220;talking in front of strangers&#8221; experience into more of a &#8220;sharing with my buddies&#8221; one.</p>
<p>I hope that&#8217;s true, anyway. It seems to be. <img src='http://www.protocolostomy.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Thanks For Reading</h3>
<p>I hope someone finds this useful. It&#8217;s early on in the life of PUG-IP, but I thought it would be valuable to get these ideas out into the ether early and often before they slip from my brain. Good luck with your groups!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/F2SmNkigyfIM0InR0oG1IbbdYAQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/F2SmNkigyfIM0InR0oG1IbbdYAQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/F2SmNkigyfIM0InR0oG1IbbdYAQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/F2SmNkigyfIM0InR0oG1IbbdYAQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=7DD5t7QqiRo:D-tl_omzZNc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=7DD5t7QqiRo:D-tl_omzZNc:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=7DD5t7QqiRo:D-tl_omzZNc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=7DD5t7QqiRo:D-tl_omzZNc:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/7DD5t7QqiRo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2011/11/02/the-python-user-group-in-princeton-pug-ip-6-months-in/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2011/11/02/the-python-user-group-in-princeton-pug-ip-6-months-in/</feedburner:origLink></item>
		<item>
		<title>The Happy Idiot</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/hnTj2gl0bdM/</link>
		<comments>http://www.protocolostomy.com/2011/11/01/the-happy-idiot/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 04:13:55 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Big Ideas]]></category>
		<category><![CDATA[Me stuff]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=952</guid>
		<description><![CDATA[Today is November 1st, and there&#8217;s an event that takes place every November called National Novel Writing Month (NaNoWriMo). I don&#8217;t believe I have the ability to really write a novel, and have no reason to think anyone would read it if I did. But I would like to make an attempt to write a [...]]]></description>
			<content:encoded><![CDATA[<p>Today is November 1st, and there&#8217;s an event that takes place every November called National Novel Writing Month (NaNoWriMo). I don&#8217;t believe I have the ability to really write a novel, and have no reason to think anyone would read it if I did. But I would like to make an attempt to write a blog post every day this month, and this month&#8217;s post is about The Happy Idiot. Hope you enjoy it and leave comments.</p>
<p>Who is the happy idiot? It&#8217;s the person in class who shrugs off fears of looking dopy and raises their hand. It&#8217;s the person who, in an architecture meeting, isn&#8217;t afraid to be wrong in asserting that a new bottleneck is quickly emerging in the design. It&#8217;s the person who gives presentations on topics they&#8217;re really only 75% comfortable with, and announces as much to the audience, inviting corrections and more input. It&#8217;s the person who invites feedback and asks questions that seem trivial, even if it exposes their ignorance.</p>
<p>We need more happy idiots.</p>
<p>I wholeheartedly accept this role, even though there are circumstances where it might be easier to keep my mouth shut and keep up appearances or it might seem beneficial to not put a dent in some perceived reputation or something like that. The problem I have with doing that is that appearances are, in my experience, largely bullshit. Reputation, in my experience, comes from doing, not from merely being perceived as smart, or good, or whatever. Execute. The rest comes from that.</p>
<p>Furthermore, once you enter the realm of keeping up appearances, you wind up in this horrible vicious cycle where eventually you just always have to clam up to seem smart about everything. Purposefully keeping quiet when you have no idea what&#8217;s going on &#8211; indeed, *because* you have no idea what&#8217;s going on is a close relative to lying, and has the same consequences. Eventually you&#8217;ll be cornered to execute and you&#8217;ll have no idea what to do. The fear that this will happen will eventually take over your waking hours, causing stress, and it&#8217;s all downhill from there.</p>
<p>On the other hand, being the happy idiot means filling in the cracks in your knowledge. It means you&#8217;re conscious of your own ignorance. It means you&#8217;ll be able to execute more effectively. This starts a positive cycle: you learn more, you execute more effectively, you begin to be perceived as smart, good, whatever, and it&#8217;s not completely unwarranted, because you&#8217;ve actually asked questions that took guts to ask and as a result you executed in smart ways. Eventually, your dumb questions aren&#8217;t perceived as being dumb anymore. Eventually, when you ask a seemingly trivial question, people stop reflexively thinking &#8216;how does he not know that&#8217; and start thinking about what your brain is about to do with that little tidbit of data.</p>
<p>Further, it means people will trust you more. Think about it. Would you rather give a critical project to someone who absolutely never asks questions and &#8220;seems smart&#8221;, or the person who asks intelligent questions and executes?</p>
<p>So, I say be the happy idiot. Put yourself out there. If you&#8217;re perceived as being dumb for taking steps to be less dumb, then the problem isn&#8217;t yours, and you shouldn&#8217;t make it yours.</p>
<p>&nbsp;</p>

<p><a href="http://feedads.g.doubleclick.net/~a/XRa9lulYrgtWPoi3DodtVZ5yRzg/0/da"><img src="http://feedads.g.doubleclick.net/~a/XRa9lulYrgtWPoi3DodtVZ5yRzg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XRa9lulYrgtWPoi3DodtVZ5yRzg/1/da"><img src="http://feedads.g.doubleclick.net/~a/XRa9lulYrgtWPoi3DodtVZ5yRzg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=hnTj2gl0bdM:4aXKM87gJqg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=hnTj2gl0bdM:4aXKM87gJqg:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=hnTj2gl0bdM:4aXKM87gJqg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=hnTj2gl0bdM:4aXKM87gJqg:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/hnTj2gl0bdM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2011/11/01/the-happy-idiot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2011/11/01/the-happy-idiot/</feedburner:origLink></item>
		<item>
		<title>pyrabbit Makes Testing and Managing RabbitMQ Easy</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/-ZCo37cmD6w/</link>
		<comments>http://www.protocolostomy.com/2011/10/23/pyrabbit-makes-testing-and-managing-rabbitmq-easy/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 18:05:02 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=949</guid>
		<description><![CDATA[I have a lot of hobby projects, and as a result getting any one of them to a state where I wouldn&#8217;t be completely embarrassed to share it takes forever. I started working on pyrabbit around May or June of this year, and I&#8217;m happy to say that, while it&#8217;ll never be totally &#8216;done&#8217; (it [...]]]></description>
			<content:encoded><![CDATA[<p>I have a lot of hobby projects, and as a result getting any one of them to a state where I wouldn&#8217;t be completely embarrassed to share it takes forever. I started working on pyrabbit around May or June of this year, and I&#8217;m happy to say that, while it&#8217;ll never be totally &#8216;done&#8217; (it is software, after all), it&#8217;s now in a state where I&#8217;m not embarrassed to say I wrote it.</p>
<h3>What is it?</h3>
<p>It&#8217;s a Python module to help make managing and testing RabbitMQ servers easy. RabbitMQ has, for some time, made available a RESTful interface for programmatically performing all of the operations you would otherwise perform using their browser-based management interface.</p>
<p>So, pyrabbit lets you write code to manipulate resources like vhosts &amp; exchanges, publish and get messages, set permissions, and get information on the running state of the broker instance. Note that it&#8217;s *not* suitable for writing AMQP consumer or producer applications; for that you want an *AMQP* module like <a href="http://github.com/pika/pika">pika</a>.</p>
<p>PyRabbit is tested with Python versions 2.6-3.2. The testing is automated using <a href="http://pypi.python.org/pypi/tox/1.1">tox</a>. In fact, PyRabbit was a project I started in part because I wanted to play with tox.</p>
<p>Here&#8217;s the example, ripped from the <a href="http://pyrabbit.readthedocs.org">documentation</a> (which is ripped right from my own terminal session):</p>
<pre>&gt;&gt;&gt; from pyrabbit.api import Client
&gt;&gt;&gt; cl = Client('localhost:55672', 'guest', 'guest')
&gt;&gt;&gt; cl.is_alive()
True
&gt;&gt;&gt; cl.create_vhost('example_vhost')
True
&gt;&gt;&gt; [i['name'] for i in cl.get_all_vhosts()]
[u'/', u'diabolica', u'example_vhost', u'testvhost']
&gt;&gt;&gt; cl.get_vhost_names()
[u'/', u'diabolica', u'example_vhost', u'testvhost']
&gt;&gt;&gt; cl.set_vhost_permissions('example_vhost', 'guest', '.*', '.*', '.*')
True
&gt;&gt;&gt; cl.create_exchange('example_vhost', 'example_exchange', 'direct')
True
&gt;&gt;&gt; cl.get_exchange('example_vhost', 'example_exchange')
{u'name': u'example_exchange', u'durable': True, u'vhost': u'example_vhost', u'internal': False, u'arguments': {}, u'type': u'direct', u'auto_delete': False}
&gt;&gt;&gt; cl.create_queue('example_queue', 'example_vhost')
True
&gt;&gt;&gt; cl.create_binding('example_vhost', 'example_exchange', 'example_queue', 'my.rtkey')
True
&gt;&gt;&gt; cl.publish('example_vhost', 'example_exchange', 'my.rtkey', 'example message payload')
True
&gt;&gt;&gt; cl.get_messages('example_vhost', 'example_queue')
[{u'payload': u'example message payload', u'exchange': u'example_exchange', u'routing_key': u'my.rtkey', u'payload_bytes': 23, u'message_count': 2, u'payload_encoding': u'string', u'redelivered': False, u'properties': []}]
&gt;&gt;&gt; cl.delete_vhost('example_vhost')
True
&gt;&gt;&gt; [i['name'] for i in cl.get_all_vhosts()]
[u'/', u'diabolica', u'testvhost']</pre>
<p>Hopefully you&#8217;ll agree that this is simple enough to use in a Python interpreter to get information and do things with RabbitMQ &#8216;on the fly&#8217;.</p>
<h3>How Can I Get It?</h3>
<p>Well, there&#8217;s already a package on PyPI called &#8216;pyrabbit&#8217;, and it&#8217;s not mine. It&#8217;s some planning-stage project that has no actual software associated with it. I&#8217;m not sure when the project was created, but the PyPI page has a broken home page link, and what looks like a broken RST-formatted doc section. I&#8217;ve already pinged someone to see if it&#8217;s possible to take over the name, because I can&#8217;t think of a cool name to change it to.</p>
<p>Until that issue is cleared up, you can get downloadable packages or clone/fork the code at the <a href="http://github.com/bkjones/pyrabbit">pyrabbit github page</a> (see the &#8216;Tags&#8217; section for downloads), and the <a href="http://pyrabbit.readthedocs.org">documentation</a> is hosted on the (awesome) ReadTheDocs.org site.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/41-GyKCo9YVHyjgkj-EqWlEMa-0/0/da"><img src="http://feedads.g.doubleclick.net/~a/41-GyKCo9YVHyjgkj-EqWlEMa-0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/41-GyKCo9YVHyjgkj-EqWlEMa-0/1/da"><img src="http://feedads.g.doubleclick.net/~a/41-GyKCo9YVHyjgkj-EqWlEMa-0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=-ZCo37cmD6w:ClyqC2QkeMA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=-ZCo37cmD6w:ClyqC2QkeMA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=-ZCo37cmD6w:ClyqC2QkeMA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=-ZCo37cmD6w:ClyqC2QkeMA:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/-ZCo37cmD6w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2011/10/23/pyrabbit-makes-testing-and-managing-rabbitmq-easy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2011/10/23/pyrabbit-makes-testing-and-managing-rabbitmq-easy/</feedburner:origLink></item>
		<item>
		<title>Shhh… I’m Hunting Talks</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/eUFsvNxnlzk/</link>
		<comments>http://www.protocolostomy.com/2011/10/13/shhh-im-hunting-talks/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 18:10:03 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=946</guid>
		<description><![CDATA[Well, it&#8217;s that time of year again. The PyCon 2012 Call for Proposals has ended. This means it&#8217;s time for the Program Committee to spring into action, evaluating all of the proposals, preparing to champion their favorites, and participating in the interactive meetings that eventually decide the fate of PyCon 2012&#8242;s slate of talks, tutorials, [...]]]></description>
			<content:encoded><![CDATA[<p>Well, it&#8217;s that time of year again. <a href="http://pycon.blogspot.com/2011/10/pycon-2012-announcing-new-diamond.html">The PyCon 2012 Call for Proposals has ended</a>. This means it&#8217;s time for the Program Committee to spring into action, evaluating all of the proposals, preparing to champion their favorites, and participating in the interactive meetings that eventually decide the fate of PyCon 2012&#8242;s slate of talks, tutorials, and poster sessions.</p>
<p>But&#8230; who is the Program Committee?</p>
<p>I asked that question last year. &#8220;Who are these people? Is this something I can participate in?&#8221; It turns out that *anyone* can join the Program Committee. The genius in the way it works is its simplicity: if you want to be on the Program Committee, you <a href="http://mail.python.org/mailman/listinfo/pycon-pc">join a mailing list</a>, send an intro email, and you&#8217;re added as a committee member.</p>
<p>My first year on the Program Committee was a fantastic experience that served to educate me about the selection process, and to further my conviction that the Python community is the most welcoming, open and inclusive group I&#8217;ve ever had the pleasure of being involved with.</p>
<p>So, if you haven&#8217;t already, I encourage you to <a href="http://mail.python.org/mailman/listinfo/pycon-pc">join the Program Committee</a> for this year&#8217;s round of meetings to help build what will undoubtedly become the biggest and best PyCon yet.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/yAVZG7_K8wS4iTXCSoLcFsk-DNU/0/da"><img src="http://feedads.g.doubleclick.net/~a/yAVZG7_K8wS4iTXCSoLcFsk-DNU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yAVZG7_K8wS4iTXCSoLcFsk-DNU/1/da"><img src="http://feedads.g.doubleclick.net/~a/yAVZG7_K8wS4iTXCSoLcFsk-DNU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=eUFsvNxnlzk:b3XUAYoOlLk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=eUFsvNxnlzk:b3XUAYoOlLk:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=eUFsvNxnlzk:b3XUAYoOlLk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=eUFsvNxnlzk:b3XUAYoOlLk:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/eUFsvNxnlzk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2011/10/13/shhh-im-hunting-talks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2011/10/13/shhh-im-hunting-talks/</feedburner:origLink></item>
	</channel>
</rss>

