<?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"?><!-- generator="wordpress/2.3.1" --><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/" version="2.0">

<channel>
	<title>Code Monkey Island</title>
	<link>http://codemonkey.ravelry.com</link>
	<description>Technical tidbits (somewhat) related to my work on Ravelry.com</description>
	<pubDate>Fri, 06 Nov 2009 21:05:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/codemonkeyisland" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Worklog - New server, SSD, Redis, Amazon S3 bills, Google Analytics API</title>
		<link>http://codemonkey.ravelry.com/2009/11/06/worklog-new-server-ssd-redis-amazon-s3-bills-google-analytics-api/</link>
		<comments>http://codemonkey.ravelry.com/2009/11/06/worklog-new-server-ssd-redis-amazon-s3-bills-google-analytics-api/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 21:02:40 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[Hardware]]></category>

		<category><![CDATA[Sysadmin]]></category>

		<category><![CDATA[worklog]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/11/06/worklog-new-server-ssd-redis-amazon-s3-bills-google-analytics-api/</guid>
		<description><![CDATA[Most of the stuff that happens during a week at work is too long for Twitter and too short for a blog post.
There are still things that I&#8217;d like to share, so I thought I&#8217;d try batching them up.

New Database Server

We made our first hardware purchase of 2009 - a new database server from Silicon [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the stuff that happens during a week at work is too long for Twitter and too short for a blog post.
There are still things that I&#8217;d like to share, so I thought I&#8217;d try batching them up.</p>

<h2>New Database Server</h2>

<p>We made our first hardware purchase of 2009 - a new database server from Silicon Mechanics.
I chose a 1U Intel Nehalem machine and filled it with 2.5&#8243; 15K SAS disks.</p>

<p>I&#8217;m really excited to see how this will stack up against our current hardware (which is 18 months old, on average) I&#8217;ll be sure
to run some benchmarks and post them. I also want to compare Xen to KVM to no virtualization. We started using Xen over two
years ago and it looks like KVM may be pulling ahead performance-wise.</p>

<p>We&#8217;ve grown a lot during the last year and faster disks and more memory in the master database will give us a lot more breathing room. It will also allow us to turn our current master DB (which is still a nice machine) into a slave that can actually be used to take on part of the  load. Our current slave is great for backup and feeding the Sphinx search engine but its SATA disks are just too slow to handle any of the site&#8217;s database traffic.</p>

<p>While I was looking at servers, I noticed that nice Intel SSDs are pretty affordable for machines that don&#8217;t have big storage needs (app servers, etc) or database/file server IO needs. ..especially when you compare them to RAIDing 2 hard drives for redundancy. I didn&#8217;t really understand why SSDs varied so much in price and performance until I read this LWN article: &#8220;<a href=" http://lwn.net/Articles/353411/">Log Structured File systems: There&#8217;s one in every SSD</a>&#8220;.  Check it out.</p>

<h2>Redis</h2>

<p>We have our own ad-serving system at Ravelry - it allows advertisers to reserve their spots, target certain locations or groups, and change ad images on the fly. We like to think that our ads are interesting and cool enough that people actually want to return to one if they catch it as they leaving a page.</p>

<p>A long time ago, we had a feature that allowed people to &#8220;rewind&#8221; ads in order to bring back an ad that was previously displayed. We had to throw it out when it became too database intensive to make the feature work.</p>

<p>Thanks to <a href="http://code.google.com/p/redis">Redis</a>, I was able to bring this feature back with very little code. In one operation, I can refer to a list of viewed ads for a particular user/targeting and say &#8220;remove this ad from the list if it exists, push it to the tail, and trim the list to X items&#8221;.  It&#8217;s really cool. The Redis page calls it &#8220;a data structures server&#8221; and I think that this is a very fitting description. Check out all of the operations: <a href="http://code.google.com/p/redis/wiki/CommandReference">http://code.google.com/p/redis/wiki/CommandReference</a></p>

<p>If you are running Redis, here is <a href="http://stanly.net.ua/%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3-%D0%B4%D0%BB%D1%8F-redis/">a munin plugin that will graph connections and memory usage</a>. (<a href="http://stanly.net.ua/repo/misc/redis_">direct link to the script</a>)</p>

<h2>Amazon S3 sticker shock</h2>

<p>Our Amazon S3 bill is getting really high. Too high - we spend a small fortune on serving up images.</p>

<p>I&#8217;ve been beginning to front our S3 buckets with a caching nginx proxy connected to the cheaper of our two ISPs. That way, 
Amazon will still handle the storage but we can serve the most-accessed files from our own bandwidth.</p>

<p>Swapping back and forth is easy because we just have to alter the behavior of AssetTagHelper.</p>

<p>It&#8217;s too early to tell how much this will save us because I can&#8217;t relaly handle the traffic right now. Turns out that Amazon is taking care
of somewhere around 100 Mbps of file serving during peak times <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Once the new database server is installed, we&#8217;ll be able to do some shuffling and repurpose an existing virtual machine  as a cache.</p>

<p>I posted an answer over on StackOverflow that explains how to do this: &#8220;<a href="http://serverfault.com/questions/30705/how-to-set-up-nginx-as-a-caching-reverse-proxy">How to set up Nginx as a caching reverse proxy?</a>&#8220;</p>

<p>I looked doing this with Varnish but we are already running nginx and it was dead easy to set this up.</p>

<h2>Google analytics API</h2>

<p>We started using the <a href="http://code.google.com/apis/analytics/docs/">Google Analytics API</a> to create statistics tables for some of our data so that search results and other features can use the pageview information to better rank things, detect &#8220;hot&#8221; pages, stuff like that.</p>

<p>The API is great. It&#8217;s a little slow and a little strange, but it gives you access to all of the data that you can get through the web interface.  Thanks Google, for processing gigantic amounts of traffic data for me so that I can query it later.</p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/11/06/worklog-new-server-ssd-redis-amazon-s3-bills-google-analytics-api/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Building an API into a Rails app</title>
		<link>http://codemonkey.ravelry.com/2009/09/03/building-an-api-into-a-rails-app/</link>
		<comments>http://codemonkey.ravelry.com/2009/09/03/building-an-api-into-a-rails-app/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:54:48 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/09/03/building-an-api-into-a-rails-app/</guid>
		<description><![CDATA[So.. we&#8217;re working on a iPhone app. Ravelers, just like the users of most other sites, are clamoring for one. It&#8217;s not just that, though - we think that Ravelry will make a great mobile app and that being on the iPhone will be a really good thing for us.

Adding a full featured API to [...]]]></description>
			<content:encoded><![CDATA[<p>So.. we&#8217;re working on a iPhone app. Ravelers, just like the users of most other sites, are clamoring for one. It&#8217;s not just that, though - we think that Ravelry will make a <strong>great</strong> mobile app and that being on the iPhone will be a really good thing for us.</p>

<p>Adding a full featured API to the site has been a really good exercise. It&#8217;s really helped me to improve code quality and tie up loose ends and I&#8217;m glad that the iPhone has finally sparked the creation of an API for Ravelry.</p>

<p>I was surprised to find that the software support for API needs is lacking in places. Here are some of the missing or ill-fitting pieces that I&#8217;ve run into so far:</p>

<h2>Routes, controllers and actions</h2>

<p>Rails gives us formats and :respond_to. <a href="http://ryandaigle.com/articles/2009/8/10/what-s-new-in-edge-rails-default-restful-rendering">Rails 3 makes it even better</a>&#8230;. but I don&#8217;t like it. I don&#8217;t like mixing my API actions up with my non-API actions because the logic is never the same except for the simplest methods. For now, I&#8217;m just manually adding routes that send my API (JSON) requests to X_with_api actions. Hopefully some sort of pattern will emerge and an idea will sprout&#8230; or maybe I&#8217;ll see the error of my ways.</p>

<h2>Documentation</h2>

<p>I couldn&#8217;t find any way to generate pretty API documentation from simple structured text or code comments. There are so many people creating and documenting HTTP APIs that I was a little surprised by this. For now, I made up a code commenting convention and borrowed heavily from <a href="http://yard.soen.ca/getting_started">YARD</a>. I could try to figure out a way to get YARD to parse the stuff but I suspect I&#8217;ll end up hacking up a simpler parser that generates HTML documentation.</p>

<p>I like that this combined with the above results in methods dedicated to each API call with code comments that describe the HTTP parameters and JSON output. Add in a little setup code and some sample parameters and I could probably create tests from this.</p>

<p><img src="http://skitch.ravelry.com/shops-20090903-214952.jpg" /></p>

<h2>Rendering the Results</h2>

<p>For now, I&#8217;m only providing JSON. When I first started out, I was wishing for some XML::Builder/rxml like thing that I could use to write templates that generated JSON. My wish has since been granted by the <a href="http://rozenbom.r09.railsrumble.com/tequila">Tequila</a> RailsRumble project but I&#8217;m glad that I ended up going in a different direction.</p>

<p>I&#8217;m using my own take on the <a href="http://github.com/vigetlabs/serialize_with_options/tree/master">serialize_with_options</a> plugin. This allows me to set up multiple serialization &#8220;styles&#8221; (for example, I might have &#8220;compact&#8221; and &#8220;normal&#8221; - for search results vs retrieving a full object) and declare what attributes, method return values, and associated objects to include.  I&#8217;m liking this approach so far: it means that all of my API data has to be in a model as a method or attribute which will be easier to maintain. It also results in a little DSL that I should be able to use to generate API documentation that describes the return values.</p>

<p>That&#8217;s what I&#8217;ve got so far. It&#8217;s my first time building such a full-featured API and it feels a little like I&#8217;m inventing things that I shouldn&#8217;t have to invent. At least what I&#8217;ve got so far seems like it will be easy for me to maintain. I&#8217;m just getting started, so who knows where I&#8217;ll be by the end.</p>

<p><strong>PS</strong> Ravelers - I know that you are probably excited to hear about the iPhone thing <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Check out this thread for more information: <a href="http://www.ravelry.com/discuss/for-the-love-of-ravelry/601827/76-100#82">http://www.ravelry.com/discuss/for-the-love-of-ravelry/601827/76-100#82</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/09/03/building-an-api-into-a-rails-app/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Stack Overflow</title>
		<link>http://codemonkey.ravelry.com/2009/08/26/stack-overflow/</link>
		<comments>http://codemonkey.ravelry.com/2009/08/26/stack-overflow/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 17:46:53 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Blah]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/08/26/stack-overflow/</guid>
		<description><![CDATA[

It&#8217;s obligatory to be cranky about anything that Jeff Atwood and Joel Spolsky put out into the world together. I got over my initial grumpiness and discovered that StackOverflow is actually pretty cool. I&#8217;m casey #18424 over there.

SO is a question and answer site for programmers. People post questions, others answer, onlookers vote answers (and [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://skitch.ravelry.com/Stack_Overflow-20090826-134904.png" style="float: left; margin-right: 10px;"/></p>

<p>It&#8217;s obligatory to be cranky about anything that <a href="http://www.codinghorror.com/blog/archives/001101.html">Jeff Atwood and Joel Spolsky put out into the world together</a>. I got over my initial grumpiness and discovered that <a href="http://stackoverflow.com/">StackOverflow</a> is actually pretty cool. I&#8217;m <a href="http://stackoverflow.com/users/18424/casey">casey #18424</a> over there.</p>

<p>SO is a question and answer site for programmers. People post questions, others answer, onlookers vote answers (and comments on answers) up and down.  The question pages are well done and easy to read and digest.</p>

<p>I only wish that it were a little more&#8230; social and personalized. Seriously. This is not something that I usually wish. I&#8217;d like to use the site for learning and helping others but right now it seems (mostly) suited for asking questions and helping others if you are either really dedicated or lucky enough to stumble over questions that you know the answer to.</p>

<p>Here are some things that I&#8217;d love to see. I&#8217;d post these in <a href="http://meta.stackoverflow.com">meta.stackoverflow</a> but I&#8217;m too lazy to see if they&#8217;ve been suggested already and I&#8217;m a little scared of the community over there. Ironic, eh? For the Love of Ravelry is similar. Participating on a totally different site is definitely helping me see things that can be improved on Ravelry when it comes to community and participation.</p>

<p>My wishes. It&#8217;s very possible that I&#8217;m either doing it wrong, missing something that exists, or just missing the point, but here they are:</p>

<ul>
<li>Friending or following - some way to watch questions and answers from people who consistently post things that seem interesting or educational (to me). I know that I can do it by subscribing to tons of RSS feeds but&#8230;</li>
<li>Something other than tags for organization. Using piles of tags with no relationship or hierarchy makes browsing the piles of questions sort of painful.</li>
<li>Some sort of recommendation or matching tools that shows me questions that might interest me. Maybe based on my votes or something. &#8220;Interesting tags&#8221; isn&#8217;t working very well because of high volume and huge variation in questions tagged with things like &#8220;ruby&#8221; and &#8220;javascript&#8221;. </li>
</ul>

<p>I guess these all address the same problem - <strong>discovering questions that interest me is hard</strong>.</p>

<p>If you code for work or for fun and you haven&#8217;t seen it already, check it out&#8230; and if you are looking for the answer to a coding question, toss &#8220;site:stackoverflow.com&#8221; on the the end of your Google search before you try anything else.</p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/08/26/stack-overflow/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Our Internet Office</title>
		<link>http://codemonkey.ravelry.com/2009/06/30/our-internet-office/</link>
		<comments>http://codemonkey.ravelry.com/2009/06/30/our-internet-office/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 02:38:36 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Office]]></category>

		<category><![CDATA[campfire]]></category>

		<category><![CDATA[chat]]></category>

		<category><![CDATA[dropbox]]></category>

		<category><![CDATA[helpspot]]></category>

		<category><![CDATA[skitch]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/06/30/our-internet-office/</guid>
		<description><![CDATA[Like many little web businesses, our staff doesn&#8217;t all work in the same office. Jess and I work from our office or our home in Boston, Mary-Heather works from Albuquerque, and Sarah works from Houston.  There are lots of amazing tools that help us work together as a team and feel more connected and [...]]]></description>
			<content:encoded><![CDATA[<p>Like many little web businesses, our staff doesn&#8217;t all work in the same office. Jess and I work from our office or our home in Boston, Mary-Heather works from Albuquerque, and Sarah works from Houston.  There are lots of amazing tools that help us work together as a team and feel more connected and less isolated. Here are some of the things that we can&#8217;t live without:</p>

<h2>Campfire and Propane - team chat</h2>

<p>What would we do without team chat? <a href="http://campfirenow.com/">Campfire</a> is the web-based group chat that keeps our team connected throughout the day. With chat, we don&#8217;t feel like we are working alone, thousands of miles apart.</p>

<p>There are many web-based chat services but we like Campfire. It works well for our needs and there are some great ways to extend it. <a href="http://propaneapp.com/">Propane</a> is an excellent tabbed native chat client for Macs that we use when we are at our own computers. <a href="http://overcommittedapps.com/ember/">Ember</a> is a Campfire client for iPhone&#8230; and we integrate Campfire with the rest of Ravelry through a Ruby API (Tinder) and built-in connections from our help desk / email support software.</p>

<p><img src="http://skitch.ravelry.com/Untitled_3-20090626-115838.png" border="0" style="border: none;"/></p>

<p><strong>Communicating without distracting</strong></p>

<p>Unlike IM, having a team chat gives us a way to have the a communications channel that doesn&#8217;t always demand immediate attention. We can leave notes for others to see when they have a chance, jump into a full on chat or meeting when we need to, and page one another visually by taking advantage of the <a href="http://growl.info/about.php">Growl</a> notifications that Propane offers.</p>

<p><strong>Email bad</strong></p>

<p>The last thing that we need is more email. Chat has given us a way to share information and discuss things without adding to our already-overwhelming email load.</p>

<p><strong>Integrating notifications</strong></p>

<p><img src="http://skitch.ravelry.com/Ravelry__ravelbot_s_profile-20090626-120847.png" style="float: left;"> Ravelbot, our automated chat robot, pops in to let us know about things that have occurred in Ravelry or in our customer service email that we may want to know about. We don&#8217;t want to have to check screens of important information or run reports but we also don&#8217;t want to deal with email notifications.</p>

<p>By using the different APIs that Campfire offers, we can connect our own software to chat so that we know about important events as they happen.</p>

<p><br/></p>

<p><img src="http://skitch.ravelry.com/Untitled_3-20090626-121440.png"></p>

<h2>Skitch - easy screen capture sharing</h2>

<p><img src="http://skitch.ravelry.com/skitched-20090626-121734.png" style="float: left; border:none; padding-right: 10px;"> We love <a href="http://plasq.com/skitch">Skitch</a> so much. A screen capture application doesn&#8217;t seem like a big deal but there are a few features that make it indispensable to us:</p>

<p><strong>Upload your capture in one click</strong>. We share screenshots of things in chat <strong>so much</strong> that it really is important that it is easy. Talking about things is so much faster when you immediately share a image from the site, someone else&#8217;s site, email, twitter, whatever. </li></p>

<p><strong>Upload to your own host</strong>. Since Skitch can upload any image (not just a screen capture) in one click, we save a lot of time by using it to store images that we post on the site, in forum posts, in blog entries, and in other places.  When we do these things, we definitely want to store the images on our own server for more permanence and less bandwidth concerns. Skitch can upload to any host via SFTP, FTP, or WebDAV.</p>

<p><strong>Easy annotating and drawing</strong>. Once you&#8217;ve got an image, it&#8217;s really easy to add arrows, text, draw, do whatever you want to do before you share with someone else.</p>

<p>Our Campfire chats are peppered with screenshots and annotated images and it really makes communicating a lot easier and a little more fun.</p>

<p><br clear="all" /></p>

<h2>Dropbox - file sharing that feels local</h2>

<p><img src="http://skitch.ravelry.com/skitched-20090626-124054.png" style="padding: 10px; border:none;float: left;">
Shared folders - sometimes you need them.  <a href="http://www.getdropbox.com/">Dropbox</a> is the best file-sharing application that I&#8217;ve ever used. The client works on Windows, Mac, Linux and provides you with a real shared folder on your machine that looks and acts like a normal local folder. The web site works well when you aren&#8217;t at your own computer. There are RSS feeds and Growl notifications for updates. There is a revision history in case you need to recover previous versions of a file&#8230;</p>

<p>Most importantly, the syncing in the background is transparent and seamless. A copy of your files are stored on each machine that is configured to use Dropbox and the application takes care of the syncing for you in the background. If you aren&#8217;t connected to the Internet, you still have your files, and if you make changes they are synchronized when you next connect.</p>

<h2>Email - Helpspot</h2>

<p><img src="http://skitch.ravelry.com/skitched-20090630-223717.png" style="padding: 10px; border: none;"></p>

<p>Gmail is one good way of easily sharing general email boxes and linking to individual messages if you want to talk about them.  We started out using shared IMAP accounts (regular email accounts) because all of us have mail clients that we prefer to Gmail  - Pine for me, Apple Mail for Jess and MH. As we&#8217;ve grown, it has become harder to manage the volume of email and harder to keep track what is happening with  all of the individual users and other people that we communicate with.</p>

<p>We now use <a href="http://www.userscape.com/products/helpspot/">Helpspot</a> for most of our general mailboxes. Helpspot is a web-based email app that is aimed at customer support. Helpspot helps us work together in a few ways:</p>

<ul>
    <li> We can share links to messages when we need to talk about them</li>
    <li>Much like Gmail conversations, we can see history so that we can easily pick up on an existing conversation</li> 
   <li>I&#8217;ve integrated the Helpspot email with Ravelry itself so we can all see email histories in relevant places - this helps because a previous conversation that someone else had with a person may be important and this way we can know what is going on without asking (or discovering later)</li>
  <li> Helpspot has a Campfire API that we use to automatically push certain messages to chat so that we can all see and talk about certain types of issues/questions</li>
</ul>

<p>&#8230;and I ran out of steam. I&#8217;ll just post this now before I relegate it to the draft pile. I suppose I don&#8217;t really need to talk about Google Docs or Skype anyway <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Hopefully someone will find these things useful or interesting.</p>

<p>Is there anything that your office can&#8217;t live without?</p>

<p><strong>edit</strong> One little thing - we&#8217;ve been using <a href="http://oovoo.com">oovoo</a> for 3-way video chats. iChat seemed too bandwidth intensive and Skype only does 2-way video. oovoo has an ugly client but the service works pretty well.</p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/06/30/our-internet-office/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tasty Links / April 2009</title>
		<link>http://codemonkey.ravelry.com/2009/04/13/bucket-o-links-april-2009/</link>
		<comments>http://codemonkey.ravelry.com/2009/04/13/bucket-o-links-april-2009/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 03:12:49 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Linkblog]]></category>

		<category><![CDATA[Database]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[keyvalue]]></category>

		<category><![CDATA[kindle]]></category>

		<category><![CDATA[links]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[xeon]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/04/13/bucket-o-links-april-2009/</guid>
		<description><![CDATA[A collection of interesting and useful stuff that I collected during March - April. I&#8217;ve added a few comments to things that I&#8217;ve tried out or looked at further&#8230;


 Ruby GC Tuning - handy GC tuning info with performance notes from Evan W. at Twitter.  I adjusted part of Rav and got big response [...]]]></description>
			<content:encoded><![CDATA[<p>A collection of interesting and useful stuff that I collected during March - April. I&#8217;ve added a few comments to things that I&#8217;ve tried out or looked at further&#8230;</p>

<ul>
<li> <a href="http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/"><strong>Ruby</strong> GC Tuning</a> - handy GC tuning info with performance notes from Evan W. at Twitter.  I adjusted part of Rav and got big response time improvements and CPU usage improvements that were in line with the numbers that Evan posted. I posted a little graph in his comments.</li>
<li><a href="http://www.igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store/">Tokyo Cabinet and Tokyo Tyrant</a> - a super fast <strong>key/value store</strong> and memcached-speaking server component (respectively). This came out of Japanese social network <a href="http://mixi.jp">mixi.jp</a>.  Tokyo is file-backed but is <a href="http://www.mikeperham.com/2009/03/08/tokyo-cabinet-vs-memcached/">nearly as fast as memcached</a> for most needs. We&#8217;ve been using this for the last couple weeks to store long-lived cache data that is a little big for memcached. See also <a href="http://www.scribd.com/doc/12016121/Tokyo-Cabinet-and-Tokyo-Tyrant-Presentation">this presentation on Scribd</a> and Plurk&#8217;s built-on-Tokyo <a href="http://opensource.plurk.com/LightCloud/">LightCloud</a>.</li>
<li><a href="http://www.niallkennedy.com/blog/2009/03/facebook-infrastructure-financing.html"><strong>Facebook</strong>&#8217;s growing infrastructure spend</a> - really interesting post from Niall Kennedy. The numbers showing Facebook users vs % of people with internet access per country are staggering.</li>
<li><strong>Kindle 2</strong> stuff - Jess recently got a Kindle and she is addicted to it. Some neat tricks:  <a href="http://www.mobileread.com/forums/showpost.php?p=400528&#038;postcount=150">change the screen saver</a>, <a href="http://blog.fsck.com/2009/04/savory.html">build in conversion of PDFs and epubs</a>
<li>For all <strong>Mac</strong> users who are interested in <strong>Ruby</strong> - check out the <a href="http://giantrobots.thoughtbot.com/2009/3/30/2009-rubyist-guide-mac-os-x-development-environment">2009 Rubyist&#8217;s guide to a Mac OS X development environment</a> from the robots over at Thoughtbot.</li>
<li>Sly - I haven&#8217;t really been following the <strong>Javascript selector</strong> speed wars lately but <a href="http://digitarald.de/journal/89737433/rolling-out-sly-the-javascript-selector-engine/">this thing looks crazy fast</a> (well, circa April 2009 crazy)<li>
<li>Speaking of crazy fast - the new Intel <strong>Xeon 5500</strong> Nehalem processors look pretty awesome. Faster, lower power consumption, DDR3 memory with a faster bus,  Power Boost (appears to be an auto overdrive/overclock?), Hyperthreading is back. This is a real upgrade and not just more cores and more GHz. I can&#8217;t turn up any nicely done benchmarks right now but here is <a href="http://www.theinquirer.net/inquirer/news/617/1051617/xeon-5500-servers-pay-months-claim">an overview</a>, <a href="http://download.intel.com/products/processor/xeon/dc55kprodbrief.pdf">PDF data sheet is here</a>, and the <a href="http://www.siliconmechanics.com/i22921/4-drive-server.php">Silicon Mechanics configurator</a> will give you some idea of how much these things cost.  </li>
<li><a href="http://www.omnigroup.com/applications/omnigraphsketcher/">OmniGraphSketcher</a> - finally, nice Mac OS software that you can use to turn raw data into nice looking <strong>graphs</strong>. I&#8217;ve only tried it on simple things so far.</li>
<li><a href="http://mt-hacks.com/20090302-realtime-twitter-search-results-on-google.html">Realtime <strong>Twitter Search</strong> Results for Google</a> - this Greasemonkey extension inserts Twitter search results into the top of your Google searches. Install it immediately. The realtime aspect changes everything - having this information inserted into my normal googling has been immensely useful and interesting.</li>
<li>Not purely technical - but kind of amazing. Individual musical performances in YouTube videos layered to create new audio &#038; visual compositions. I&#8217;d call them something simpler like &#8220;mash ups&#8221; if I could bring myself to use that phrase <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <a href="http://thru-you.com/#/videos/2/">THRU YOU | Kutiman mixes YouTube</a>.</li>
</ul>

<p>That&#8217;s it for this month!</p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/04/13/bucket-o-links-april-2009/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quick update: Ravelry runs on</title>
		<link>http://codemonkey.ravelry.com/2009/03/10/quick-update-ravelry-runs-on/</link>
		<comments>http://codemonkey.ravelry.com/2009/03/10/quick-update-ravelry-runs-on/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 04:30:43 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[Sysadmin]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[infrastructure]]></category>

		<category><![CDATA[nginx]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[search]]></category>

		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2009/03/10/quick-update-ravelry-runs-on/</guid>
		<description><![CDATA[Just a little something to get the ol&#8217; blog rolling again.

Last March, I wrote a tiny post that listed a few of the pieces that run Ravelry along with my opinion of each. Here is a update to that list. The biggest change? I&#8217;ve been  running Phusion Passenger + Apache as application servers for [...]]]></description>
			<content:encoded><![CDATA[<p>Just a little something to get the ol&#8217; blog rolling again.</p>

<p>Last March, <a href="http://codemonkey.ravelry.com/2008/05/12/i-had-it-coming/">I wrote a tiny post</a> that listed a few of the pieces that run Ravelry along with my opinion of each. Here is a update to that list. The biggest change? I&#8217;ve been  running Phusion Passenger + Apache as application servers for the last several months.</p>

<p><img src="http://skitch.ravelry.com/phusion-20090311-003251.png"/></p>

<p><strong>As of March 2009, Ravelry runs on&#8230;.</strong></p>

<ul><li> <a href="http://www.rubyonrails.org">Ruby on Rails 2.2</a>: Still love it. </li>
<li> <a href="http://www.modrails.com/">Phusion Passenger</a>: Replaced Thin/Mongrel. Passenger plus Ruby Enterprise Edition uses less memory, avoids memory leaks, and it spawns and retires Ruby processes as needed. I also like that you can get a fair amount of status and debugging information if you need it. It looks like Passenger is the new standard for Ruby deployment. The only downside? Hot deployments of new versions of the app were causing lots of trouble for me (<a href="http://groups.google.com/group/phusion-passenger/browse_thread/thread/954171096e17c6f5">Google Groups thread</a> here).  I ended up putting together a Capistrano script that removes each Passenger from load balancer, updates and stops/starts Apache once it is cold, puts it back into the loop, and moves on the the next app server.  </li>

<li> <a href="http://wiki.codemongers.com/Main">nginx</a>: Still rocks. fast, memory efficient, stable, trouble free. We&#8217;re running two now. </li>
<li> <a href="http://haproxy.1wt.eu/">haproxy</a>: Still rocks. I&#8217;m using it to load balance HTTP requests across Apaches and provide failover for search and another service. </li>
<li> <a href="http://www.sphinxsearch.com/">Sphinx</a>: Still love it. If your site has any search needs, you&#8217;ve got to try it. </li>
<li> <a href="http://xph.us/software/beanstalkd/">beanstalkd</a>: beanstalkd + a few simple Rails runner script daemons are my new solution for running background jobs and processing file uploads.  This is a huge improvement over backgroundrb: much simpler, much more stable. I&#8217;ve never had a problem with beanstalkd. Background jobs used to be a very brittle part of our architecture and now I rarely think about them. </li>
<li><a href="http://www.percona.com/docs/wiki/release:start">Percona MySQL 5.0.x build</a>: MySQL 5 has been rock solid for me. MySQL 5.1 was not. I&#8217;ve been running MySQL 5.1 on my slaves and I&#8217;ve found that they do a better job of picking up replication after a restart or other problem. Although I&#8217;d love the fast index creation feature that the InnoDB plugin provides, I have no plans to upgrade the main database to 5.1. However, I would like to bump up to one of the newer <a href="http://ourdelta.org/">OurDelta MySQL 5 builds</a>. </li>
<li>Other stuff: I&#8217;m still very happy with <a href="http://www.nagios.org">Nagios</a> for monitoring, <a href="http://munin.projects.linpro.no/">Munin</a> for perfomance graphs, <a href="http://www.postfix.org">Postfix</a> for mail, <a href="http://www.xen.org">Xen</a> for virtualization, and <a href="http://www.gentoo.org">Gentoo</a> as my Linux of choice.</li>
</ul>

<p><strong>Updated</strong> to add a little diagram that shows how the web/application tier fits together.</p>

<p><img src="http://skitch.ravelry.com/Untitled-20090311-021516.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2009/03/10/quick-update-ravelry-runs-on/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upgrading from Rails 2.0 (ish) to Rails 2.2</title>
		<link>http://codemonkey.ravelry.com/2008/12/03/upgrading-from-rails-20-ish-to-rails-22/</link>
		<comments>http://codemonkey.ravelry.com/2008/12/03/upgrading-from-rails-20-ish-to-rails-22/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 21:39:55 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2008/12/03/upgrading-from-rails-20-ish-to-rails-22/</guid>
		<description><![CDATA[

Look out - this post is going to be a bit dry.

Over the Thanksgiving weekend, I upgraded Ravelry from a crusty old nearly-2.0 version of Edge Rails to the latest 2.2.2. Other people&#8217;s upgrade war stories were really helpful so I figured that I&#8217;d post my own. (See also gusg.us&#8217;s 2.2 story, assaydepot&#8217;s 2.1 story)

Here [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm2.static.flickr.com/1241/747588843_4c535c81e2_m_d.jpg" style="float: left;"></p>

<p>Look out - this post is going to be a bit dry.</p>

<p>Over the Thanksgiving weekend, I upgraded Ravelry from a crusty old nearly-2.0 version of Edge Rails to the latest 2.2.2. Other people&#8217;s upgrade war stories were really helpful so I figured that I&#8217;d post my own. (See also <a href="http://gusg.us/code/ruby/rails-2_2-headaches-1">gusg.us&#8217;s 2.2 story</a>, <a href="http://blog.assaydepot.com/2008/5/23/upgrade-to-rails-2-1-0_rc1">assaydepot&#8217;s 2.1 story</a>)</p>

<p>Here are the things that had to be fixed or tweaked:</p>

<p><br clear="all" /></p>

<dl>
  <dt> environment.rb</dt>
  <dd>I moved a bunch of stuff out of here into the <tt>config/initializers</tt> directory. Much neater.  I also <a href="http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies">config.gem</a>&#8216;d my gems.</dd>

   <dt>cache_fu plugin</dt>
   <dd>Broken. Upgrading to the <a href="http://github.com/defunkt/cache_fu/tree/master">latest source</a> from github made it all better.</dd>

   <dt>memcached gem</dt>
   <dd>I use Evan Weaver&#8217;s <a href="http://blog.evanweaver.com/articles/2008/01/21/b-the-fastest-u-can-b-memcached/">juiced up</a> memcached client. Upgrading to the <a href="http://github.com/fauna/memcached/tree/master">latest source</a> from github made it all better.</dd>

  <dt>xss_terminate plugin</dt>
   <dd>I&#8217;m using xss_terminate for sanitizing input and I needed to add a little patch to an initializer to make the plugin work properly: <a href="http://code.google.com/p/xssterminate/issues/detail?id=3#c0">http://code.google.com/p/xssterminate/issues/detail?id=3#c0</a>

  <dt> exception_notification plugin</dt>
   <dd>
       Wasn&#8217;t working right, but I&#8217;m using <a href="http://www.hoptoadapp.com/welcome">HopToad</a> now so I just trashed it.
  </dd>

   <dt>acts_as_versioned</dt>
   <dd>
      I read that weird stuff would happen with older acts_as_versioned and the new dirty attributes/partial updates. Upgraded to the <a href="http://github.com/technoweenie/acts_as_versioned/tree/master">latest source</a>. Unfortunately, the newer version seems to handle version columns differently. I was previously using &#8220;acts_as_versioned :version_column => &#8216;lock_version&#8217;&#8221; to base the &#8220;version&#8221; column in the versioned table off of the model&#8217;s &#8220;lock_version&#8221;. Now it wants both to be called &#8220;lock_version&#8221;. I just patched it for now.
   </dd>

  <dt>RFPDF plugin</dt>
   <dd>Broken. Changed init.rb from <tt>ActionView::Base::register_template_handler &#8216;rfpdf&#8217;, RFPDF::View </tt> to <tt>ActionView::Template::register_template_handler &#8216;rfpdf&#8217;, RFPDF::View</tt>

   <dt>rails_asset_id in ActionView::Helpers::AssetTagHelper</dt> 
    <dd>Gone.  Reworked some helper code - I didn&#8217;t need it anyway.</dd>

   <dt>attachment_fu<dt>
   <dd>
      Broken by ActiveRecord changes. Here is the fix: <a href="http://ar-code.lighthouseapp.com/projects/35/tickets/25-edge-callback-overrides-inconsistently-pass-arguments
">http://ar-code.lighthouseapp.com/projects/35/tickets/25-edge-callback-overrides-inconsistently-pass-arguments</a>
   </dd>

    <dt>active_form</dt>
    <dd>More small breakage. Here is the fix: <a href="http://github.com/valda/active_form/commit/c77f3fd820766a53152c6a642e98c50d7279b1bb">http://github.com/valda/active_form&#8230;</a></dd>

     <dt>has_many_polymorphs plugin</dt>
     <dd>Oh god - has_many_polymorphs was a nightmare (as expected). I upgraded to <a href="http://github.com/fauna/has_many_polymorphs/tree/master">the latest</a> and then had to fix broken stuff for a while. I don&#8217;t know what version I was using before but stuff changed. ack.  
     </dd>

    <dt>prototype.js</dt>
    <dd>
      Sadly, I&#8217;m still using a pre 1.6 version of Prototype and now was not the time to upgrade that as well <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />       I had to implement Element.Insert in Javascript because the RJS stuff was changed to use that instead of Insertion (which was deprecated)  You can see the change that I&#8217;m referring to here: <a href="http://github.com/rails/rails/commit/eaab895f83276674891227c656df9b4cebc50200">http://github.com/rails/rails/commit&#8230;</a>
   </dd>

</dl>

<p>That&#8217;s it! Also, <a href="http://www.hoptoadapp.com">HopToad</a> was a great help in finding a few small bugs and glitches once I pushed the upgraded version out to production.</p>

<h2>Now what?</h2>

<p>I&#8217;m going to go back to fun Ravelry-improving work for a while. Still, I&#8217;d like to move to Git. &#8230;and maybe take the latest JRuby out for a test-drive. The total amount of memory that our Mongrels (Thins) consume is pretty embarrassing and things are heating up in the JRuby world with faster releases, a more threadsafe Rails, and so on&#8230;</p>

<p><small> Toolbox photo from Flickr/<a href="http://www.flickr.com/photos/mamabarns/747588843/">mamabarns </a>.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2008/12/03/upgrading-from-rails-20-ish-to-rails-22/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tracking down some application problems with Ruby on Rails, MySQL</title>
		<link>http://codemonkey.ravelry.com/2008/09/09/finally-tracked-down-some-performance-problems-with-ruby-mysql/</link>
		<comments>http://codemonkey.ravelry.com/2008/09/09/finally-tracked-down-some-performance-problems-with-ruby-mysql/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 21:53:40 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2008/09/09/finally-tracked-down-some-performance-problems-with-ruby-mysql/</guid>
		<description><![CDATA[I took care of a couple long standing issues this week and I wanted to quickly talk about them.

Tracking down Ruby/Rails memory leaks

Memory leaks are no fun. We sprouted a big leak about a month ago: Ruby VMs would get all bloated, often hitting 300-400 MB and sometimes consuming even more ridiculous amounts of memory.



I [...]]]></description>
			<content:encoded><![CDATA[<p>I took care of a couple long standing issues this week and I wanted to quickly talk about them.</p>

<h2>Tracking down Ruby/Rails memory leaks</h2>

<p>Memory leaks are no fun. We sprouted a big leak about a month ago: Ruby VMs would get all bloated, often hitting 300-400 MB and sometimes consuming even more ridiculous amounts of memory.</p>

<p><img src="http://skitch.ravelry.com/ravelry%40tweed_%7E_%E2%80%94_ssh_%E2%80%94_173%C3%9752-20080909-181029.jpg" /></p>

<p>I run about 20 instances on each virtual server and a bunch of misbehaving instances could quickly eat up all of the memory.  Because restarting my mongrels (Thins, I mean) when they consume too much memory is pretty painless, I put off fixing it for a while.</p>

<p>This week, I tried using <a href="http://blog.evanweaver.com/files/doc/fauna/bleak_house/files/README.html">bleak_house</a> to figure out what sorts of objects were responsible for my VM bloat. I found nothing.</p>

<p>Then I learned something really important about Ruby&#8217;s garbage collection and heap maintenance. I don&#8217;t know how I missed out on learning this earlier. I&#8217;m going to quote a bit from <a href="http://www.lloydforge.org/index.rhtml/ruby/original_gc_rant.html">hacking on ruby&#8217;s garbage collector</a> at lloydforge.org since he explains it well.</p>

<ul>
<li> First important thing: &#8220;When ruby runs out of heap space, it first does a GC run to try to free something up, and then allocates a new heap. the new heap is 1.8 times larger than the last.&#8221;
<li> Second important thing: &#8220;Because of the way ruby works, objects may _never_ be moved around in heaps. That means from the time they&#8217;re allocated to the time they&#8217;re freed they may not be moved to a new memory address&#8221;
</ul>

<p>You see where I&#8217;m going with this?  Force ruby to build bigger and bigger heaps and you&#8217;ll probably never get that memory back. A single non-garbage object sitting on one of this heaps will keep it alive prevent you from getting that memory back. There is no heap compaction.</p>

<p>I read about some of the work that the Phusion guys had done on their ruby fork called <a href="http://izumi.plan99.net/blog/index.php/category/ruby-enterprise-edition/">&#8220;Ruby Enterprise Edition&#8221;</a> and noticed that they had added a handy debugging tool: <a href="http://www.rubyenterpriseedition.com/faq.html#debug_statistics">ObjectSpace.statistics</a>.</p>

<p>I installed Ruby EE, added some ObjectSpace.statistics logging to each request and ran it on one server for a half-day. Once I had my results, it only took a few minutes to spot the problem requests and fix them. Phluid&#8217;s Ruby EE prints out the number of objects, size of objects, number of heaps, and size of heaps so you can spot when a request is causing the creation of a new (large) heap.
 The culprit was just a stupid coding error in a rarely-hit action that loaded <strong>way</strong> too much data via Activerecord. The heap would balloon to a gigantic size and although the objects loaded would all become garbage, something prevented the memory from being given back.</p>

<p>This was a heap-related problem but I think that these ObjectSpace statistics would be equally valuable for finding the reference-related leaks.  You probably wouldn&#8217;t be able to eyeball the data like I did but you could add up the growth in # of objects and bytes across a large number of requests and come up with a few suspicious actions. The really nice thing is that I was able to set up this logging in production without impacting the site in any way.</p>

<h2>Tracking down MySQL performance problems</h2>

<p>If you are running MySQL, you should consider using one of the Percona patched versions:
<a href="http://www.mysqlperformanceblog.com/2008/07/16/mysql-releases-with-percona-patches/">http://www.mysqlperformanceblog.com/2008/07/16/mysql-releases-with-percona-patches/</a></p>

<p>The Google SHOW INDEX_STATISTICS patch is great - you can use it as part of your index tuning and pruning because it will show you which indexes are being hit.</p>

<p>The microslow patch turned out to be an extremely valuable tool for finding problem queries.  We have far too much query traffic to log all of it and MySQLs &#8220;slow query&#8221; log only works as whole second precision.  In our case, we had some slow queries that were beating up the IO subsystem and they weren&#8217;t easy to spot until brought up the patched MySQL and set the threshold to 300 milliseconds (instead of 1 second).</p>

<p>I ended up breaking up a very large table into an InnoDB table with all of the important information and indexes and a MyISAM table containing the blobs (text columns).  I changed a few lines of code on the application side to make things work with the new split table, and voila:</p>

<p><img src="http://skitch.ravelry.com/Munin____ravelry.com____thrum.ravelry.com____iostat-20080909-175719.jpg"/></p>

<p>okay. I&#8217;ve run out of steam&#8230;</p>

<p>In other news - we hit a milestone of sorts by nearly making the <a href="http://www.alexa.com/data/details/traffic_details/ravelry.com">Alexa 10,000</a> this month. We&#8217;re at 10,032 <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2008/09/09/finally-tracked-down-some-performance-problems-with-ruby-mysql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Beta testing and beyond</title>
		<link>http://codemonkey.ravelry.com/2008/06/29/beta-testing-and-beyond/</link>
		<comments>http://codemonkey.ravelry.com/2008/06/29/beta-testing-and-beyond/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 16:19:36 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Community]]></category>

		<category><![CDATA[beta]]></category>

		<category><![CDATA[bugs]]></category>

		<category><![CDATA[bugtracking]]></category>

		<category><![CDATA[feedback]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2008/06/29/beta-testing-and-beyond/</guid>
		<description><![CDATA[Ravelry is still officially in &#8220;beta&#8221;.   This word has been drained of most of its meaning in today&#8217;s web but here is what it means to me (and hopefully our users):  the site is being very actively developed and things will change, unfinished &#8220;trial&#8221; features will be introduced, there will be bugs. [...]]]></description>
			<content:encoded><![CDATA[<p>Ravelry is still officially in &#8220;beta&#8221;.   This word has been drained of most of its meaning in today&#8217;s web but here is what it means to me (and hopefully our users):  the site is being very actively developed and things will change, unfinished &#8220;trial&#8221; features will be introduced, there will be bugs.  In the last 365 days, there have been 241 releases where a new version of the code is pushed out to the production site.</p>

<p>As an aside - I&#8217;m looking into doing away with the beta label and having beta testing being an opt-in thing for users who want to be guinea pigs. We&#8217;re approaching 150,000 registered users and not everyone realizes that they often part of an experiment - this ends up creating more work for us in the form of questions (and sometimes, complaints)</p>

<p>Our users have been incredible - they report bugs of all kinds, come up with tons of great ideas and suggestions, enter things into our issue tracking system, and comment on existing issue.  Here is how we do it:</p>

<h2>Collecting feedback</h2>

<p><img src="http://skitch.ravelry.com/Ravelry__discussions-20080629-112410.png" border="0" style="border:none;"></p>

<p>Some sites collect feedback from beta testers with an email form. Don&#8217;t do this. All of your users need to be able to see and read the bug reports and ideas that everyone else is sending in.  Working as a group is more efficient (less duplication), more productive (because small what-ifs can turn into great ideas through conversation) and more fun.</p>

<p>We set up one board in our forums that is specifically for talking about Ravelry itself.  The board isn&#8217;t limited to feature requests and bug reports - it is a place for any kind of Ravelry talk like &#8220;Who has the biggest stash on Ravelry?&#8221;.  In the last 30 days, 2300 people have posted on this board and 18000 people have read this board.  hm&#8230; I guess I have to come up with some ideas to drum up participation - people who aren&#8217;t reading are missing out on their chance to shape the site.</p>

<h2>Keeping Track</h2>

<p>Our Ravelry discussion board contains 97,000 posts. We can&#8217;t use the board itself to help us track, categorize, and update all of the bug reports and suggestions. Even if we tried to do it by keeping the threads themselves excessively organized and moderated, we&#8217;d be sure to lose things.</p>

<p>So&#8230; we have an issue tracking system (The List) built in to Ravelry.  Jess, Mary-Heather, myself, and 30ish other Ravelry users called &#8220;trackers&#8221; have the ability to turn posts in the forums into new issues in our system.   When people post bug reports or suggestions we all try to  either add them to The List or connect them up to existing entries. You can see that the post below has 1 agree vote and 1 disagree - sometimes the agree/disagree votes that are part of our forums can be helpful when we are looking at suggestions.</p>

<p><img src="http://skitch.ravelry.com/Ravelry__discussion_topic_-_Idea__Separate_category_for_doilies-20080629-114435.png" style="border:none;"></p>

<p><img src="http://skitch.ravelry.com/Ravelry__discussion_topic_-_Bug_Reports__June_2008-20080629-114745.png" style="border:none;"></p>

<h2>Now what?</h2>

<p>When I am not actively working on them, the list items serve several purposes:</p>

<ul>
<li>Users can search The List to see if their suggestion or bug report has already been brought up
<li>Trackers can connect future forum posts to list items in case people have more or different information to share. This happens a lot and it is handy to have slightly different bug reports attached to bugs and further thoughts attached to suggestions.
<li>All users can comment on items and I read these comments when I set out to work on something.
</ul>

<p>Although I do have some basic prioritization type features to The List itself, I do all of my work-gathering and organizing outside of Ravelry. I tend to go into the list, gather a set of items that fit with what I am working on, and take those back to my virtual work area so that I can sort through them, read comments, and organize.</p>

<p><img src="http://skitch.ravelry.com/skitched-20080629-121322.png" style="border:none;"/></p>

<p><img src="http://skitch.ravelry.com/Untitled_2-20080629-120620.png" style="border:none;"/></p>

<p>I&#8217;m really happy with this. I enjoy talking with Ravelers about the site and getting ideas and help from them. I&#8217;m also very glad that I don&#8217;t have to worry as much about losing good ideas and bug reports in a sea of posts. <strong>Ravelry Users</strong>:  You can find the <a href="http://www.ravelry.com/discuss/for-the-love-of-ravelry/topics">For the Love of Ravelry</a> (FTLoR) board and a link to <a href="http://www.ravelry.com/issues/list">The List</a> on the forums tab. As always -  if you have ideas on how we can improve tracking and The List, we&#8217;d love to hear them. Just make sure to post them in FTLoR so that we can track them <img src='http://codemonkey.ravelry.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2008/06/29/beta-testing-and-beyond/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Friday notes</title>
		<link>http://codemonkey.ravelry.com/2008/05/30/friday-notes/</link>
		<comments>http://codemonkey.ravelry.com/2008/05/30/friday-notes/#comments</comments>
		<pubDate>Fri, 30 May 2008 16:02:04 +0000</pubDate>
		<dc:creator>casey</dc:creator>
		
		<category><![CDATA[Blah]]></category>

		<category><![CDATA[books]]></category>

		<category><![CDATA[etc]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://codemonkey.ravelry.com/2008/05/30/friday-notes/</guid>
		<description><![CDATA[Just a few assorted things that I thought I would share:

MySQL 5.1 rc

I&#8217;m still having a problem with MySQL 5.1 hanging.  I removed the innodb plugin as an experiment and now I&#8217;m pretty sure that it is a bug in MySQL. Not only is it suspicious that the same workload never caused deadlocks in [...]]]></description>
			<content:encoded><![CDATA[<p>Just a few assorted things that I thought I would share:</p>

<p><strong>MySQL 5.1 rc</strong></p>

<p>I&#8217;m still having a problem with MySQL 5.1 hanging.  I removed the innodb plugin as an experiment and now I&#8217;m pretty sure that it is a bug in MySQL. Not only is it suspicious that the same workload never caused deadlocks in 5.0, I&#8217;m pretty sure that either  innodb&#8217;s lock detection or the fallback lock_wait_timeout should be kicking in.</p>

<p>I&#8217;ll probably <a href="http://dev.mysql.com/doc/refman/5.1/en/downgrading-to-5-0.html">downgrade to 5.0</a> soon. The before/after performance graphs will be interesting.</p>

<p><strong>Reading</strong></p>

<p>This week I read Clay Shirky&#8217;s &#8220;<a href="http://www.herecomeseverybody.org/">Here Comes Everybody</a>&#8221; and Josh Porter&#8217;s &#8220;<a href="http://bokardo.com/archives/designing-for-the-social-web-the-book/">Designing for the Social Web</a>&#8220;. Shirky&#8217;s book was great - try out some of his writings on <a href="http://www.shirky.com/#media_and_community">media and community</a> if you want a (free) taste.  Porter&#8217;s book was more of an ego booster - sort of a catalog of lessons that we&#8217;ve already learned. If you are working on a web site that will have human users, do pick it up. The book is concise and well organized and you&#8217;ll get &#42;something&#42; out of it (I did).</p>

<p><strong>Bookmarked this week</strong></p>

<ul>
<li><a href="http://www.presentationzen.com/">Presentation Zen</a> - Jess, MH, and I are going to be giving a 1 hour presentation at Knitter&#8217;s Connection in June. We don&#8217;t want it to suck, so I&#8217;ve been digging around for ideas. </li>
<li><a href="http://googleajaxsearchapi.blogspot.com/2008/05/speed-up-access-to-your-favorite.html">Google is hosting your favorite Javascript</a> framework for free. Speaking of free stuff from Google - I love the <a href="http://code.google.com/apis/chart/">Chart API</a>.</li>
<li>If you use last.fm, visualize the ebb and flow of artists with <a href="http://lastgraph3.aeracode.org/">Lastgraph</a>.</li>
<li> Rails stuff: <a href="http://www.akitaonrails.com/2008/5/25/rolling-with-rails-2-1-the-first-full-tutorial-part-1">Akita&#8217;s 2.1 rundown</a>, <a href="http://www.railsjedi.com/posts/22-Better-Partials-Plugin-for-Ruby-on-Rails">better_partials</a>, <a href="http://stonecode.svnrepository.com/ruport/trac.cgi/wiki/AARTutorial">acts_as_reportable</a>, <a href="http://woss.name/2008/04/09/using-git-submodules-to-track-vendorrails/">using git submodules to track plugins</a> (I haven&#8217;t made the jump to git yet but I&#8217;ve been playing with it and it is tempting).
</ul>
]]></content:encoded>
			<wfw:commentRss>http://codemonkey.ravelry.com/2008/05/30/friday-notes/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
