<?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>Sat, 16 Feb 2013 03:46:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</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>What Geeks Could Learn From Working In Restaurants</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/b3MCxk8xqxQ/</link>
		<comments>http://www.protocolostomy.com/2012/09/04/what-geeks-could-learn-from-working-in-restaurants/#comments</comments>
		<pubDate>Wed, 05 Sep 2012 03:34:28 +0000</pubDate>
		<dc:creator>jonesy</dc:creator>
				<category><![CDATA[Big Ideas]]></category>
		<category><![CDATA[Me stuff]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=1012</guid>
		<description><![CDATA[I spent a long time in my teens and early 20&#8242;s working in restaurants. To be honest, I loved just about every minute of it. It&#8217;s exciting, you&#8217;re never idle, and it&#8217;s usually not boring: you either get immediate gratification from happy customers leaving a nice tip, or you&#8217;re on the defensive, thinking on your [...]]]></description>
				<content:encoded><![CDATA[<p><span style="line-height: 13px;">I spent a long time in my teens and early 20&#8242;s working in restaurants. To be honest, I loved just about every minute of it. It&#8217;s exciting, you&#8217;re never idle, and it&#8217;s usually not boring: you either get immediate gratification from happy customers leaving a nice tip, or you&#8217;re on the defensive, thinking on your feet to save an experience after something has gone wrong. </span></p>
<p>In contrast, technology, I&#8217;ve found, requires more of an investment to get to the gratification of a job well done. I&#8217;ve also always felt like certain aspects of technology, like coding, are somewhat therapeutic for me, whereas restaurant work mostly wasn&#8217;t. And, occasionally, technology work can be monotonous and boring.</p>
<p>In spite of the quite dramatic differences between the two working environments, I sometimes find myself thinking about restaurants when I&#8217;m working on software or systems. It turns out that some of the tenets of restauranteurism, or just waitering or bartending, can be applied to work in the tech sector. Allow me a bit of license to riff on some of them here:</p>
<ul>
<li><span style="line-height: 13px;"><strong>Treat your station as a single table</strong>. If one table needs a refill on a drink, chances are so do one of the other 4 tables that are all within 10 feet of that one. Save yourself some running by checking with all of the tables when one asks for something. In geek terms, this maps to looking for wins across multiple projects in your environment. Does your app need user authentication or a mail transport service? Chances are other projects do too. Looking for these kinds of wins can also help distribute the load of creating the requirements, and foster a sense of shared ownership in the result. </span></li>
<li><span style="line-height: 13px;"><strong>Anticipate the need</strong>. Your customers shouldn&#8217;t have to ask for everything they need. Ideally they wouldn&#8217;t need to ask for anything they need, because you&#8217;d keep an eye on their drinks, you&#8217;d notice that someone wasn&#8217;t eating their salad and suspect something is wrong, you&#8217;d know that having kids means the first thing to the table is a huge stack of napkins, etc. The point is, there&#8217;s what&#8217;s happening now, and what is, in your professional opinion, likely to screw that all up. Your experience will likely guide you to solutions that are likely to keep that from happening. If not, you&#8217;re about to get more experience. Just like in technology <img src='http://www.protocolostomy.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />   </span></li>
<li><span style="line-height: 13px;"><strong>Presentation counts</strong>. All restaurants fiddle with the light levels, the music rotation, how food is placed on the plate, the garnishes added to drinks, and any restaurant you&#8217;d want to eat in is fastidious about tiny, tiny details from sweeping the entry foyer, to replacing tablecloths, to tossing old-looking napkins, to replacing chairs with tiny pinhole tears in the leather. Why? Because a restaurant is, in the process of serving you, also constantly selling you through your experience there. Of course, your software should do this, but you can get deeper than that: all of those ideas you have that nobody listens to, or you can&#8217;t get approval for? You&#8217;re missing some details. You don&#8217;t have any metrics, or you&#8217;re giving a geeky experience to a business-y audience, or you&#8217;re not presenting your idea in the form of an experience, or you&#8217;re creating a vision of a present instead of a product in the mind of the person with the checkbook.</span></li>
<li><span style="line-height: 13px;"><strong>Presentation can&#8217;t save poor quality</strong>. You can put all kinds of shiny AJAX-y Bootstrap-y stuff all over your site. It could be the nicest UI in existence. If the service doesn&#8217;t work, you&#8217;re toast. And those ideas you&#8217;re trying to sell internally? You&#8217;d better be confident they&#8217;ll work and have a solid execution plan, because a couple of bombs and no amount of presentation goodness is going to get you to &#8220;yes&#8221; again.</span></li>
<li><span style="line-height: 13px;"><strong>Consistency!</strong> Food quality, presentation, service&#8230; the entire dining experience, from the moment you set foot on the property to the moment you leave, should ideally be completely 100% consistent. Completely predictable. Zero surprises. It makes the restaurant easy to get to know, because if you&#8217;ve seen one, you&#8217;ve basically seen them all. Now think about the naming of your variables. Do you abbreviate here and write it out there? Think about how you package your software. Do you sometimes provide an XML config file and sometimes INI format? Think about your code layout. Do you sometimes use inheritance and sometimes composition, when either will do? Do you sometimes test? Do you sometimes&#8230; anything? Small inconsistencies add up. I believe we&#8217;re pretty much all guilty of them sometimes, but we should all strive to minimize them. </span></li>
<li><span style="line-height: 13px;"><strong>Minimize Complexity.</strong> Very little inside of a restaurant is complicated or complex. Inevitably, the friction points where small complications live are where problems arise. A huge number of issues within a restaurant are human error: mistaken orders, mismatching food to table when the tray is assembled, food under- or overcooked, drinks made wrong or sent to the wrong table, miscalculated bills, forgotten requests for drink refills or side orders, the list goes on for an eternity. Ironically, computers are employed to help with some of it, and the food service world is better for it on the whole. In technology, and I&#8217;m sure in most jobs, most of the issues are more with the people than the technology. From forgotten feature details to overlooked metrics, from miscommunicated load projections to undocumented security policies, the clumsy inner workings, and inter-workings of human beings gets us every time. </span></li>
<li><span style="line-height: 13px;"><strong>Mise en place!</strong> This is a French term, and I don&#8217;t speak much French, but in a kitchen it means &#8220;have your shit together and easy to reach, kid&#8221;. Chefs on a line will have a shelf or some other space that&#8217;s within arm&#8217;s reach where they put bowls and bottles of things they need all the time. The pre-meal time for a chef is spent double-checking that this small area is picture perfect, double-checking that refills and extras will be easy to grab during the shift, and making sure there&#8217;s no excuse for failure. I see teams fail at this quite a lot, actually. The mise en place for a technology worker are all of those things that need to be in place in order for a service to go to production. Metrics and monitoring. Hardware allocations. Infrastructure service dependencies. Security concerns. Power! I cannot count how many times a service has gotten to the week of deployment before a request to allocate storage in production was created, or the number of times hardware arrived before anyone thought about where it would be plugged in, or what that would do to the uptime provided by the UPS during an outage. </span></li>
</ul>
<div><span style="line-height: 13px;">Overall, I&#8217;d say it&#8217;s been for my progress in the technology industry to have grown and learned lessons from experiences in other industries, even if those experiences sometimes came from rather menial roles. Also, as my great grandmother used to say, all of that sweaty, smelly work was also good for me: &#8220;It builds character!&#8221; </span></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=b3MCxk8xqxQ:KsaFf-zLIlY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=b3MCxk8xqxQ:KsaFf-zLIlY:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=b3MCxk8xqxQ:KsaFf-zLIlY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=b3MCxk8xqxQ:KsaFf-zLIlY:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/b3MCxk8xqxQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2012/09/04/what-geeks-could-learn-from-working-in-restaurants/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2012/09/04/what-geeks-could-learn-from-working-in-restaurants/</feedburner:origLink></item>
		<item>
		<title>What I’ve Been Up To</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/2UaloOtFV_w/</link>
		<comments>http://www.protocolostomy.com/2012/08/05/what-ive-been-up-to/#comments</comments>
		<pubDate>Mon, 06 Aug 2012 02:02:09 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Big Ideas]]></category>
		<category><![CDATA[Me stuff]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=995</guid>
		<description><![CDATA[Historically, I post fairly regularly on this blog, but I haven&#8217;t been lately. It&#8217;s not for lack of anything to write about, but rather a lack of time to devote to blogging. I want to post at greater length about some of the stuff I&#8217;ve been doing, and I have several draft posts, but I [...]]]></description>
				<content:encoded><![CDATA[<p>Historically, I post fairly regularly on this blog, but I haven&#8217;t been lately. It&#8217;s not for lack of anything to write about, but rather a lack of time to devote to blogging. I want to post at greater length about some of the stuff I&#8217;ve been doing, and I have several draft posts, but I wanted to list what I&#8217;ve been up to for two reasons:</p>
<ol>
<li>I use my blog as a sort of informal record of what I accomplished over the course of the year, hurdles I ran into, etc. I also sometimes use it to start a dialog about something, or to &#8216;think out loud&#8217; about ideas. So it&#8217;s partially for my own reference.</li>
<li>Someone might actually be interested in something I&#8217;m doing and want to pitch in, fork a repo, point me at an existing tool I&#8217;m reinventing, give me advice, or actually make use of something I&#8217;ve done or something I&#8217;ve learned and can share.</li>
</ol>
<h3>PyCon 2013</h3>
<p>I&#8217;m participating again for the third year in the Program Committee and anywhere else I can help out (time permitting) with the organization of PyCon. It&#8217;s historically been a fantastic and really rewarding experience that <a href="https://us.pycon.org/2013/about/volunteers/">I highly (and sometimes loudly) recommend</a> to anyone who will listen. Some day I want to post at greater length about some actual instances where being really engaged in the community has been a win in real, practical ways. For now, you&#8217;ll have to take my word for it. It&#8217;s awesome.</p>
<p>I also hope to submit a talk for PyCon 2013. Anyone considering doing this should know a couple of things about it:</p>
<ol>
<li>Even though I participate in the Program Committee, which is a completely volunteer committee that takes on the somewhat grueling process of selecting the talks, tutorials, and poster sessions, it&#8217;s pretty much unrelated to my chances of having my talk accepted. In other words, submitting a talk is as daunting for me as it is for anyone. Maybe more so.</li>
<li>Giving a talk was a really rewarding experience, and I recommend to anyone to <a href="https://us.pycon.org/2013/speaking/speakatpycon/">give it a shot</a>.</li>
</ol>
<p>I just published a <a href="http://www.protocolostomy.com/2012/08/05/pycon-talk-proposals-all-you-need-to-know-and-more/">really long post about submitting a talk to PyCon</a>. It&#8217;s full of completely unsolicited advice and subjective opinions about the do&#8217;s and don&#8217;ts of talk submission, based on my experiences as both a submitter of proposals and a member of the Program Committee, which is the committee that selects the talks.</p>
<h3>Python Cookbook</h3>
<p>Dave Beazley and I are really rolling with the next edition of the Python Cookbook, which will cover Python 3 *only*. We had some initial drama with it, but the good news is that I feel that Dave and I have shared a common vision for the book since just about day one, and that shared vision hasn&#8217;t changed, and O&#8217;Reilly hasn&#8217;t forced our hand to change it, which means the book should be a really good reflection of that vision when it&#8217;s actually released. I should note, however, that the next edition will represent a pretty dramatic departure from the form and function of previous versions. I&#8217;m excited for everyone to see it, but that&#8217;s going to have to wait for a bit. It&#8217;s still early to talk about an exact release date &#8211; I won&#8217;t know that for sure until the fall, but I would expect it to be at PyCon 2013.</p>
<h3>PyRabbit</h3>
<p>I&#8217;ve blogged a bit about pyrabbit <a href="http://www.protocolostomy.com/2011/10/23/pyrabbit-makes-testing-and-managing-rabbitmq-easy/">before</a>: it&#8217;s a Python client for talking to RabbitMQ&#8217;s RESTful HTTP Management API. So, it&#8217;s not for building applications that do message passing with AMQP &#8212; it&#8217;d be more for monitoring, polling queue depths, etc., or if you wanted to build your own version of the browser-based management interface to RabbitMQ.</p>
<p><a href="http://github.com/bkjones/pyrabbit">Pyrabbit</a> is actually being used. Last I looked, kombu was actually using it, and if memory serves, kombu is used in Celery, so pyrabbit is probably installed on more machines than I&#8217;m aware of at this point. I also created a little command shell program called <a href="http://github.com/bkjones/bunnyq">bunnyq</a> that will let you poke at RabbitMQ remotely without having to write any code. You can create &amp; destroy most resources, fire off a message, retrieve messages, etc. It&#8217;s rudimentary, but it&#8217;s fine for quick, simple tests or to validate your understanding of the system given certain binding types, etc.</p>
<p>I have a branch wherein I port the unit tests for Pyrabbit to use a bit of a different approach, but I also need to flesh out more parts of the API and test it on more versions of RabbitMQ. If you use Pyrabbit, you should know that I also accept pull requests if they come with tests.</p>
<h3>Stealth Mode</h3>
<p>Well, &#8216;stealth&#8217; is a strong word. I actually don&#8217;t believe much in stealth mode, so if you want to know just ask me in person. Anyway, between 2008 and 2012 I&#8217;ve been involved in startups (both bought out, by the way! East Coast FTW!) that were very product driven and very focused on execution. I was lucky enough to answer directly to the CEO of one of those companies (AddThis) and directly to the CTO of the other (myYearbook, now meetme.com), which gave me a lot of access and insight into the mechanics, process, and thinking behind how a product actually comes to be. It turns out I really love certain aspects of it that aren&#8217;t even necessarily technical. I also really find the execution phase really exciting, and the rollout phase really almost overwhelmingly exciting.</p>
<p>I&#8217;ve found myself now with an idea that is really small and simple, but just won&#8217;t go away. It&#8217;s kind of gnawing at me, and the more I think about it, the more I think that, given what I&#8217;ve learned about product development, business-side product metrics, transforming some stories into an execution plan, etc., on top of my experience with software development, architecting for scalability, cloud services, tools/technologies for building distributed systems, etc., I could actually do this. It&#8217;s small and simple enough for me to get a prototype working on my own, and awesome enough to be an actual, viable product. So I&#8217;m doing it. I&#8217;m doing it too slowly, but I&#8217;m doing it.</p>
<p>By the way, the one thing I completely suck at is front end design/development. I can do it, but if I could bring on a technical co-founder of my own choosing, that person would be a front end developer who has pretty solid design chops. If you know someone, or are someone, get in touch &#8211; I&#8217;m @bkjones on Twitter, and bkjones at gmail. I&#8217;m jonesy on freenode. I&#8217;m not hard to find <img src='http://www.protocolostomy.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>In and Out of Love w/ NoSQL</h3>
<p>I&#8217;ve recently added Riak to my toolbelt, next to CouchDB, MongoDB, and Redis (primarily). I was originally thinking that Riak would be a good fit for a project I&#8217;m working on, but have grown more uncomfortable with that notion as time has passed. The fact of the matter is that my data has relationships, and it turns out that relational databases are actually a really good fit in terms of the built-in feature set. The only place they really stink is on the operations side, but it also turns out that I have, like, several years of experience in doing that! Where I finally lost patience with NoSQL for this project was this huge contradiction that I never hear anyone ever talk about. You know the one &#8212; the one where the NoSQL crowd screams about how flexible everything is and how it really fits in with the &#8220;agile&#8221; mindset, and then in another doc in the same wiki strongly drives home the message that if you aren&#8217;t 100% sure what the needs of your app are, you should really make sure you have a grasp on that up front.</p>
<p>Uhh, excuse me, but if I&#8217;m iterating quickly on an app, testing in production, iterating on what works, failing fast, and designing in the direction of, and in direct response to, my customers, HOW THE HELL DO I KNOW WHAT MY APP&#8217;S NEEDS ARE?</p>
<p>So, what I&#8217;m starting with is what I know for sure: my data has relationships. I&#8217;m experienced enough with NoSQL solutions to understand my options for modeling them &amp; enforcing the relationships, but when the relational aspect of the data is pretty much always staring you in the face and isn&#8217;t limited to a small subset of operations that rely on the relationships, it seems like a no-brainer to just use the relational database and spend my time writing code to implement actual features. If I find some aspect of the data that can benefit from a NoSQL solution later, well, then I&#8217;ll use it later!</p>
<h3>Unit Testing Patterns</h3>
<p>Most who know me know I&#8217;m kind of &#8220;into&#8221; unit testing. It&#8217;s almost like a craft unto itself, and one that I rather enjoy. I recently started a new job at AWeber Communications, where I&#8217;m working on a next-generation awesome platform to the stars 2.0 ++, and it&#8217;s all agile, TDD, kanban, and all that. It&#8217;s pretty cool. What I found in the unit tests they had when I got there were two main things:</p>
<p>First, the project used bare asserts, and used dingus in &#8220;mock it all!&#8221; mode. Combined, this led to tests that were mostly effective, but not very communicative in the event of failure, and they were somewhat difficult to reason about when you read them.</p>
<p>Second, they had a pretty cool pattern for structuring and naming that gave *running* the tests and viewing the output a more behavioral feel to them that I thought was pretty cool, and looked vaguely familiar. Later I realized it was familiar because it was similar to the very early &#8220;Introducing Behavioral Driven Development&#8221; post I saw a long time ago but never did anything with. If memory serves, that early introduction did not introduce a BDD framework like the ones popping up all over github over the past few years. It mostly relied on naming to relay the meaning, and used standard tools &#8220;behind the curtain&#8221;, and it was pretty effective.</p>
<p>So long story short, those tests have mostly been ported to use the mock module, and inherit from unittest2.TestCase (so, no more bare asserts). The failure output is much more useful, and I think the pattern that&#8217;s evolving around the tests now is unfinished but starting to look pretty cool! In the process, I also created a repository for unittest helpers that currently only contains a context manager that you feed a list of things to patch, and it&#8217;ll automatically patch and then unpatch things after the code under test is run. It has helped me start to think about building tests in a more consistent fashion, which means reading them is more predictable too, and hopefully we spend less time debugging them and less time introducing new developers to how they work.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=2UaloOtFV_w:ZcRS_EX2WmI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=2UaloOtFV_w:ZcRS_EX2WmI:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=2UaloOtFV_w:ZcRS_EX2WmI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=2UaloOtFV_w:ZcRS_EX2WmI:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/2UaloOtFV_w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2012/08/05/what-ive-been-up-to/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2012/08/05/what-ive-been-up-to/</feedburner:origLink></item>
		<item>
		<title>PyCon Talk Proposals: All You Need to Know And More</title>
		<link>http://feedproxy.google.com/~r/MusingsOfAnAnonymousGeek/~3/csJb3g601MQ/</link>
		<comments>http://www.protocolostomy.com/2012/08/05/pycon-talk-proposals-all-you-need-to-know-and-more/#comments</comments>
		<pubDate>Mon, 06 Aug 2012 01:17:07 +0000</pubDate>
		<dc:creator>bkjones</dc:creator>
				<category><![CDATA[Big Ideas]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.protocolostomy.com/?p=998</guid>
		<description><![CDATA[Writing a talk proposal needn’t be a stressful undertaking. There are two huge factors that seem to stress people out the most about submitting a proposal, and we’re going to obliterate those right now, so here they are: It’s not always obvious how a particular section of a proposal is evaluated, so it’s not always [...]]]></description>
				<content:encoded><![CDATA[<p>Writing a talk proposal needn’t be a stressful undertaking. There are two huge factors that seem to stress people out the most about submitting a proposal, and we’re going to obliterate those right now, so here they are:</p>
<ol>
<li>It’s not always obvious how a particular section of a proposal is evaluated, so it’s not always clear how much/little should be in a given section, how detailed/not detailed it should be, etc.</li>
<li>The evaluation and selection process is a mystery.</li>
</ol>
<h3>
What Do I Put Here?</h3>
<p>Don’t fret. Here, in detail, are all of the parts of the proposal submission form, and some insight into what’s expected to be there, and how it’s used.</p>
<h4>Title</h4>
<p>Pick your title with care. While the title may not be cause for the Program Committee to throw out your proposal, you should consider the marketing aspect of speaking at a conference. For example, there are plenty of conference-goers who, in a mad dash to figure out the talk they’ll attend next, will simply skip a title that requires manual parsing on their part.</p>
<p>So, a couple of DOs and DON’Ts:</p>
<ul>
<li>
<h4>DOs</h4>
<ul>
<li>DO insure that your title targets the appropriate audience for your talk</li>
<li>DO keep the title as short and simple as possible</li>
<li>DO insure that the title accurately reflects what the talk is about</li>
</ul>
</li>
<li>
<h4>DON’Ts</h4>
<ul>
<li>DON’T have a vague title</li>
<li>DON’T omit key words that are crucial to understanding who the talk is for</li>
<li>DON’T create a title that’s too long or wordy</li>
</ul>
</li>
</ul>
<p>So, in short, keep the title short and clear. There’s no hard and fast rule regarding length, of course, but consider how many best-selling book titles have ever had more than, say, 7 words? I’m sure it’s happened, but it’s probably more the exception than the rule. If you feel you need a very long title in order to meet the goals of the title, describe your proposal by some friends or coworkers, and when they say “So&#8230; how to do ‘x’ with ‘y’, basically, right?”, that’s actually your title. Be gracious and thank them.</p>
<p>Within your concise title, you should absolutely make certain to target your audience, if your audience is a very specific subset of the overall attendee list. For example, if you’re writing a proposal about testing Django applications, and the whole talk revolves around Django’s built-in testing facilities, your title pretty much has to say “Django” in it, for two reasons:</p>
<ol>
<li>If I’m a Django user, I really want to make sure I’ve discovered all of the Django talks before I decide what I’m doing, and if your title doesn’t say “Django” in it, lots of other ones do. A reasonable person will expect to see a key word like that in the title.</li>
<li>If I’m *not* a Django user and show up to your “Unit Testing Web Applications” talk, only to discover 10 minutes into a 25-minute talk that I’ll get nothing out of it, I’m going to really be peeved.</li>
</ol>
<p>Finally, unless you totally and completely know what you’re doing, DO NOT use a clever title using a play on words and not a single technology-related word in the whole thing. There are several issues with doing this, but probably the most obvious ones are:</p>
<ol>
<li>You’re not your audience: just because you get the reference and think it’s a total no-brainer, it’s almost guaranteed that 95% of the attendees will not get it when quickly glancing over a list of 100 talk titles.</li>
<li>You’re basically forcing the reader to read the abstract to see if they’ve even heard of the technology your talk is about. Don’t waste their time!</li>
</ol>
<h4>
Category</h4>
<p>The ‘Category’ form element is a drop-down list of high-level categories like ‘Concurrency’, ‘Mobile’, and ‘Gaming’. There are lots of categories. You may pick one. So if you have an awesome talk about how you use a standard WSGI app in a distributed deployment to get better numbers from your HPC system without the fancy interconnects, you might wonder whether to put your talk into the ‘HPC’ category or the ‘Web Frameworks’ category.</p>
<p>In cases such as this, it can be helpful to focus on the audience to help guide your decision. What do you think your audience would look like for this talk? Well, of course there are web framework authors and users who will absolutely be interested in the talk, but there isn’t a lot of gain for them in a talk like this, is there? I mean, what are the chances that someone in the audience has always dreamed of writing web frameworks for the HPC market? On the other hand, what are the chances that an HPC administrator, developer, or site manager would love to cut costs, ease deployment, reduce maintenance overhead, etc., of their HPC system by using a totally standard non-commercial web framework? There are probably valid arguments to be made for putting it in the ‘Web Frameworks’ category, but I can’t think of any. I’d put it in the ‘HPC’ category.</p>
<p>One more thing to consider is the other talks at the conference, or talks that could be at the conference, or talks from past conferences. Look at last year’s program. Where does your talk fit in that mix of talks? What talks would your talk have competed with? Is there a talk from last year that is similar in scope to your proposal? What category was it listed in?<br />
Audience Level</p>
<p>There’s a ton of gray area in selecting your target audience level. I’ve never liked the sort of arbitrary “Novice means less than X years experience” formulas, so I’ll do my best to lay out some rules of thumb, but ultimately, what you consider ‘Novice’, and how advanced you think your material is, is up to you. Your choices are:</p>
<ul>
<li>Novice:
<ul>
<li>Has used but not created a decorator and context manager.</li>
<li>Has possibly never used anything in the itertools, collections, operator, and/or functools modules</li>
<li>Has used but never had any issues with the datetime, email, or urllib modules.</li>
<li>Has seen list comprehensions, but takes some time to properly parse them</li>
</ul>
</li>
<li>Intermediate:
<ul>
<li>Has created at least a decorator, and possibly a context manager.</li>
<li>Has recently had use for the operator module (and used it) and has accepted itertools as their savior.</li>
<li>Has had a big problem with at least one of: datetime, email, or urllib.</li>
<li>There’s only a slight chance they’ve ever created or knowingly made use of metaclasses.</li>
<li>Has potentially never had to use the socket module directly for anything other than hostname lookups.</li>
<li>Can write a (non-nested) list comprehension, and does so somewhat regularly.</li>
</ul>
</li>
<li>Advanced:
<ul>
<li>Has created both a decorator and context manager using both functions and classes.</li>
<li>Has written their own daemonization module using Stevens as their reference.</li>
<li>Has been required to understand the implications of metaclasses and/or abstract base classes in a system.</li>
<li>May be philosophically opposed to list comprehensions, metaclasses, and abstract base classes</li>
<li>Has subclassed at least one of the built-in container types</li>
</ul>
</li>
</ul>
<p>Still not sure where your talk belongs? Well, hopefully you’re torn between only two of the user categories, in which case, I say “aim high”, for a few reasons:</p>
<ol>
<li>It’s generally easier to trim a talk to target a less experienced audience than you were expecting than to grow to accommodate a more experienced audience than you were expecting.</li>
<li>Speaking purely anecdotally and with zero statistics, and from memory, there are lots more complaints about talks being more advanced than their chosen audience level than the reverse.</li>
</ol>
<p>The Program Committee uses the category to insure that, within any given topic space, there’s a good selection of talks for all levels of attendees. In cases where a talk might otherwise be tossed for being too similar to (and not better than) another, targeting a different audience level could potentially save the day.</p>
<h4>Extreme?</h4>
<p>Talk slots are relatively short. Your idea for a talk is awesome, but way too long. What if you could give that talk to an audience that doesn’t need the whole 15-minute introductory part of the talk? What if, when your time started ticking down, you immediately jumped into the meat of the topic? That’s what Extreme talks are for.</p>
<p>I’d recommend checking the ‘Extreme’ box on the submission form only if your talk *could potentially* be an Extreme talk. Why? Two reasons:</p>
<ol>
<li>The number of Extreme slots is limited, and</li>
<li>If your talk is not accepted into an ‘Extreme’ slot, it may still be accepted as a regular talk.</li>
</ol>
<h4>Duration</h4>
<p>There are 30-minute or 45-minute slots, or you can choose ‘No Preference’. I recommend modeling your proposal around the notion that it could be in either time slot: your ability to be flexible helps the Program Committee to be flexible as well. If your talk competes with another in the process and the only difference of any use that anyone can find is that your talk has a hard, 45-minute slot requirement, you probably have a good chance of losing that battle.</p>
<p>If you’d like to have a 45-minute slot, then it might help you out to build your outline for a 30-minute talk first, and then go back and add bullet points to it that are clearly marked “(If 45min slot)” or something. Alternatively, you can create the outline based on a 45-minute slot, and just use the ‘Additional Notes’ section of the form to explain how you’d alter the talk if the committee requested you do the talk in 30 minutes.</p>
<h4>Description</h4>
<p>This is the description that, if your talk is accepted, people will be reading in the conference program. It needs to:</p>
<ol>
<li>Be compelling</li>
<li>Make a promise</li>
<li>Be 400 characters or less</li>
</ol>
<p>Being compelling can seem very difficult, depending on your topic space. It might help to consider that you only need to be compelling to your target audience. So, while a talk called “Writing Unit Tests” is probably not compelling to the already-testing contingent at the conference, it might be totally compelling for those who aren’t but want to. Meanwhile, a talk called “Setting Up a local Automated TDD Environment in Python 3 With Zero External Dependencies” is probably pretty compelling to the already-testing crowd and not so compelling to those who aren’t yet writing tests.</p>
<p>Making a promise to the reader means that you’re setting an expectation in their mind that you’ll make good on some deliverable at some point in the talk. Some key phrases to use in your description to call out this promise might be “By the end of this talk, you’ll have&#8230;”, or “If you want to have a totally solid grasp of&#8230;”. The key that both of those phrases have in common is that they both imply that you’re about to tell them what they can expect to get out of the talk. It answers a question in every conference-goer’s mind when reading talk descriptions, which is “What’s in it for me?”. If you don’t answer that question in the description, it may be harder for people to guess what’s in it for them, and frankly they won’t spend a lot of time trying!</p>
<h4>Abstract</h4>
<p>The form expects a detailed description of the talk, along with an outline describing the flow of the talk. That said, it’s not expected that the talk you outline in August is precisely the same talk you deliver the following March. However, if your talk is accepted, the outline will be made public online (it will not be printed in the conference program), so you’d like to hit the outline as close as possible.</p>
<p>The abstract section will be used by the program committee to answer various questions about the talk, possibly including (but certainly not limited to):</p>
<ul>
<li>Whether the talk’s title and description actually describe the talk as detailed in the abstract. Will attendees get pretty much what they expect if they only read the title and description of the talk?</li>
<li>Whether the talk appears to target the correct audience level. If you’re targeting a novice audience, your abstract should not go into topics that are beyond that audience level.</li>
<li>Whether the scope of the talk is realistic given the time constraints. If you asked for a 30-minute slot, your abstract should not make the committee think that it would be impossible to cover all of the material even given a whole hour. It’s not uncommon to be a little off in this regard, but being really far off could be an indicator that the proposer may not have thought this through very well.</li>
<li>Whether the talk is organized and has a logical flow that incorporates any known essential, obvious topics that should be touched on.</li>
</ul>
<h4>Additional Notes</h4>
<p>This is a free-form text field where you can pretty much talk directly to the Program Committee to let them know in your own way why you think your talk is awesome, how you envision it coming off, and how you see the audience benefitting from it and finding value in attending the talk.</p>
<p>Although there are no hard requirements for this section of the submission form, you should absolutely, positively include any of the following that you can:</p>
<ul>
<li>If your talk is about a new software project, a link to the project’s homepage, repository, and anything other relevant articles, interviews, testimonials, etc., about the project.</li>
<li>Links to any online slides or videos from any presentations you’ve given previously.</li>
<li>Comments discussing how you’d handle moving from a 45-minute to 30-minute slot, or from an Extreme slot to a regular slot, etc. In general, it helps the committee to know you’ve thought about contingencies in your proposal.</li>
</ul>
<h3>Great, so&#8230; How do I do this?</h3>
<p>If you’ve never written a proposal before, and you’re not sure what you want to talk about, don’t have a crystal clear vision for a talk, have trouble narrowing the scope of your idea, and don’t know exactly where to start, I have a few ideas that might help you get the proposal creation juices flowing:</p>
<ul>
<li>Write down some bullet points in a plain text file that are titles or one-line summaries of talks you’d like to see. Forget about whether you’re even willing or able to actually produce these talks &#8211; the idea is to start moving things from your brain onto a page. When you’ve got 5-10 of these points, reflect:
<ul>
<li>Could you deliver any of these yourself?</li>
<li>Could you apply an idea contained in a point to a topic you’re more familiar with?</li>
<li>Is there a topic related to any of the points that touch on things you know well?</li>
<li>Do any of these points jog your memory and make you think of projects you’ve worked on in the past that might be a source for a talk idea?</li>
</ul>
</li>
<li>Do an informal audit of what you’ve done over the past year.
<ul>
<li>Were there problems you faced that there’s no good solution for?</li>
<li>Did you grow in some way that was really important, and could you help others to learn those lessons, and learn why those lessons are important?</li>
<li>Did you make use of a new technology?</li>
<li>Did you change how you do your job? Your development workflow? Your project lifecycle? Automation? Task management?</li>
</ul>
</li>
<li>Go through the talks on pyvideo.org. It’s such an enormous, and enormously valuable trove. You could just scan the titles and see if something comes up. If that doesn’t work, click on a few, but don’t watch the talk: skip to the Q&amp;A at the end. Buried in the Q&amp;A are always these gems that are only tangentially related, and it is not uncommon to hear a speaker respond with “&#8230;but that’s another whole talk&#8230;”. They’re sometimes right.</li>
</ul>
<p>Make it happen!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=csJb3g601MQ:oYQz1uqDujo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=csJb3g601MQ:oYQz1uqDujo:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?a=csJb3g601MQ:oYQz1uqDujo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MusingsOfAnAnonymousGeek?i=csJb3g601MQ:oYQz1uqDujo:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MusingsOfAnAnonymousGeek/~4/csJb3g601MQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.protocolostomy.com/2012/08/05/pycon-talk-proposals-all-you-need-to-know-and-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.protocolostomy.com/2012/08/05/pycon-talk-proposals-all-you-need-to-know-and-more/</feedburner:origLink></item>
		<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>
<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>8</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>
<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>
	</channel>
</rss>
