<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>zerosum dirt(nap) - Home</title>
  <id>tag:blog.zerosum.org,2010:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://blog.zerosum.org/" rel="alternate" type="text/html" />
  <updated>2010-07-28T20:18:33Z</updated>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ZerosumDirtnap" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="zerosumdirtnap" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2010-07-28:17658</id>
    <published>2010-07-28T20:17:00Z</published>
    <updated>2010-07-28T20:18:33Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="mailer" />
    <category term="rails3" />
    <category term="resque" />
    <link href="http://blog.zerosum.org/2010/7/28/resque-mailer-v1-0-0-with-rails-3-support" rel="alternate" type="text/html" />
    <title>Resque Mailer v1.0.0 (with Rails 3 Support)</title>
<content type="html">
            &lt;p&gt;I just released a new version of Resque Mailer (1.0.0), my asynchronous email delivery extension for Resque [&lt;a href="http://rubygems.org/gems/resque_mailer"&gt;gem&lt;/a&gt;] [&lt;a href="http://github.com/zapnap/resque_mailer"&gt;src&lt;/a&gt;]. If you're already using it with Rails 2.x, there really aren't any changes you need to be aware of. Go about your business. However, thanks largely to the efforts of &lt;a href="http://github.com/sickill"&gt;Marcin Kulik&lt;/a&gt;, the gem now works in Rails 3.x as well. Thanks Marcin!&lt;/p&gt;

&lt;p&gt;So why go 1.0.0? Because it's feature complete, used by a number of people in production, and has been stable without any significant feature additions or issues for quite some time. It's still simple as hell, and I don't see it getting more complicated any time soon. And now that it works on both Rails 2.x and 3.x, well, that sounds like a 1.0.0 to me.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2010-05-28:17037</id>
    <published>2010-05-28T12:20:00Z</published>
    <updated>2010-05-28T20:47:14Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="analytics" />
    <category term="google" />
    <category term="mogo" />
    <category term="oauth" />
    <link href="http://blog.zerosum.org/2010/5/28/google-analytics-integration-with-oauth" rel="alternate" type="text/html" />
    <title>Google Analytics Integration with OAuth</title>
<content type="html">
            &lt;p&gt;In case you’re not reading the &lt;a href="http://blog.mogotest.com"&gt;Mogo blog&lt;/a&gt;, I posted a tutorial over there yesterday about how we &lt;a href="http://mogotest.com/blog/2010/05/27/google-analytics-integration-oauth"&gt;integrate Google Analytics with Rails using OAuth&lt;/a&gt; and &lt;a href="http://github.com/vigetlabs/garb"&gt;Garb &lt;/a&gt;. It’s not a terribly arduous process, but if you haven’t done much work with OAuth it can be confusing, and there are a couple unique Googly things about it that might otherwise trip you up.&lt;/p&gt;


	&lt;p&gt;The post includes complete code for an OAuth-backed authorizations controller too, which should help you get up and running quickly. And fwiw, it should actually be applicable to all the Google Data APIs, not just Google Analytics. Just change the request token scope.&lt;/p&gt;


	&lt;p&gt;And yeah, I really need to get back to blogging on a semi-regular basis, too.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2010-03-12:15868</id>
    <published>2010-03-12T16:24:00Z</published>
    <updated>2010-03-12T16:30:25Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="railscamp" />
    <link href="http://blog.zerosum.org/2010/3/12/rails-camp-new-england-redux" rel="alternate" type="text/html" />
    <title>Rails Camp New England Redux</title>
<content type="html">
            &lt;p&gt;Already got plans for this weekend?&lt;/p&gt;


	&lt;p&gt;
The second &lt;a href="http://railscamps.com"&gt;Rails Camp&lt;/a&gt; New England is this weekend, March 12th to the 14th, in West Greenwich Rhode Island. Hope to see some of you there! Ask me about &lt;a href="http://mogotest.com"&gt;my new startup&lt;/a&gt; (want an invite?) or help  me fix some of the outstanding &lt;a href="http://rdoc.info"&gt;Rdoc.info&lt;/a&gt; &lt;a href="http://github.com/zapnap/rdocinfo"&gt;bugs&lt;/a&gt; if you’re looking for something to do :).&lt;/p&gt;


	&lt;p&gt;The last camp in &lt;a href="http://blog.zerosum.org/2009/7/22/rails-camp-new-england"&gt;summer of 2009&lt;/a&gt; was a great experience and I’ve been looking forward to a repeat. Thanks to &lt;a href="http://cardarella.blogspot.com/"&gt;Brian Cardarella&lt;/a&gt; for putting it together.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2010-01-09:14586</id>
    <published>2010-01-09T06:47:00Z</published>
    <updated>2010-01-09T16:01:07Z</updated>
    <category term="mail" />
    <category term="resque" />
    <link href="http://blog.zerosum.org/2010/1/9/resque-mailer" rel="alternate" type="text/html" />
    <title>Resque Mailer</title>
<content type="html">
            &lt;p&gt;We've been making heavy use of Chris Wanstrath's &lt;a href="http://github.com/defunkt/resque"&gt;Resque&lt;/a&gt; library in my &lt;a href="http://mogotest.com"&gt;latest project&lt;/a&gt;. Resque is a &lt;a href="http://code.google.com/p/redis/"&gt;Redis&lt;/a&gt;-based background job system that Chris built for GitHub. It's easy to use, especially if you're already leveraging Redis in other parts of your infrastructure, and also has a nice Sinatra front-end for monitoring job status.&lt;/p&gt;

&lt;p&gt;Anyway, Resque jobs are just Ruby classes that respond to the special perform method. They're placed on a queue &amp;mdash; you can place different jobs on different queues &amp;mdash; and later, a worker polls the queue, pops the jobs off and performs the task.&lt;/p&gt;

&lt;p&gt;We have a number of different asynchronous jobs happening in Mogo, many of which are domain-specific. But one thing we're doing that's very common is using the background system to process mail delivery asynchronously. Because synchronous mail delivery is for jerks.&lt;/p&gt;

&lt;p&gt;Outgoing mail in a Rails app is generally handled by &lt;a href="http://am.rubyonrails.org/"&gt;ActionMailer&lt;/a&gt;, which expects you to implement message delivery types as class methods on an ActionMailer "model" (a butchering of the term). So a typical mailer might look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Notifications &amp;lt; ActionMailer::Base

  def signup(user_id, sent_at = Time.now)
    @user = User.find(user_id)

    subject    'Welcome to Mogo'
    recipients @user.email
    from       'Mogoterra &amp;lt;noreply@mogoterra.com&amp;gt;'
    sent_on    sent_at
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, to send a signup message, you use the following method call from somewhere else in your codebase:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Notifications.deliver_signup(@user.id)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So this all works good but it's synchronous. You'd like to be able to background these tasks and use Resque. But you don't really want to mess around with the mailer implementation. Right? Me too. &lt;/p&gt;

&lt;p&gt;So &lt;a href="http://github.com/zapnap/resque_mailer"&gt;ResqueMailer&lt;/a&gt; does just that.&lt;/p&gt;

&lt;p&gt;Following in the footsteps of &lt;a href="http://github.com/andersondias/delayed_job_mailer"&gt;DelayedJobMailer&lt;/a&gt;, ResqueMailer allows you to shift processing of your existing mailers to an async Resque worker without doing pretty much anything. Just install the gem in your Rails project (via &lt;a href="http://gemcutter.org/gems/resque_mailer"&gt;Gemcutter&lt;/a&gt;) and then mix the &lt;code&gt;Resque::Mailer&lt;/code&gt; module into your mailer.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Notifications &amp;lt; ActionMailer::Base
  include Resque::Mailer

  # ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You'll need to restart your Resque workers and make sure at least one of them is working on the special &lt;code&gt;mailer&lt;/code&gt; queue (or * for all queues). Now when you call &lt;code&gt;MyMailer.deliver_signup&lt;/code&gt;, the task will be placed on the mailer queue and processed by the first qualifying worker.&lt;/p&gt;

&lt;p&gt;It's always nice when a tiny amount of code makes a task transparent. Check out the &lt;a href="http://github.com/zapnap/resque_mailer"&gt;project page&lt;/a&gt; on GitHub for more information.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-11-22:12647</id>
    <published>2009-11-22T19:21:00Z</published>
    <updated>2009-11-22T19:24:12Z</updated>
    <category term="ruby" />
    <category term="rdoc" />
    <category term="rdocinfo" />
    <category term="yard" />
    <link href="http://blog.zerosum.org/2009/11/22/rdoc-info-updated-2" rel="alternate" type="text/html" />
    <title>Rdoc.info Updated</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://rdoc.info"&gt;Rdoc.info&lt;/a&gt; is now serving up fresh docs using &lt;a href="http://gnuu.org/2009/11/15/yard-0-4-0-the-whole-nine/"&gt;&lt;span class="caps"&gt;YARD&lt;/span&gt; 0.4.0&lt;/a&gt;. Doesn’t that new template look nice?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you’re a Ruby &lt;span class="caps"&gt;OSS&lt;/span&gt; developer and haven’t checked out &lt;a href="http://github.com/lsegal/yard"&gt;&lt;span class="caps"&gt;YARD&lt;/span&gt;&lt;/a&gt; yet, you really should. It’s easily the best way to generate sexy documentation for your projects and Loren has done a really awesome job with the latest release. The experimental new &lt;a href="http://yardoc.org/docs"&gt;live docs service&lt;/a&gt; (with php.net-style user comments) that he’s testing out is swanky too, and we hope to roll this stuff into Rdoc.info shortly.&lt;/p&gt;
&lt;p&gt;In the meantime, you can enjoy the latest &lt;span class="caps"&gt;YARD&lt;/span&gt; features and an updated look and feel. Make sure to &lt;a href="http://rdoc.info/projects/new"&gt;add a post-commit hook&lt;/a&gt; to your &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;-hosted project and we’ll automatically rebuild docs whenever you push a new release to your remote. Docs for older versions are maintained as well, and accessible via the usual commit hash url [&lt;a href="http://rdoc.info/projects/jeffkreeftmeijer/tumblr/blob/0c9dabcf9dd9afbc442be0be573ba3a476640373"&gt;example&lt;/a&gt;].&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-11-17:12332</id>
    <published>2009-11-17T06:12:00Z</published>
    <updated>2009-11-17T14:48:11Z</updated>
    <category term="nhruby" />
    <category term="rails" />
    <category term="ruby" />
    <category term="ec2" />
    <category term="rubber" />
    <link href="http://blog.zerosum.org/2009/11/17/ec2-deployment-with-rubber" rel="alternate" type="text/html" />
    <title>EC2 Deployment with Rubber</title>
<content type="html">
            &lt;p&gt;At &lt;a href="http://nhruby.org"&gt;NH.rb&lt;/a&gt; last night I gave a talk about &lt;a href="http://zapnap.github.com/presentations/ec2-rubber"&gt;deploying web applications to the EC2 cloud with Rubber&lt;/a&gt;. Rubber is an extension to &lt;a href="http://capify.org"&gt;Capistrano&lt;/a&gt; written by Matt Conway that makes provisioning and managing multi-instance EC2 deployments magically delicious [&lt;a href="http://github.com/wr0ngway/rubber"&gt;GitHub&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Want to bring up an instant multi-role staging server fully loaded with Apache, Passenger, MySQL, and your Rails app? All gem’d up, migrated, and ready to use? Sure you do. First, &lt;a href="http://aws.amazon.com/ec2"&gt;sign up for an EC2 account&lt;/a&gt;, generate your keypair, and then…&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install rubber

cd my-rails-project
script/generate vulcanize complete_passenger_mysql
edit config/rubber/rubber.yml

cap rubber:create_staging
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It uses a Ubuntu &lt;span class="caps"&gt;AMI&lt;/span&gt; and provisions an EC2 small instance by default. If you added your account credentials and the apt packages and gems you needed to rubber.yml (and provided that there weren’t any unexpected problems), you should now have a fully functional staging server for your web app that you can visit at http://appname.your-domain.com.&lt;/p&gt;
&lt;p&gt;Since it’s EC2 you only pay for what you use. What’s more is you can horizontally scale this out with relative ease — breaking out the individual roles to separate instances as needed — and/or add your own custom roles as needed (see the other templates available for examples).&lt;/p&gt;
&lt;p&gt;Want to learn more? Peep my &lt;a href="http://zapnap.github.com/presentations/ec2-rubber"&gt;slide deck&lt;/a&gt; and then check out the &lt;a href="http://wiki.github.com/wr0ngway/rubber"&gt;Rubber Wiki&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-11-15:12071</id>
    <published>2009-11-15T05:16:00Z</published>
    <updated>2009-11-15T17:37:20Z</updated>
    <category term="blogging" />
    <category term="ruby" />
    <category term="conferences" />
    <category term="podcamp" />
    <category term="twitter" />
    <link href="http://blog.zerosum.org/2009/11/15/reflections-on-podcamp" rel="alternate" type="text/html" />
    <title>Reflections on *Camp</title>
<content type="html">
            &lt;p&gt;Last weekend I attended the first-ever &lt;a href="http://podcampnh.com"&gt;New Hampshire PodCamp&lt;/a&gt;, organized chiefly by my friend &lt;a href="http://twitter.com/geechee_girl"&gt;Leslie Poston&lt;/a&gt; along with a crew of enthusiastic volunteer co-organizers (myself included). I only made it to the second of the two days due to prior obligations but had a good time and enjoyed meeting everyone.&lt;/p&gt;
&lt;p&gt;If you’ve never been to a PodCamp (I hadn’t) it’s sort of like a branded &lt;a href="http://www.barcamp.org/"&gt;BarCamp&lt;/a&gt; event that focuses more on how people are using technology — such as podcasting, blogging, social networks, video and music on the web — than on straight-up technical topics. I gave a presentation on &lt;a href="http://zapnap.github.com/presentations/pcnh"&gt;Developing Twitter Micro-Apps&lt;/a&gt;, which I think was pretty well received.&lt;/p&gt;
&lt;p&gt;We talked about why building apps that leverage existing social networks can be advantageous, how you can have fun with it, and how to get going really really quick with easy-to-use Ruby tools like &lt;a href="http://github.com/hayesdavis/grackle"&gt;Grackle&lt;/a&gt;, Rails templates, &lt;a href="http://github.com/mbleigh/twitter-auth"&gt;TwitterAuth&lt;/a&gt; (a Rails engine), Darcy’s &lt;a href="http://github.com/sutto/BirdGrinder"&gt;BirdGrinder toolkit&lt;/a&gt;, and my own simple &lt;a href="http://github.com/zapnap/retweet"&gt;Retweet&lt;/a&gt; / Sinatra recipes. You can &lt;a href="http://zapnap.github.com/presentations/pcnh"&gt;check out the slides&lt;/a&gt; if you want to learn more.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[ Note: The slides were made with &lt;a href="http://github.com/nakajima/slidedown"&gt;slidedown&lt;/a&gt;. Although it’s still a little rough in places, it’s quickly becoming my favorite tool for creating slideshows in plain text. ]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That’s me looking pretty intense, live-coding some Twittery shit during the talk. Because, I’m hardcore like that. Unfortunately I didn’t have anyone record the live-coding portions of the presentation, in which we built a conversation aggregator as well as a simple faux-popularity reporting service. Ah well. Other attendees gave talks on topics as various as building interactive and community television outlets on the web, Facebook app development, film promotion, digital photography, and creating Firefox add-ons.&lt;/p&gt;
&lt;p&gt;The event itself was held at the New Hampton school in &lt;del&gt;the middle of nowhere&lt;/del&gt; New Hampton, NH, which is about  an hour north of Manchester. It was quite isolated but the campus was beautiful and the solitude gave people a chance to get away from everything and kept everyone in one spot, resulting in less distractions and more focus on community. Although I really enjoy urban city-center events a lot — especially when they intelligently integrate other elements of the host city into after-hours events — there’s something really nice about isolated rural events (the first New England &lt;a href="http://blog.zerosum.org/2009/7/22/rails-camp-new-england"&gt;Railscamp&lt;/a&gt; was another example of this)&lt;/p&gt;
&lt;p&gt;As someone who has never been very involved in organizing non-&lt;a href="http://railsrumble.com"&gt;virtual&lt;/a&gt; conferences / events before, it was also interesting to observe and assist with the process of venue selection, sponsor lineup, and so on. In short: it’s a lot of work, but the payoff is great if it’s done well. Congrats and a big thank-you to Leslie (and all the other co-organizers) for putting this all together. There’s already talk of scheduling the next one for June 2010.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-10-14:11117</id>
    <published>2009-10-14T00:15:00Z</published>
    <updated>2009-10-15T01:10:43Z</updated>
    <category term="startups" />
    <link href="http://blog.zerosum.org/2009/10/14/notes-from-mit-startup-bootcamp" rel="alternate" type="text/html" />
    <title>Notes from MIT Startup Bootcamp</title>
<content type="html">
            &lt;p&gt;Yesterday (October 12th) I attended MIT’s &lt;a href="http://startupbootcamp.mit.edu/"&gt;Startup Bootcamp&lt;/a&gt;. As someone who is seriously thinking about taking some time off from his consulting lifestyle to work on bootstrapping a product, it was definitely a worthwhile event for me, and I’m glad I took good notes. I thought I’d share some of them in case you’re interested and couldn’t attend.&lt;/p&gt;
&lt;p&gt;(If you were there, and I got something wrong or you have something else to add, please leave a comment…)&lt;/p&gt;
&lt;p&gt;1. &lt;a href="http://blog.adamsmith.cc/"&gt;Adam Smith&lt;/a&gt; of &lt;a href="http://www.xobni.com/"&gt;Xobni&lt;/a&gt; (a Y-Combinator company). Adam was the first speaker of the day and did a nice job relating Xobni’s story. He talked at length about finding cofounders (“shake the friends tree”), their early days, angel funding, and achieving product-market fit. He stressed that being nimble is the key difference between successful and unsuccessful as a startup founder and mentioned how difficult — but necessary — it was for them to scrap an early product and change direction. “Don’t give up [on your idea],” Adam says, “90% of execution is keep going when everyone else gives up.”&lt;/p&gt;
&lt;p&gt;2. &lt;a href="http://alexisohanian.com/"&gt;Alexis Ohanian&lt;/a&gt; of &lt;a href="http://reddit.com"&gt;Reddit&lt;/a&gt; (a Y-Combinator company). An energetic speaker, Alexis talked about embracing your users, and the need for evangelists to spread your message through organic traffic (“web 2.0 aka labor 2.0”). He encouraged audience members to go above and beyond when interacting with their users. Make their experience memorable, weird, fascinating, amazing, much like Zappos overdelivering (literally) on their shipping. Alexis also stressed that you need to be down-to-earth — “you don’t need to be naturally charismatic, just don’t be a dick. Be root-for-able” — both in your dealing with your users as well as with your cofounders. Most of all, do something you love.&lt;/p&gt;
&lt;p&gt;3. &lt;a href="http://www.mit.edu/people/zolot/home.html"&gt;Ken Zolot&lt;/a&gt; of &lt;span class="caps"&gt;MIT&lt;/span&gt;. Ken is the founder of &lt;a href="http://entrepreneurship.mit.edu/"&gt;MIT’s Innovations Teams&lt;/a&gt; program. He talked briefly about what makes interesting technology the basis of a viable company or business, and how to make that transition. Ken also stressed the importance of good communication and having tangible results to show early on.&lt;/p&gt;
&lt;p&gt;4. Dan Theobald, &lt;a href="http://www.vecna.com"&gt;Vecna&lt;/a&gt;. As founder of a robots company, Dan’s background was an interesting contrast to his largely web 2.0-centric peers at this event. He talked extensively about the social responsibility of a good company and incentivizing your employees. Dan is also strongly opposed to over-use of venture capital, and advised the audience to only deal with it if absolutely necessary. “Other peoples money makes you stupid,” he quipped, “avoid it at all possible”. One of the most interesting passages from Dan’s talk was about how Vecna profit shares with their employees and uses a “peer to peer” points system (employees give “cookies” to one another to reward those who are providing value) to determine distributions.&lt;/p&gt;
&lt;p&gt;5. Kyle Vogt, &lt;a href="http://www.justin.tv/"&gt;Justin.tv&lt;/a&gt; (a Y-Combinator company). Kyle’s talk was centered around a list of “productivity hacks” but the most interesting portion of his talk was about how Justin.tv dealt with the failure of their original idea and, instead of giving up, used it as an opportunity to change direction and embrace a more mainstream approach to get to where they are today. Also, perhaps his most important advice: “stick to dot-com [domain names]”.&lt;/p&gt;
&lt;p&gt;6. &lt;a href="http://angusdavis.com/"&gt;Angus Davis&lt;/a&gt; of &lt;a href="http://tellme.com"&gt;Tellme&lt;/a&gt;. Angus, another enthusiastic speaker, related stories about Tellme’s rise and eventual acquisition by Microsoft. He also talked about his experience as an angel investor. His talk gets points for best use of technology as he employed a text messaging feedback system so audience members could tell him which vignettes they wanted to hear more about.&lt;/p&gt;
&lt;p&gt;7. &lt;a href="http://www.generalcatalyst.com/team/hemant_taneja"&gt;Hemant Teneja&lt;/a&gt; of &lt;a href="http://www.generalcataylst.com"&gt;General Catalyst Partners&lt;/a&gt;. Hemant, a venture capitalist with GC, talked not only about what GC looks for in prospective portfolio companies but also about what founders should look for in a VC, term sheets, and so on. An advocate of bootstrapping (is this rare for a VC?), he agreed with previous speakers that you should delay looking for VC unless you really need it, and make sure you’ve created something demonstrable and have a viable business strategy before you make that decision. What gets GC excited? Brilliant founders, solving “very hard” problems, addressing large markets, and being ahead of the curve.&lt;/p&gt;
&lt;p&gt;8. Dharmesh Shah, &lt;a href="http://www.hubspot.com/"&gt;Hubspot&lt;/a&gt; (and author of the popular &lt;a href="http://onstartups.com/"&gt;On Startups&lt;/a&gt; blog). Dharmesh apologized to the crowd at least once for not being a professional speaker, but this seemed largely unnecessary as he had one of the more polished presentations of the day (although he did run through it a bit fast!) His talk was basically a “marketing 101” for early stage founders. “How do you get customers with $0 budget?” he asked. The answer is through inbound, not outbound, marketing; building the best experience for those who are already looking for you or the products you offer through mechanisms like search engine optimization. “Make marketing about creativity, not cash” he counseled.&lt;/p&gt;
&lt;p&gt;9. &lt;a href="http://en.wikipedia.org/wiki/Robin_Chase"&gt;Robin Chase&lt;/a&gt; of &lt;a href="http://zipcar.com"&gt;Zipcar&lt;/a&gt; / &lt;a href="http://www.goloco.org"&gt;GoLoco&lt;/a&gt;. Robin talked candidly about the origin and growth of Zipcar, sustainability, and the challenges that are facing the world and environment, and how “doing good” can be a foundation for business opportunities, too. On the topic of inspiration vs execution she says that “execution is everything” and advised audience members to get started today, by building the absolute smallest thing that they can to start with. Luck is important, too, she admitted, and noted that luck happens when “preparation meets opportunity”. Be prepared!&lt;/p&gt;
&lt;p&gt;10. &lt;a href="http://en.wikipedia.org/wiki/Dan_Bricklin"&gt;Dan Bricklin&lt;/a&gt;, VisiCalc. Dan is an entrepreneur, programmer, and author. He created the first electronic spreadsheet application in 1979 and has been innovating ever since. Dan’s talk was a fast moving flurry of images from the early days, growth, and acquisition of VisiCalc and his company, Software Arts, and his experiences — both good and bad — as “an entrepreneur 30 years later”. His talk was refreshing and filled with humor. “You will live through things you do not expect”, Dan said as he was wrapping up.&lt;/p&gt;
&lt;p&gt;11. &lt;a href="http://en.wikipedia.org/wiki/Aaron_Swartz"&gt;Aaron Schwartz&lt;/a&gt; of Infogami / Reddit (a Y-Combinator company). At 14, Aaron co-authored the original &lt;span class="caps"&gt;RSS&lt;/span&gt; 1.0 specification, and has been active in the technology, entrepreneurial, and political action communities ever since. As part of the first Y-Combinator program, his company was eventually merged with Ohanian’s Redit. He talked about launching a startup and joked about what to not do (“the hollywood launch”) and what might be a better strategy (“the gmail launch”, incremental features and invitations).&lt;/p&gt;
&lt;p&gt;12. Drew Houston, &lt;a href="http://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt; (a Y-Combinator company). Drew’s startup, Dropbox, is now serving over 2.5 million users. Drew talked about his personal experiences from the creation of Dropbox to growing it to this point, and the challenges he faced along the way. He championed engineering-centric organizations and noted that “it’s much easier for engineers to pick up the business side than for business people to pick up the engineering side”. He also counseled the audience to “get in over their heads” and out of their comfort zones to learn things. Having friends in startups is tremendously helpful too; surround yourself with kindred spirits (which is why programs like Y-Combinator work so well).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-09-15:10610</id>
    <published>2009-09-15T13:29:00Z</published>
    <updated>2009-09-15T13:31:56Z</updated>
    <category term="agile" />
    <link href="http://blog.zerosum.org/2009/9/15/remote-pair-programming-resources" rel="alternate" type="text/html" />
    <title>Remote Pair Programming Resources</title>
<content type="html">
            &lt;p&gt;I usually don’t double-post or call out the articles I write for &lt;a href="http://dobbscodetalk.com"&gt;&lt;span class="caps"&gt;DDJ&lt;/span&gt; Code Talk&lt;/a&gt; too much here (links are in the sidebar), but I wanted to make sure that &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;amp;show=Remote-Pair-Programming-Resource.html&amp;amp;Itemid=29"&gt;this one&lt;/a&gt; got noticed.&lt;/p&gt;
&lt;p&gt;I’ve had the good fortune lately to be working with a client who really appreciates the power of pair programming (something I’ve been admittedly a bit slow to embrace in my role as a freelancer). Since I’m only on-site with their team 2 days a week, I’ve been forced to learn a fair bit about what’s available for remote pairing tools.&lt;/p&gt;
&lt;p&gt;Here’s the short summary: &lt;a href="http://www.gnu.org/software/screen/"&gt;Screen&lt;/a&gt; + &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; + &lt;a href="http://skype.com"&gt;Skype&lt;/a&gt; is a recipe for awesome. Read the &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;amp;show=Remote-Pair-Programming-Resource.html&amp;amp;Itemid=29"&gt;full article&lt;/a&gt; if you want to find out about other options.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-09-03:10242</id>
    <published>2009-09-03T01:27:00Z</published>
    <updated>2009-09-03T01:32:48Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="railsrumble" />
    <link href="http://blog.zerosum.org/2009/9/3/rumble-results-2" rel="alternate" type="text/html" />
    <title>Rumble Results</title>
<content type="html">
            &lt;p&gt;The &lt;a href="http://blog.railsrumble.com/2009/8/30/and-the-winner-is"&gt;results&lt;/a&gt; are in for the &lt;a href="http://r09.railsrumble.com"&gt;2009 Rails Rumble&lt;/a&gt;. Check em out and peep the winners. Some pretty impressive stuff for a single 48-hour sprint, right? Right!&lt;/p&gt;
&lt;p&gt;I’d like to personally thank all the &lt;a href="http://blog.railsrumble.com/sponsors"&gt;sponsors&lt;/a&gt;, &lt;a href="http://blog.railsrumble.com/judges/expert-panel"&gt;expert panelists&lt;/a&gt;, and especially the &lt;a href="http://r09.railsrumble.com/teams"&gt;contestants&lt;/a&gt; that made this years contest the best one yet. We’re looking forward to using the feedback we’ve received this year to make the next one even better, and starting to seriously discuss doing some more language/framework-agnostic events too.&lt;/p&gt;
&lt;p&gt;But first, we need a little bit of a break :). Some downtime next weekend sure will be nice!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-08-22:9934</id>
    <published>2009-08-22T18:13:00Z</published>
    <updated>2009-08-22T18:18:03Z</updated>
    <category term="rails" />
    <category term="railsrumble" />
    <link href="http://blog.zerosum.org/2009/8/22/rumble-build-weekend" rel="alternate" type="text/html" />
    <title>Rumble Build Weekend</title>
<content type="html">
            &lt;p&gt;This weekend is &lt;a href="http://search.twitter.com/search?q=railsrumble"&gt;Rails Rumble Build Weekend&lt;/a&gt;, which means that over 200 teams of 1-4 people are, at this very moment, working diligently (tirelessly!) to build the next &lt;a href="http://tastyplanner.com"&gt;awesome&lt;/a&gt; &lt;a href="http://meetinbetween.us"&gt;48-hour&lt;/a&gt; &lt;a href="http://qflip.net"&gt;micro-app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is the third year in a row we’ve run the contest and things seem to be going smoother than ever. Well, so far. Big thanks to &lt;a href="http://twtter.com/Sutto"&gt;Darcy Laycock&lt;/a&gt;, &lt;a href="http://twitter.com/erinshine"&gt;Erin Shine&lt;/a&gt;, and &lt;a href="http://neverlet.be"&gt;Jeff Rafter&lt;/a&gt; for being incredible co-conspirators, to all our competition &lt;a href="http://blog.railsrumble.com/sponsors"&gt;sponsors&lt;/a&gt;, and especially to the participants who are really pouring their everything into this. I can’t wait to see how some of these ideas turn out.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In case you’re curious, we’re running the voting process a little bit differently this year, and have assembled a fine panel of &lt;a href="http://blog.railsrumble.com/judges/expert-panel"&gt;expert judges&lt;/a&gt; to help qualify the best of the best before they go on to public voting. These people come from all corners of the web startup ecosystem and I’m really amazed that most of them were able to find the time in their busy schedules to help us out — we’re honored! So a big thanks to them, too.&lt;/p&gt;
&lt;p&gt;The competition wraps tomorrow (Sunday) night at midnight &lt;span class="caps"&gt;UTC&lt;/span&gt;, and then the expert panelists have a couple days to work their magic. Public voting should probably open on Thursday if all goes to schedule. If you’re not competing you can still &lt;a href="http://r09.railsrumble.com/login"&gt;register for an account&lt;/a&gt; and help us judge! For more information, head on over to the &lt;a href="http://r09.railsrumble.com"&gt;competition site&lt;/a&gt; or check out the &lt;a href="http://blog.railsrumble.com"&gt;blog&lt;/a&gt;. Make sure to subscribe for updates. Thanks!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-07-25:9348</id>
    <published>2009-07-25T21:47:00Z</published>
    <updated>2009-09-09T17:58:02Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="activerecord" />
    <category term="observable" />
    <category term="testing" />
    <link href="http://blog.zerosum.org/2009/7/25/testing-activerecord-observers" rel="alternate" type="text/html" />
    <title>Testing ActiveRecord Observers</title>
<content type="html">
            &lt;p&gt;Need to unit test those pesky ActiveRecord observers you’re using? I don’t use em often, but there are times when they’re definitely useful. Fortunately, since &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html"&gt;AR::Observer&lt;/a&gt; leverages Ruby’s &lt;a href="http://ruby-doc.org/core/classes/Observable.html"&gt;Observable&lt;/a&gt; module all you have to do is call &lt;tt&gt;MyModel.delete_observers&lt;/tt&gt; in your test setup or &lt;code&gt;before&lt;/code&gt; block.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ZombieSighting.delete_observers&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Better yet, add the exclusions to your test or spec helper file. Then you can unit test your models comfortably in isolation, and write tests for your observers that look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;describe Observer
  before(:each) do
    @obs = ZombieSightingObserver.instance
    @thing = Factory.build(:zombie_sighting)
  end

  it 'should generate a new notification' do
    lambda { 
      @obs.after_create(@thing)
    }.should change(Notification, :count)
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We wouldn’t want to couple zombie sightings too tightly with notifications, after all, as that might anger them even further (zombies are known to be crazy about &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;&lt;span class="caps"&gt;SRP&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-07-22:9230</id>
    <published>2009-07-22T03:17:00Z</published>
    <updated>2009-07-22T03:18:55Z</updated>
    <category term="railscamp" />
    <link href="http://blog.zerosum.org/2009/7/22/rails-camp-new-england" rel="alternate" type="text/html" />
    <title>Rails Camp New England</title>
<content type="html">
            &lt;p&gt;Last Friday, about 30 people descended on a large house in Bryant Pond, Maine for &lt;a href="http://railscamps.com"&gt;Rails Camp&lt;/a&gt; New England. Organizer &lt;a href="http://freelancing-gods.com"&gt;Pat Allan&lt;/a&gt; has been running Rails Camp events in the UK and his home nation of Australia for quite some time, but this was the very first North American event (co-organized by Boston.rb’s own &lt;a href="http://cardarella.blogspot.com"&gt;Brian Cardarella&lt;/a&gt;). Personally, I think it was a smashing success and I’m really glad I had the chance to be a part of it.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="http://picasaweb.google.com/tedroche/RailscampNorthEast2009#"&gt;weekend retreat&lt;/a&gt; basically consisted of group hacking and pair programming, lots of lively discussions, gaming, and plenty of R&amp;amp;R. Frisbee was played. Food was eaten. Canoes were canoed. &lt;a href="http://www.urbanterror.net"&gt;Urban Terror&lt;/a&gt; was instigated. Werewolves were slain by lakeside campfire light. Alcohol was consumed. In no particular order, of course.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In addition to the ever-important extra-curriculars, we had time to work on personal projects and share with others through a series of BarCamp-style sessions. These sessions included topics as diverse as Ruby Gems, &lt;a href="http://gemcutter.org"&gt;GemCutter&lt;/a&gt;, Internationalization, &lt;a href="http://couchdb.apache.org"&gt;CouchDB&lt;/a&gt;, and &lt;a href="http://radiantcms.org"&gt;RadiantCMS&lt;/a&gt;. There were also a number of app demos and lots of peer consulting and mentoring going on. Experience levels ranged from complete beginners to seasoned professionals, but all egos were checked at the door and everyone seemed to get along like old friends. Social games and sessions really helped people get to know one another, and keeping the event small meant that by the time you left, everyone was on a first-name basis.&lt;/p&gt;
&lt;p&gt;I’m not sure how (cough) &lt;strong&gt;productive&lt;/strong&gt; I was over the course of the weekend, but I sure had a great time, met a lot of interesting people, and learned a lot from them. If you’ve never attended anything like this I strongly encourage you to. It’s a great mix of learning and fun, and the freestyle format allows you to make of it what you want. A far better experience than any conference I’ve attended in the past year, imo, and far less costly at a mere $120 for the entire weekend, including all lodging and food.&lt;/p&gt;
&lt;p&gt;A big thanks to Pat and Brian for all their hard work, to &lt;a href="http://thoughtbot.com"&gt;Thoughtbot&lt;/a&gt; and &lt;a href="http://zendesk.com"&gt;ZenDesk&lt;/a&gt; for sponsoring, and to everyone else that showed up for being full of awesome. Hopefully we’ll do another RC New England event soon. I’m thinking that a mid-winter ski lodge excursion sounds like a damn good idea… Yeh?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-07-13:8975</id>
    <published>2009-07-13T19:03:00Z</published>
    <updated>2009-07-13T19:04:48Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="cucumber" />
    <category term="fakeweb" />
    <category term="oauth" />
    <category term="twitter" />
    <category term="webrat" />
    <link href="http://blog.zerosum.org/2009/7/13/twitter-auth-integration-testing" rel="alternate" type="text/html" />
    <title>TwitterAuth Integration Testing</title>
<content type="html">
            &lt;p&gt;Michael Bleigh’s &lt;a href="http://github.com/mbleigh/twitter-auth"&gt;TwitterAuth gem&lt;/a&gt; is truly full of awesome. It’s a complete OAuth authentication and &lt;span class="caps"&gt;API&lt;/span&gt; access solution for building Twitter apps with Rails. It uses familiar conventions borrowed from the Restful Authentication plugin, too. If you’re building a Rails-based app and you want to allow your users to &lt;a href="http://apiwiki.twitter.com/Sign-in-with-Twitter"&gt;Sign in with Twitter&lt;/a&gt; there’s just no better way to go.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For this particular app, I’m using the dynamic duo of &lt;a href="http://cukes.info"&gt;Cucumber&lt;/a&gt; and &lt;a href="http://github.com/brynary/webrat"&gt;Webrat&lt;/a&gt; to whip up integration tests. Since I initially stumbled a little bit when thinking about how to test integrated authentication against an external source like Twitter, I thought I’d doc the solution here in case other people were having the same issue.&lt;/p&gt;
&lt;p&gt;Ready? Let’s do it.&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;First, install the TwitterAuth gem and use the provided generator to whip up the appropriate facilities. You’ll need to &lt;a href="http://twitter.com/apps"&gt;register your Twitter application accounts&lt;/a&gt; too. Or you know what? Screw it. If you want to make this super easy on yourself, Mike wrote a really great &lt;a href="http://github.com/mbleigh/rails-templates/blob/e9b9f3efebca6d519fa75f029fe899798d7e369d/twitterapp.rb"&gt;Twitter app Rails template&lt;/a&gt; that does all the setup for you, including walking you through getting the dev accounts. It’s nice, try it out. You’ll be up and writing Twitter apps in no time.&lt;/p&gt;
&lt;p&gt;For the rest of this I’m going to assume that you have all of that working, and have installed Cucumber too. Don’t have Cucumber? Install it using RubyGems and then just run &lt;code&gt;script/generate cucumber&lt;/code&gt; inside your Rails app.&lt;/p&gt;
&lt;h3&gt;Authentication Feature&lt;/h3&gt;
&lt;p&gt;So let’s write a Cucumber feature to test authentication in our boilerplate Twitter template application. Put the following in &lt;code&gt;features/authentication.feature&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Feature: Authentication
In order to create and edit games
As a user
I want to sign in with Twitter

  Scenario: Login via Twitter
    When I go to "the homepage"
    And I follow "Login via Twitter"
    And Twitter authorizes me
    Then I should see "Logged in as"

  Scenario: Checking login status
    Given I am signed in
    When I go to "the homepage"
    Then I should see "Logged in as"

  Scenario: Log out
    Given I am signed in
    When I go to "the homepage"
    And I follow "Log out"
    Then I should see "Login via Twitter"
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step Definitions&lt;/h3&gt;
&lt;p&gt;Next, you’ll need to write step definitions to satisfy the missing steps. Do that by creating a file called &lt;code&gt;features/step_definitions/auth_steps.rb&lt;/code&gt;. The content of the file should define the following two steps:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Given /^I am signed in$/ do  
  visit login_path
  visit oauth_callback_path
end  

When /^Twitter authorizes me$/ do
  visit oauth_callback_path
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Fake Style&lt;/h3&gt;
&lt;p&gt;The secret sauce here is &lt;a href="http://github.com/chrisk/fakeweb"&gt;FakeWeb&lt;/a&gt;. We’ll use it to fake out responses from the Twitter auth service so that your integration tests stay local (and reliable). Make sure to &lt;code&gt;gem install fakeweb&lt;/code&gt;, and add the following to &lt;code&gt;tests/environments/cucumber.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;config.gem "fakeweb", :version =&amp;gt; "&amp;gt;= 1.2.5"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now edit Cucumber’s &lt;code&gt;features/support/env.rb&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FakeWeb.allow_net_connect = false
FakeWeb.register_uri(:post, 'http://twitter.com/oauth/request_token', :body =&amp;gt; 'oauth_token=fake&amp;amp;oauth_token_secret=fake')
FakeWeb.register_uri(:post, 'http://twitter.com/oauth/access_token', :body =&amp;gt; 'oauth_token=fake&amp;amp;oauth_token_secret=fake')
FakeWeb.register_uri(:get, 'http://twitter.com/account/verify_credentials.json', :response =&amp;gt; File.join(RAILS_ROOT, 'features', 'fixtures', 'verify_credentials.json'))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here we’re stubbing out the interaction with Twitter auth, and responding to all outbound authorization attempts with canned data. Note that this references a fixture file, containing a sample &lt;code&gt;verify_credentials&lt;/code&gt; &lt;span class="caps"&gt;API&lt;/span&gt; response from Twitter. You can obtain a copy using curl from the comfort of your terminal prompt (substitute your own username and password):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -i -u user:pass "http://twitter.com/account/verify_credentials.json" &amp;gt; verify_credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;And We’re Done&lt;/h3&gt;
&lt;p&gt;Alright that should do it. Go ahead and run &lt;code&gt;rake features&lt;/code&gt;. Everything should be green. And green is good. If you need to write other features that are dependent on a login requirement, you can reuse the same &lt;em&gt;“Given I am signed in”&lt;/em&gt; step that we created earlier.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="http://bkocik.net/2009/05/07/testing-twitter-oauth-with-cucumber-webrat-and-fakeweb/"&gt;b.kocik&lt;/a&gt;, whose original post on using FakeWeb to stub Twitter auth was 80% of the solution I needed here.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.zerosum.org/">
    <author>
      <name>nap</name>
    </author>
    <id>tag:blog.zerosum.org,2009-07-07:8746</id>
    <published>2009-07-07T23:41:00Z</published>
    <updated>2009-07-07T23:43:53Z</updated>
    <category term="rails" />
    <category term="ruby" />
    <category term="railscamp" />
    <category term="railsrumble" />
    <link href="http://blog.zerosum.org/2009/7/7/rumble-time" rel="alternate" type="text/html" />
    <title>Rumble Time</title>
<content type="html">
            &lt;p&gt;We opened registration for the &lt;a href="http://r09.railsrumble.com"&gt;2009 Rails Rumble&lt;/a&gt; yesterday. This is the third year in a row that we’re running the contest and it’s sure to be the best one yet. The build weekend is August 22nd-23rd but you need to register this week if you want a seat. If I were you, I’d go register now before it fills up ;-). &lt;/p&gt;
&lt;p&gt;In other news, I’ll be presenting at the second &lt;a href="http://www.pecha-kucha.org/cities/portsmouth-nh/2"&gt;Portsmouth Pecha-Kucha Night&lt;/a&gt; tomorrow, July 8th. I’ll actually be talking about the creative power of constraints, and describing our experiences organizing the Rumble will be a big part of that. If you’re in town, make sure to check it out. I’ve never done a p-k talk before but it sounds like it’s going to be a lot of fun.&lt;/p&gt;
          </content>  </entry>
</feed>
