<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[The Technical Co-Founder]]></title>
  <link href="http://blog.jm3.net/atom.xml" rel="self"/>
  <link href="http://blog.jm3.net/"/>
  <updated>2013-03-18T11:29:10-07:00</updated>
  <id>http://blog.jm3.net/</id>
  <author>
    <name><![CDATA[John Manoogian III]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Five Great Books (That Are Not Game of Thrones)]]></title>
    <link href="http://blog.jm3.net/2013/01/20/great-books/"/>
    <updated>2013-01-20T12:05:00-08:00</updated>
    <id>http://blog.jm3.net/2013/01/20/great-books</id>
    <content type="html"><![CDATA[<p><img src="http://blog.jm3.net/images/posts/2013/bookshelf-voronoi.jpg" title="Optional title attribute" alt="Voronoi Bookshelf" /></p>

<h3>Kindle-friendly edition</h3>

<p>Many of my friends have emerged recently from the Dorito-stained
pages (or finger-smeared screens) of Game of Thrones Book V, blinking
and pawing at the scroll bar, desperately seeking something new to
read, anything, just to &#8220;the high&#8221; going. FRIENDS, I AM HERE TO
HELP YOU.</p>

<p>All are of the following books are available as ebooks and in
dead-tree format, and come highly recommended from me:</p>

<p><strong><a href="http://amzn.to/13V4o4g">This Machine Kills Secrets</a></strong> <em>by Andy Greenberg</em><br>
<strong>The human history + politics behind Wikileaks and the crypto-mask TOR</strong><br>
Andy, the author, is a smart obsessive, which means he and I get
along along great. The book is a great walk down memory lane for
me, being an owner of the early &#8217;90s editions of both <a href="http://amzn.to/WPZfoj">PGP: Pretty
Good Privacy</a> book (before RSA bought them)
and Schneier&#8217;s <a href="http://amzn.to/YhjuSm">Applied Crypto</a>, the bible
of modern cryptographic implementation. As you fall into the story,
you&#8217;ll learn about the smart, often scary governments and agitators
building the cyptography architecture that will one day enslave (or
free) you. Trigger warning: beards.</p>

<p><strong><a href="http://amzn.to/VhmE3P">Why White Kids Love Hip Hop: Wankstas, Wiggers, Wannabes, and the New Reality of Race in America</a></strong> <em>by Bakari Kitwana</em><br>
<strong>The interlink of pop, music, race, and anxiety in America, yo</strong><br>
America is racist. As. Hell. Growing up on the outskirts of the
only apartheid city in the US (Detroit), you see this every day.
Kitwana does a nice job in this one. Highly recommended for Americans
whether you identify as white, black, or something else.</p>

<p><strong><a href="http://amzn.to/XOQfT0">The Drowned Cities</a></strong> <em>by Paolo Bacigalupi</em><br>
<strong>Post-apocalyptic <a href="https://en.wikipedia.org/wiki/Biopunk">biopunk</a>
fiction from the author of <em>The Windup Girl</em></strong><br> Biopunk is the
name for fiction focused on what horrors and wonders will be unleashed
on society as DNA splicing and genetic engineering become commonplace.
Think cyberpunk but wetter and smarter, with fewer cyborgs and more
science. Dark, fun read about a potential future tribalized state
infused with shades of a more American, energized JG. Ballard.
Trigger warning: lots of child soldier stuff.</p>

<p><strong><a href="http://amzn.to/VTtdvI">The Power of Introverts [in a World That Can&#8217;t Stop Talking]</a></strong>
<em>by Susan Cain</em><br>
<strong>It may not shock you to learn that I&#8217;m an introvert.</strong><br> To be
quite honest I&#8217;ve not finished this one yet, but it&#8217;s great so far
and very eye opening with respect to how much 21st century western
society worships extroverts, everywhere from politics to business
to dating. Pretty gross.</p>

<p><strong><a href="http://amzn.to/10Kh0gT">The Power of Gold: History of an Obsession</a></strong> <em>by Peter L. Bernstein</em><br>
<strong>GET THAT GOLD</strong><br>
Are you a raving survivalist with AdBlock, a Go-Bag, and a
self-sustaining farm in the words that will feed your family when
&#8220;The Big One&#8221; hits? Then this book isn&#8217;t for you! ;) Instead, it&#8217;s
a hyper-detailed history of the evolution of gold as a precious
metal, monetary sink, and currency, from antiquity to the present.
I learned a bunch.</p>

<h3>And by popular request, my top five financial meltdown books:</h3>

<ol>
<li><a href="http://amzn.to/YhgVj2">Winner-Take-All Politics</a> <em>by Jacob Hacker &amp; Paul Pierson</em></li>
<li><a href="http://amzn.to/10KheET">Richistan</a> <em>by Robert Frank</em></li>
<li><a href="http://amzn.to/10dEdSB">Griftopia</a> <em>by &#8220;Raving&#8221; Matt Taibbi</em></li>
<li><a href="http://amzn.to/Wgo9xO">The Big Short</a> <em>by Michael Lewis</em></li>
<li><a href="http://amzn.to/W9dF6r">Diary of a Very Bad Year: Confession of a Hedge Fund Manager</a> <em>by Keith Gessen</em></li>
</ol>


<p><em>N.b. The above links are Amazon affiliate links meaning I get a few cents kickback if you buy them. If that bothers you, just google the book name and click that link, and I&#8217;ll get nothing.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Truth About Pivots]]></title>
    <link href="http://blog.jm3.net/2012/10/05/the-truth-about-pivots/"/>
    <updated>2012-10-05T11:30:00-07:00</updated>
    <id>http://blog.jm3.net/2012/10/05/the-truth-about-pivots</id>
    <content type="html"><![CDATA[<h3>U Michigan • Entrepreneur Hour • Guest Speaker</h3>

<div class='embed tweet'><blockquote class="twitter-tweet"><p>Shout out to John Manoogian III for speaking today at <a href="https://twitter.com/search/%23ENTR407">#ENTR407</a>! @<a href="https://twitter.com/jm3">jm3</a></p>&mdash; MPowered (@MPowered) <a href="https://twitter.com/MPowered/status/254301203436032000" data-datetime="2012-10-05T19:25:06+00:00">October 5, 2012</a></blockquote>
<script src="http://blog.jm3.net//platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>University of Michigan&#8217;s engineering school has a great program,
<a href="http://cfe.umich.edu/entr-407">ENTR407</a>, for engineers who reject the notion of being
a cubicle slave at Google or Facebook, and instead are passionate
about starting their own companies. In other words, a class for
entrepreneurial engineers. What a great idea.</p>

<p>Each week a different distinguished (ahem.) startup founder flies
in to share startup stories with a class of young engineers.  On
October 5th, I was invited to Ann Arbor to speak with over 400
future founders about how our company, <a href="http://www.140proof.com">140 Proof</a> pivoted
from a social analytics shop to a $25+ million+ social technology
business. With a 45 minute time slot, we probably talked for an
hour and 20 minutes. I can&#8217;t wait to go back.</p>

<script async 
  class="speakerdeck-embed" 
  data-id="507da8c6e7912c0002063cab" 
  data-ratio="1.6" 
  src="http://blog.jm3.net//speakerdeck.com/assets/embed.js"></script>


<p>Click (the right-hand side of) the slide above to view the slides.</p>

<p>Tweets:</p>

<div class='embed tweet'><blockquote class="twitter-tweet" data-in-reply-to="254334313024344064"><p>@<a href="https://twitter.com/davefontenot">davefontenot</a> @<a href="https://twitter.com/rajv23">rajv23</a> idk. it was really relevant to us though. If CTR was a religion, @<a href="https://twitter.com/jm3">jm3</a> would be Jesus</p>&mdash; Shiva Kilaru (@ShivaKilaru) <a href="https://twitter.com/ShivaKilaru/status/254336792164184065" data-datetime="2012-10-05T21:46:31+00:00">October 5, 2012</a></blockquote>
<script src="http://blog.jm3.net//platform.twitter.com/widgets.js" charset="utf-8"></script></div>




<div class='embed tweet'><blockquote class="twitter-tweet"><p>John Manoogian III, I agree with you. &#8216;Founder&#8217; sounds better than &#8216;entrepreneur&#8217; @<a href="https://twitter.com/jm3">jm3</a>@ Stamps Auditorium <a href="http://t.co/gL5Q4nDX" title="http://instagr.am/p/QaSCvHJWwn/">instagr.am/p/QaSCvHJWwn/</a></p>&mdash; Cheng Chen (@MrChengChen) <a href="https://twitter.com/MrChengChen/status/254286953590181889" data-datetime="2012-10-05T18:28:28+00:00">October 5, 2012</a></blockquote>
<script src="http://blog.jm3.net//platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>Video coming soon, please come back next week to watch the 3 minute
highlight reel.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Design Hacks]]></title>
    <link href="http://blog.jm3.net/2012/08/28/design-hacks/"/>
    <updated>2012-08-28T20:39:00-07:00</updated>
    <id>http://blog.jm3.net/2012/08/28/design-hacks</id>
    <content type="html"><![CDATA[<p>A new course for coders on hacking design.
<del><a href="http://j.mp/design-hacks">Get your tickets</a></del> SOLD OUT!</p>

<p><a href="http://j.mp/design-hacks"><img src="http://blog.jm3.net/images/posts/2012/2012-08-29-design-hacks-flier.png" alt="Design Hacks" /></a></p>

<p>As a software engineer, I&#8217;ve had the privilege of working alongside
great visual and UX designers for nearly 10 years of my life.  Under
pressure of shipping many sites + apps, I&#8217;ve studied how great
designers work. I&#8217;ve <a href="http://estonbond.com/">hired</a> and <a href="http://dcurt.is/">mentored</a> leaders
in the design field, and borrowed many of their tricks and tools,
tweaking them to incorporate what I know about building web apps.
This class is the first edition in my sharing those hacks.</p>

<p>Design is no mysterious black art that requires loving Helvetica
and smoking a lot. Design is something you do, not something you
are, and everyone, even straight up command-line nerds like us, can
learn it, at least well enough to bang out some decent looking
version-ones. Time to get serious.</p>

<p>Sign up for <a href="http://j.mp/design-hacks">DESIGN HACKS</a> now and learn in 90 minutes
how to be good (enough) at visual and UI design to ship sharp-looking
alphas and betas.*</p>

<p><strong>Design Hacks</strong> at General Assembly, the first rapid-fire design
course taught <strong>for</strong> engineers, <strong>by</strong> an <a href="http://jm3.net">engineer</a>.</p>

<p>Secure your seat now: <a href="http://j.mp/design-hacks">j.mp/design-hacks</a>.</p>

<p>&#42; Skinny jeans not included.</p>

<p>Why do Tumblr, AirBnB, and Path cause so much excitement? DESIGN.</p>

<p>Why did Facebook buy Instagram, Daytum, and Gowalla? DESIGN.</p>

<p>Why did the iPhone win? DESIGN.</p>

<p>Are you delegating the future success of your startup up to some
art-school kid with skinny jeans and a weird haircut? F that!
<a href="http://j.mp/design-hacks">Tickets</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OS X rsync]]></title>
    <link href="http://blog.jm3.net/2012/07/30/os-x-rsync/"/>
    <updated>2012-07-30T23:40:00-07:00</updated>
    <id>http://blog.jm3.net/2012/07/30/os-x-rsync</id>
    <content type="html"><![CDATA[<p>Getting <code>rsync</code> on OS X Mountain Lion / Leopard to respect all file
attributes, hidden resource forks, Finder labels, etc. involves a
bit of <a href="http://mxcl.github.com/homebrew/">homebrew</a> magic. To get it working, do this:</p>

<div><script src='https://gist.github.com/3214297.js?file='></script>
<noscript><pre><code>brew tap homebrew/dupes
brew info libiconv
brew install homebrew/dupes/libiconv
brew install homebrew/dupes/rsync</code></pre></noscript></div>


<p>You&#8217;re welcome. :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Twitter logo deconstructed into circles using SVG]]></title>
    <link href="http://blog.jm3.net/2012/07/13/twitter-logo-deconstructed-into-circles-using-svg/"/>
    <updated>2012-07-13T13:21:00-07:00</updated>
    <id>http://blog.jm3.net/2012/07/13/twitter-logo-deconstructed-into-circles-using-svg</id>
    <content type="html"><![CDATA[<p>I deconstructed the Twitter logo into its component circles using
SVG (scalable&nbsp;vector graphics).</p>

<div><script src='https://gist.github.com/3108602.js?file='></script>
<noscript><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

&lt;!-- jm3: twitter logo deconstructed into scalable SVG, by jm3 --&gt;

&lt;!DOCTYPE svg PUBLIC &quot;-//W3C//DTD SVG 1.1//EN&quot; 
  &quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&quot;&gt;
&lt;svg version=&quot;1.1&quot; id=&quot;jm3_twitter&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; 
  xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot;
  width=&quot;150px&quot; height=&quot;150px&quot; viewBox=&quot;116.539 136.684 150 150&quot; 
  enable-background=&quot;new 116.539 136.684 150 150&quot; xml:space=&quot;preserve&quot;&gt;

  &lt;rect   id=&quot;bg&quot;              fill=&quot;#FFFFFF&quot; x=&quot;110&quot; y=&quot;110&quot; width=&quot;160&quot; height=&quot;180&quot;/&gt;
  &lt;circle id=&quot;body&quot;            fill=&quot;#27A9E1&quot; cx=&quot;164.259&quot; cy=&quot;186.723&quot; r=&quot;85.256&quot;/&gt;
  &lt;circle id=&quot;sub_bird_back&quot;   fill=&quot;#FFFFFF&quot; cx=&quot;123.167&quot; cy=&quot;196.479&quot; r=&quot;62.167&quot;/&gt;
  &lt;circle id=&quot;bottom_feather&quot;  fill=&quot;#26A9E1&quot; cx=&quot;165.115&quot; cy=&quot;214.938&quot; r=&quot;30.449&quot;/&gt;
  &lt;circle id=&quot;sub_mid_feather&quot; fill=&quot;#FFFFFF&quot; cx=&quot;140.652&quot; cy=&quot;194.401&quot; r=&quot;30.986&quot;/&gt;
  &lt;circle id=&quot;mid_feather&quot;     fill=&quot;#27A9E1&quot; cx=&quot;155.347&quot; cy=&quot;194.096&quot; r=&quot;30.291&quot;/&gt;
  &lt;circle id=&quot;sub_top_feather&quot; fill=&quot;#FFFFFF&quot; cx=&quot;135.381&quot; cy=&quot;167.788&quot; r=&quot;30.158&quot;/&gt;
  &lt;circle id=&quot;top_feather&quot;     fill=&quot;#27A9E1&quot; cx=&quot;155.152&quot; cy=&quot;174.901&quot; r=&quot;29.486&quot;/&gt;
  &lt;circle id=&quot;sub_wing&quot;        fill=&quot;#FFFFFF&quot; cx=&quot;195.587&quot; cy=&quot;105.065&quot; r=&quot;84.839&quot;/&gt;
  &lt;circle id=&quot;beak&quot;            fill=&quot;#27A9E1&quot; cx=&quot;235.723&quot; cy=&quot;156.557&quot; r=&quot;29.717&quot;/&gt;
  &lt;circle id=&quot;sub_beak&quot;        fill=&quot;#FFFFFF&quot; cx=&quot;240.773&quot; cy=&quot;121.185&quot; r=&quot;51.717&quot;/&gt;
  &lt;circle id=&quot;top_beak&quot;        fill=&quot;#27A9E1&quot; cx=&quot;233.441&quot; cy=&quot;146.433&quot; r=&quot;29.334&quot;/&gt;
  &lt;circle id=&quot;sub_top_beak&quot;    fill=&quot;#FFFFFF&quot; cx=&quot;231.936&quot; cy=&quot;112.892&quot; r=&quot;51.63&quot; /&gt;
  &lt;circle id=&quot;head&quot;            fill=&quot;#27A9E1&quot; cx=&quot;219.723&quot; cy=&quot;183.557&quot; r=&quot;29.717&quot;/&gt;

&lt;/svg&gt;</code></pre></noscript></div>


<p>Final result: smoooooth scaling!</p>

<object 
  style="display: block; width: 150px; margin: 0 auto 1.0em auto; border: 2px dotted #ccc; padding: 1.0em; background: #fff;" 
  data="/images/twitter-circles.svg" type="image/svg+xml">
</object>


<p>For a scalable Twitter button for your website, check out the scalable CSS Twitter button I created:</p>

<p><a href="http://blog.140proof.com/post/4164741501/scalable-sign-in-button-updated"><img src="http://dl.dropbox.com/u/10831018/blog/2011/03/twitter-button/new-twitter-sign-in-button.jpg" alt="scalabletwitter button" /></a></p>

<p>Happy hacking.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[APIs and LEGOs]]></title>
    <link href="http://blog.jm3.net/2012/05/30/APIs-and-LEGOs/"/>
    <updated>2012-05-30T13:53:00-07:00</updated>
    <id>http://blog.jm3.net/2012/05/30/APIs-and-LEGOs</id>
    <content type="html"><![CDATA[<p><img src="http://blog.jm3.net/images/posts/2012/2012-05-30-LEGO-birdsnest.jpg" alt="LEGOs" /></p>

<p>via <a href="https://twitter.com/#!/sheynkman">Kirill Sheynkman</a>:</p>

<blockquote><p>Open source popularized the idea of creating public projects
and actively soliciting community feedback and involvement. Tens
of thousands of open source projects have been created, but only
those projects that built sizable communities have thrived. Most
of the large infrastructure software categories were eventually
filled by strong open source projects and some spawned successful
commercial software companies, like RedHat, XenSource, Sourcefire,
MySQL, and JBoss. These companies span a broad range — from operating
systems/hypervisors to security to middleware and database/content
management.</p>

<p>Coders now expect the same instant gratification as end users.
Instead of having to download, configure and manage all the associated
software components, more and more of these capabilities need to
be packaged “as-a-service” — hence, the move to cloud services. It
is also important to remember that software development is an art,
not a science, and programmers want a very simple and elegant
programming interface.</p></blockquote>

<p>Read More: <a href="http://gigaom.com/2012/05/28/the-api-ificiation-of-software-and-legos/">APIs and LEGOs</a></p>

<p><a href="http://techcrunch.com/2011/07/23/lego-computer-crunches-efficiently/"><img src="http://blog.jm3.net/images/posts/2012/2012-05-30-lego-computer.jpg" alt="LEGO computer" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Redis Stats in R]]></title>
    <link href="http://blog.jm3.net/2012/05/12/redis-stats-in-R/"/>
    <updated>2012-05-12T19:36:00-07:00</updated>
    <id>http://blog.jm3.net/2012/05/12/redis-stats-in-R</id>
    <content type="html"><![CDATA[<div><script src='https://gist.github.com/2669385.js?file='></script>
<noscript><pre><code># aggregate stats from redis from our tweet research

# util: pretty-print bignums w/commas for readability
pp &lt;- function(x){
  format( x, big.mark=&quot;,&quot;, scientific=FALSE)
}

# open up access to redis data 
library(rredis)
redisConnect()

# core sets + zsets
sets  &lt;- c('tweets:hashtags', 'tweets:links', 'tweets:mentions', 
           'user:is_public')
zsets &lt;- c('words', 'user:followers', 'user:num_tweets')

# 8 language sets + 120 country sets
langs  &lt;- c(&quot;DE&quot;, &quot;EN&quot;, &quot;ES&quot;, &quot;FA&quot;, &quot;FR&quot;, &quot;NL&quot;, &quot;PT&quot;, &quot;RU&quot;)
countries  &lt;- c(
  &quot;AE&quot;, &quot;AF&quot;, &quot;AG&quot;, &quot;AM&quot;, &quot;AO&quot;, &quot;AQ&quot;, &quot;AR&quot;, &quot;AT&quot;, &quot;AU&quot;, &quot;AZ&quot;, &quot;BA&quot;, 
  &quot;BB&quot;, &quot;BD&quot;, &quot;BE&quot;, &quot;BH&quot;, &quot;BN&quot;, &quot;BR&quot;, &quot;BS&quot;, &quot;BW&quot;, &quot;BY&quot;, &quot;CA&quot;, &quot;CH&quot;, 
  &quot;CL&quot;, &quot;CN&quot;, &quot;CO&quot;, &quot;CR&quot;, &quot;CU&quot;, &quot;CY&quot;, &quot;DE&quot;, &quot;DK&quot;, &quot;DO&quot;, &quot;DZ&quot;, &quot;EC&quot;, 
  &quot;EE&quot;, &quot;EG&quot;, &quot;ES&quot;, &quot;ET&quot;, &quot;FI&quot;, &quot;FJ&quot;, &quot;FK&quot;, &quot;FR&quot;, &quot;GB&quot;, &quot;GE&quot;, &quot;GH&quot;, 
  &quot;GI&quot;, &quot;GL&quot;, &quot;GR&quot;, &quot;GT&quot;, &quot;GU&quot;, &quot;HK&quot;, &quot;HN&quot;, &quot;HR&quot;, &quot;HU&quot;, &quot;ID&quot;, &quot;IE&quot;, 
  &quot;IL&quot;, &quot;IN&quot;, &quot;IR&quot;, &quot;IT&quot;, &quot;JM&quot;, &quot;JO&quot;, &quot;JP&quot;, &quot;KE&quot;, &quot;KH&quot;, &quot;KP&quot;, &quot;KR&quot;, 
  &quot;KW&quot;, &quot;LB&quot;, &quot;LK&quot;, &quot;LT&quot;, &quot;LU&quot;, &quot;LV&quot;, &quot;MA&quot;, &quot;MC&quot;, &quot;MK&quot;, &quot;MT&quot;, &quot;MU&quot;, 
  &quot;MW&quot;, &quot;MX&quot;, &quot;MY&quot;, &quot;NG&quot;, &quot;NI&quot;, &quot;NL&quot;, &quot;NO&quot;, &quot;NP&quot;, &quot;NZ&quot;, &quot;OM&quot;, &quot;PA&quot;, 
  &quot;PE&quot;, &quot;PH&quot;, &quot;PK&quot;, &quot;PL&quot;, &quot;PT&quot;, &quot;PY&quot;, &quot;QA&quot;, &quot;RO&quot;, &quot;RS&quot;, &quot;RU&quot;, &quot;RW&quot;, 
  &quot;SA&quot;, &quot;SE&quot;, &quot;SG&quot;, &quot;SI&quot;, &quot;SN&quot;, &quot;SV&quot;, &quot;TH&quot;, &quot;TR&quot;, &quot;TT&quot;, &quot;TW&quot;, &quot;TZ&quot;, 
  &quot;UA&quot;, &quot;UG&quot;, &quot;US&quot;, &quot;UY&quot;, &quot;VA&quot;, &quot;VE&quot;, &quot;VI&quot;, &quot;VN&quot;, &quot;XK&quot;, &quot;ZA&quot;, &quot;ZW&quot;)

# walk the list of key names and pretty-print stats for each set
for (i in 1:length(sets)) {
  print( paste(sets[i], &quot;:&quot;, pp( redisSCard(sets[i]))))
}

# ...and zset
for (i in 1:length(zsets)) {
  print( paste(zsets[i], &quot;:&quot;, pp( redisZCard(zsets[i]))))
}

# emit basic cardinality for all languages...
lang_stats &lt;- c(1:length(langs))
for (i in 1:length(langs)) {
  key &lt;- paste(&quot;user:lang:&quot;,langs[i],sep=&quot;&quot;)
  card &lt;- redisSCard(key)
  lang_stats[i] &lt;- card
  print( paste(key, pp(card)))
}
lang_stats &lt;- data.frame(langs,lang_stats)
names(lang_stats) &lt;- c(&quot;tweet language&quot;,&quot;occurrences&quot;)

# ...and countries
country_stats &lt;- c(1:length(countries))
for (i in 1:length(countries)) {
  key &lt;- paste(&quot;user:country:&quot;,countries[i],sep=&quot;&quot;)
  card &lt;- redisSCard(key)
  country_stats[i] &lt;- card
  print( paste(key, pp( card)))
}
country_stats &lt;- data.frame(countries,country_stats)
names(country_stats) &lt;- c(&quot;tweet country&quot;, &quot;occurrences&quot;)

# clean up the workspace
rm(i,card,key)

# after the run, stats accrue in 2 data.frames: lang_stats + country_stats

# &quot;tweets:hashtags : 458,640
# &quot;tweets:links : 270,319
# &quot;tweets:mentions : 1,086,466
# &quot;user:is_public : 1,812,923
#
# &quot;words : 503,999
# &quot;user:followers : 1,711,305
# &quot;user:num_tweets : 1,207,538
#
# &quot;user:lang:DE 9,369
# &quot;user:lang:EN 1,622,940
# &quot;user:lang:ES 62,800
# &quot;user:lang:FA 932
# &quot;user:lang:FR 166,233
# &quot;user:lang:NL 3,361
# &quot;user:lang:PT 5,109
# &quot;user:lang:RU 124,741
</code></pre></noscript></div>


<p><img src="http://blog.jm3.net/images/posts/2012/2012-05-12-rstudio.png" alt="RStudio in action, by jm3" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A History of 'Pivot' Press]]></title>
    <link href="http://blog.jm3.net/2012/04/26/pivot-history/"/>
    <updated>2012-04-26T11:07:00-07:00</updated>
    <id>http://blog.jm3.net/2012/04/26/pivot-history</id>
    <content type="html"><![CDATA[<p><link href="http://veritetimeline.appspot.com/latest/timeline.css" rel="stylesheet"></p>

<script type="text/javascript" src="http://veritetimeline.appspot.com/latest/jquery-min.js"></script>


<script type="text/javascript" src="http://veritetimeline.appspot.com/latest/timeline-min.js"></script>




<script>
  $(document).ready(function() {
    var timeline = new VMM.Timeline();
    timeline.init( "https://docs.google.com/spreadsheet/pub?key=0Aq5dBJnSM4yYdDlWcExBcEY4LUhIWHNkeVZNYl9iT3c&output=html" );
      
  });
</script>


<p><meta http-equiv="x-dns-prefetch-control" content="off"/></head></p>

<p><strong>New York&#8217;s business press like the WSJ and Forbes are classically slow on the draw&#8230; :)</strong></p>

<div id='timeline-embed'></div>


<script type='text/javascript'>
var timeline_config = {width: '650',height: '880',maptype: 'toner',source: ''}
</script>


<script type='text/javascript' src='http://veritetimeline.appspot.com/latest/timeline-embed.js'></script>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Inspecting iOS Traffic]]></title>
    <link href="http://blog.jm3.net/2012/04/21/inspecting-ios-traffic/"/>
    <updated>2012-04-21T09:43:00-07:00</updated>
    <id>http://blog.jm3.net/2012/04/21/inspecting-ios-traffic</id>
    <content type="html"><![CDATA[<p>Nice!</p>

<blockquote><p>And there you have it &#8211; with one free download and a few minutes
of configuration work, you can snoop all of iOS&#8217;s web traffic for
fun and/or profit.</p></blockquote>

<p><a href="http://www.tuaw.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a-dime/"><img src="http://blog.jm3.net/images/posts/2012/2012-04-21-ios-traffic-debugger-screenshot.png" alt="alt" /></a></p>

<p>View tutorial: <em><a href="http://www.tuaw.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a-dime/">Inspect iOS HTTP traffic without spending a dime</a></em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Don't Use Cucumber]]></title>
    <link href="http://blog.jm3.net/2012/04/17/dont-use-cucumber/"/>
    <updated>2012-04-17T22:53:00-07:00</updated>
    <id>http://blog.jm3.net/2012/04/17/dont-use-cucumber</id>
    <content type="html"><![CDATA[<p><img src="http://blog.jm3.net/images/posts/2012/2012-04-17-cucumber-sucks.jpg" alt="Cucumber sucks" /></p>

<blockquote><p>Don’t use Cucumber unless you live in the magic kingdom of
non-coders-writing-tests (and send me some fairy dust if you are!)</p></blockquote>

<p>— <a href="http://37signals.com/svn/posts/3159-testing-like-the-tsa">37 Signals</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RIP mister Dan Sicko.]]></title>
    <link href="http://blog.jm3.net/2011/09/21/RIP-creative-mastermind-dan-sicko/"/>
    <updated>2011-09-21T03:48:00-07:00</updated>
    <id>http://blog.jm3.net/2011/09/21/RIP-creative-mastermind-dan-sicko</id>
    <content type="html"><![CDATA[<p>Honored awesome collaborator, culture commentator, and friend. You
acknowledged me here:</p>

<p><img src="http://blog.jm3.net/images/posts/2011/2011-09-21-dan-sicko-techno-rebels-highlight.png" alt="Techo Rebels acknowledgement" /></p>

<p>I acknowledge you, here. Thank you for all the awesome things you
did.</p>

<p>Yours with notes of celery and anti-matter,</p>

<p>jm3</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Yoxi is Game-ifying Social Change]]></title>
    <link href="http://blog.jm3.net/2011/06/07/Yoxi-is-gamifying-social-change/"/>
    <updated>2011-06-07T23:06:00-07:00</updated>
    <id>http://blog.jm3.net/2011/06/07/Yoxi-is-gamifying-social-change</id>
    <content type="html"><![CDATA[<h2>Kickstarter Meets Change.org</h2>

<p>Everyone wants to make a difference in the world, but many startups
are busy chasing dollars, dreams, and the competition. I just learned
about a new startup, <a href="http://yoxi.tv">Yoxi</a> (&#8220;yo-see&#8221;) that my friend <a href="http://yoxi.tv/team">Josh Fischer</a>
from grade school is involved with, which aims for a higher goal.</p>

<p>Yoxi takes the game aspects that I tried hard to push at [crowdsourced
photo-funding site] Zivity — by voting for a team, you take on
responsibilities to promote and evangelize it — except that Yoxi
wraps these social game mechanics around <a href="http://www.kickstarter.com">Kickstarter</a>-like social
change projects. So teams pick projects, make videos to promote
them, and then compete to get funding and change the world. It
reminds me of Kickstarter meets Change.org — and that&#8217;s meant very
much as a compliment!</p>

<h2>Slick and Glossy</h2>

<p>Yoxi is very much the kind of &#8220;non-tech&#8221; startup I&#8217;m known to roll
my eyes at: everyone looks very hip and fashionable, the site and
the videos are very well-produced, there are no founding engineers
or technical back-end aspect, etc. — but Yoxi seems like an awesome
company built to do good things… and Josh is a very funny guy. I
think they&#8217;ll do quite well.</p>

<h2>Check it out</h2>

<p><img src="http://blog.jm3.net/images/posts/2011/2011-06-07-yoxi-diagram.png" alt="yoxi diagram" /></p>

<p>(They used to have some sweet videos at <a href="http://yoxi.tv/post/611">http://yoxi.tv/post/611</a>
and <a href="http://yoxi.tv/post/476">http://yoxi.tv/post/476</a>, but the links are now broken)</p>

<p>The <a href="http://yoxi.tv/faq">FAQ</a> also has a nice visual section on how the game mechanics
work too. [ed: the link to the FAQ is now broken too, wtf]</p>

<h2>My advice to Yoxi at this point:</h2>

<h3>1. Provide something for <em>all</em> types of users.</h3>

<p><strong>Right now, some aspects of Yoxi feels like there&#8217;s nothing  for
the middle of the 80:19:1 group to do — power-users can create
videos, and casual users can tweet, but it doesn&#8217;t feel like much
of a community … yet.</strong></p>

<p>The &#8220;80:19:1&#8221; principle in online communities is based on the famous
<a href="http://en.wikipedia.org/wiki/Pareto_principle">Pareto Principle</a> or &#8221;<a href="http://en.wikipedia.org/wiki/Pareto_principle">80:20</a>&#8221; rule, here referring to the
idea that 20% of users contribute 80% of the value.</p>

<p>The <strong>80:19:1 rule</strong> turns 80:20 on its head and shows that, in
online communities like YouTube, Flickr, Kickstarter, Github: </p>

<ul>
<li><p><strong>80%</strong> of visiting users are passive consumers who will watch
a video or click a link, then ultimately leave. These are the vast
majority of &#8220;silent&#8221; users in most communities, who generate a
tidy sum of activity and ad revenue, but don&#8217;t visibly contribute
to the site.</p></li>
<li><p><strong>19%</strong> of users will go the extra step and vote on items, rate
things, post comments, flag issues, etc. These users are sometimes
called &#8220;curators&#8221; or enthusiasts.</p></li>
<li><p>finally, just <strong>1%</strong> of users (one percent!) will go &#8220;all the
way&#8221;, creating and uploading their OWN original content that excites
other users and pulls them into the site, fueling growth.</p></li>
</ul>


<p>These ratios aren&#8217;t exact, obviously, but they&#8217;ve been empirically
shown to repeat themselves in community after community. What the
80:19:1 rule suggests, in community design, is that there needs to
be variable levels of engagement for each type of user. If your
site only has things to do for the 1%&#8217;ers, then 99% of your users
will be confused as to what to do (this is a standard &#8220;expert
community&#8221; problem).</p>

<p>Yoxi is just getting started, so partly this might be a cold-start
/ Catch-22 problem; with more engaged users, the site might getmore
engaging … but until that happens, Yoxi should experiment with
different ways to get users to engage and share more. Too many of
the video pages are simply … EMPTY.</p>

<h3>2. Provide real video embeds</h3>

<p>The videos on Yoxi are great, so they should make them embed-able.</p>

<p><img src="http://blog.jm3.net/images/posts/2011/2011-06-07-yoxi-video-player.jpg" alt="Yoxi video player" /></p>

<p>A huge part of how Youtube won (besides Flash) was by allowing their
video player to be embedded on other sites so that videos could
travel. Bloggers, social networkers, and reporters all used YouTube
embeds to enhance their own sites and give YouTube additional
distribution. <strong>Yoxi uses some super-slick Flash video player,
above, but it doesn&#8217;t allow embedding</strong>. If they had, I would have
embedded their videos in this post, and you might be watching their
video instead of reading my post.</p>

<p>So check out Yoxi, see what you think, vote on some projects, and
change the world.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ignite Speed-Talks: Lean Startup / Lessons Learned]]></title>
    <link href="http://blog.jm3.net/2011/05/22/ignite-speed-talks-lean-startup-lessons-learned/"/>
    <updated>2011-05-22T17:46:00-07:00</updated>
    <id>http://blog.jm3.net/2011/05/22/ignite-speed-talks-lean-startup-lessons-learned</id>
    <content type="html"><![CDATA[<p>Had a great time last night at <strong><a href="http://igniteleanstartup.eventbrite.com/">Ignite: Lean Startup</a></strong>,
a collection of speed presentations patterned after the Pecha-Kucha
style in San Francisco, organized by <a href="http://www.startuplessonslearned.com/">Eric Ries</a></p>

<p>Everyone did a great job. Public speaking scares most people, and
timing your presentation to slides that auto-advance is tough. These
were the best of the bunch:</p>

<p>Gleb Budman (<a href="http://twitter.com/GlebBudman">@GlebBudman</a>) from Backblaze</p>

<p><a href="http://blog.backblaze.com/2009/09/01/petabytes-on-a-budget-how-to-build-cheap-cloud-storage/"><img src="http://blog.jm3.net/images/posts/2011/2011-05-22-ignite-speed-talks-lean-startup-backblaze.jpg" alt="backblaze server" /></a></p>

<p>Gleb shared an awesome walkthrough of how Backblaze created a
70 TB server in a plywood box.</p>

<p>Jess Lee (<a href="http://twitter.com/jesskah" title="Jess Lee">@jesskah</a>) from Polyvore</p>

<p><a href="http://www.polyvore.com/cgi/about"><img src="http://blog.jm3.net/images/posts/2011/2011-05-22-ignite-speed-talks-lean-startup-polyvore.jpg" alt="alt text" /></a></p>

<p>Jess gave a great talk on agile product development using &#8220;Fake
Doors&#8221;, a technique that we also use at <a href="http://140proof.com" title="The Ad Solution for Social Feeds">140 Proof</a> to evaluate
demand for a feature before building it.</p>

<p>Shivani Khanna (<a href="http://twitter.com/sk_shivani">@sk_shivani</a>) from Fliptoast</p>

<p><img src="http://blog.jm3.net/images/posts/2011/2011-05-22-ignite-speed-talks-lean-startup-fliptoast.jpg" alt="fliptoast" /></p>

<p>Shivani gave an inspired, funny talk about the advantages of being
lean without a full dev team.</p>

<p>Paul Howe (<a href="http://twitter.com/phdc">@phdc</a>), from BlueSpark</p>

<p><a href="http://www.bluesparkproject.com/"><img src="http://blog.jm3.net/images/posts/2011/2011-05-22-ignite-speed-talks-lean-startup-bluespark.jpg" alt="bluespark" /></a></p>

<p>Paul shared an awesome example of lean startup prototyping using
<a href="http://www.greasespot.net/" title="Grease Spot">GreaseMonkey</a>, which is a favorite trick of mine.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The 'Your Business Card Sucks' soundboard]]></title>
    <link href="http://blog.jm3.net/2011/04/14/business-card-guy-soundboard/"/>
    <updated>2011-04-14T10:38:00-07:00</updated>
    <id>http://blog.jm3.net/2011/04/14/business-card-guy-soundboard</id>
    <content type="html"><![CDATA[<h2>&#8220;Your Business Card Sucks!&#8221;</h2>

<p>&#8220;Don&#8217;t let not having the tools be your trepidation!&#8221; — The Business Card Guy, at your fingertips.</p>

<p>Prank calls will never be the same again.</p>

<p><a href="http://businesscards.jm3.net/">businesscards.jm3.net</a></p>

<p><a href="http://businesscards.jm3.net/"><img src="http://blog.jm3.net/images/posts/2011/2011-04-14-business-card-guy-soundboard-header.jpg" alt="Your Business Card Sucks - The Soundboard" /></a></p>

<p>Internet nerds will be familiar with the classic &#8220;Business Card
Guy&#8221; video, a bizarre Youtube cult classic of a motivational speaker-
type guy berating some bozos about the low quality of their business
cards, and the high quality of his own ridiculously glossy business
card.</p>

<p><a href="http://businesscards.jm3.net/"><img src="http://blog.jm3.net/images/posts/2011/2011-04-14-business-card-guy-soundboard-framegrab.jpg" alt="Business Card Guy" /></a></p>

<p>Now the best quotes from this internet classic video are yours, for
free, and are just a click away, for all your prank-calling and
office hijinks needs. Introducing:</p>

<p><a href="http://businesscards.jm3.net/">The HTML5 Soundboard for the Business Card Guy</a></p>

<p><a href="http://businesscards.jm3.net/"><img src="http://blog.jm3.net/images/posts/2011/2011-04-14-business-card-guy-soundboard-screenshot.jpg" alt="HTML5 is pimp" /></a></p>

<p>Featuring:</p>

<ul>
<li>Full HTML5 sexiness</li>
<li>rspec tests</li>
<li>Capistrano deployment</li>
<li>works in Safari, Firefox, iPhone Safari, and Google Chrome (sorry if you use some horrible windows browser thing)</li>
<li>includes tiger blood</li>
<li>built on my totally sweet <a href="https://github.com/jm3/sinatra-template">Sinatra-Template site boilerplate code</a></li>
<li><a href="https://github.com/jm3/businessboard">Code available on Github.</a></li>
</ul>


<p>Check it out, share it with friends, amaze your mom, baffle your dog: </p>

<p><a href="http://businesscards.jm3.net/">The HTML5 Business Card Guy Soundboard</a></p>

<p>If you haven&#8217;t seen the original video, you can watch it here:</p>

<iframe width="640" height="390" src="http://www.youtube.com/embed/4YBxeDN4tbk " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<h2>License:</h2>

<p><a href="http://unlicense.org/">The Unlicense</a> (aka: public domain)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Geeky things I've done this week]]></title>
    <link href="http://blog.jm3.net/2011/04/08/geeky-things-this-week/"/>
    <updated>2011-04-08T23:14:00-07:00</updated>
    <id>http://blog.jm3.net/2011/04/08/geeky-things-this-week</id>
    <content type="html"><![CDATA[<ul>
<li>Learn to use Vagrant to manage local virtualized dev environments</li>
<li>Found and fixed an internal performance bug using NewRelic</li>
<li>Deployed 3 Rails migrations</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ten Best Books From Last Year]]></title>
    <link href="http://blog.jm3.net/2011/02/07/ten-best-books-i-read-in-2010/"/>
    <updated>2011-02-07T17:22:00-08:00</updated>
    <id>http://blog.jm3.net/2011/02/07/ten-best-books-i-read-in-2010</id>
    <content type="html"><![CDATA[<p>All are highly recommended. I read a few others but these are the
ones you care about.</p>

<ol>
<li><a href="http://www.amazon.com/Strong-Motion-Novel-Jonathan-Franzen/dp/031242051X">Strong Motion</a></li>
<li><a href="http://www.amazon.com/Corrections-Novel-Jonathan-Franzen/dp/0312421273">The Corrections</a></li>
<li><a href="http://37signals.com/rework/">Rework</a></li>
<li><a href="http://www.amazon.com/PayPal-Wars-Battles-Media-Planet/dp/0977898431">The Paypal Wars</a></li>
<li><a href="http://www.salon.com/books/review/2001/04/10/culley">The Immortal Class</a></li>
<li><a href="http://www.amazon.com/Selby-Your-Place-Todd/dp/0810984865">The Selby is in Your Place</a></li>
<li><a href="http://www.amazon.com/Winner-Take-All-Politics-Washington-Richer---Turned/dp/1416588698/">Winner-Take-All Politics</a></li>
<li><a href="http://www.amazon.com/Richistan-Journey-Through-American-Wealth/dp/0307341453/">Richistan</a></li>
<li><a href="http://www.amazon.com/Griftopia-Machines-Vampire-Breaking-America/dp/0385529953">Griftopia</a></li>
<li><a href="http://www.amazon.com/Big-Short-Inside-Doomsday-Machine/dp/0393072231">The Big Short</a></li>
</ol>


<p>Bonus 3:</p>

<ol>
<li><a href="http://www.amazon.com/City-Thieves-Novel-David-Benioff/dp/0670018708">City of Thieves</a></li>
<li><a href="http://www.nytimes.com/2010/09/12/books/review/Thomas-t.html">Zero History</a></li>
<li><a href="http://www.nytimes.com/2010/07/14/books/14book.html">Diary of a Very Bad Year: Confession of a Hedge Fund Manager</a></li>
</ol>


<p>Please read any or all of them, and let me know what you think.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jamie's Awesome Internet Fame Talk: The JM3 Summary]]></title>
    <link href="http://blog.jm3.net/2011/01/31/internet-fame-cliff-notes-edition/"/>
    <updated>2011-01-31T14:42:00-08:00</updated>
    <id>http://blog.jm3.net/2011/01/31/internet-fame-cliff-notes-edition</id>
    <content type="html"><![CDATA[<p><a href="http://www.flickr.com/photos/vimeo/5105462208/"><img src="http://blog.jm3.net/images/posts/2011/2011-01-31-internet-fame-jamiew.jpg" alt="alt" /></a></p>

<p>I have the rare pleasure of working with <a href="http://twitter.com/jamiew">Jamie Wilkinson</a>
at <a href="http://labs.140proof.com">140 Proof</a>, and Jamie has the rare talent of being
an expert on &#8221;<a href="http://internetfamo.us/class/about">internet fame</a>.&#8221;  He gave a great talk at the
<a href="http://vimeo.com/awards2010/speakers/wilkinson">Vimeo Festival</a> on promoting your work
online, and I&#8217;ve summarized his presentation for those of you who
are too lazy to watch the whole thing. <em>Link and the full video
follow at the end.</em></p>

<h2>1 - Write Blog Poetry</h2>

<p>Encourage <em>many</em> interpretations of your piece by combining multiple
catchy headlines (some used in post), pictures, video w/music.</p>

<h2>2 - Ride the Wave</h2>

<p>Make work that&#8217;s relevant to existing online things that that are
already popular and trending (remixes, riffes, parodies)</p>

<h2>3 - Publish Early and Often</h2>

<p>It&#8217;s impossible to predict what will become a hit, so don&#8217;t bother
— instead, release as quickly as possible — ideally spend less than
a day on a project — in order to increase the chances of pick-up.</p>

<h2>BONUS 1 - The &#8220;Eggbasket Theory&#8221;</h2>

<p>There are no &#8220;influentials&#8221;; anyone can launch an awesome project
that goes viral, don&#8217;t focus on being the &#8220;influential&#8221; guy, focus
on making LOTS of projects.</p>

<h2>BONUS 2 - The &#8220;Min. Effort / Max. Output&#8221; Curve</h2>

<p>Strive to hit the fast, valuable left side of the curve, quantity
is better than quality.</p>

<h2>BONUS 3 - &#8220;Pre-Document&#8221;</h2>

<p>Telegraph your intent first with a page / blog post / video (ala
Kickstarter), and you might even get press even before you start</p>

<p>WATCH FULL VIDEO HERE:</p>

<iframe width="400" height="225" src="http://player.vimeo.com/video/19086114 " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p>THEN GET FAMOUS.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bundler Be Slow]]></title>
    <link href="http://blog.jm3.net/2010/06/22/bundler-be-slow/"/>
    <updated>2010-06-22T20:32:00-07:00</updated>
    <id>http://blog.jm3.net/2010/06/22/bundler-be-slow</id>
    <content type="html"><![CDATA[<p><img src="http://blog.jm3.net/images/posts/2010/2010-06-22-bundler-suit.jpg" alt="Bundler" /></p>

<p><a href="http://gembundler.com">Bundler</a> (<a href="http://gembundler.com">gembundler.com</a>) is a new-ish
Ruby gem for managing dependencies within your Rails / Sinatra /
Ruby app. At the time of writing, Bundler&#8217;s not yet 1.0, so any
complaints are just bitching, at this stage.</p>

<p>Bundler was written by <em>great</em> ruby programmers (Yehuda Katz + Carl
Lerche), it&#8217;s passed through 40 point releases, and it&#8217;s on track
to be the de facto standard for application gem management in Rails
3.  But it&#8217;s <strong>slow as balls.</strong></p>

<p>Using Bundler is simple: list your app&#8217;s gems in a Gemfile, run
bundle install (or bundle lock), and any missing gem requirements
will be installed into a local gems directory, and chroot&#8217;d off
from your main system gems, allowing you to sandbox different gem
sets for different apps without conflict. In concept it&#8217;s great.</p>

<p>Unfortunately, the implementation is glacially slow, even for what
should be trivial operations.</p>

<p>For example, check out the below timing comparisons (sub 1 second
vs 20 seconds) when checking whether a single gem (<a href="http://sinatrarb.com">sinatra</a>),
with one dependency, is installed. (on my system, it is). The first
test uses simple unix shell commands: gem + grep.</p>

<p>Bear witness: the simple unix test takes:</p>

<figure class='code'><figcaption><span>Bundler is not fast. It is slow. (bundler-slowness.sh)</span> <a href='http://blog.jm3.net/downloads/code/bundler-slowness.sh'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>jm3 % <span class="nb">time </span>gem list | grep <span class="s2">&quot;rack\|sinatra&quot;</span>
</span><span class='line'>rack <span class="o">(</span>1.2.0, 1.1.0<span class="o">)</span>
</span><span class='line'>sinatra <span class="o">(</span>1.0<span class="o">)</span>
</span><span class='line'>sinatra-bundles <span class="o">(</span>0.2.0<span class="o">)</span>
</span><span class='line'>gem list 0.19s user 0.03s system 97% cpu 0.226 total
</span><span class='line'>grep <span class="s2">&quot;rack\|sinatra&quot;</span> 0.00s user 0.00s system 1% cpu 0.224 total
</span><span class='line'>
</span><span class='line'>jm3 % cat Gemfile
</span><span class='line'><span class="nb">source</span> <span class="s2">&quot;http://rubygems.org&quot;</span>
</span><span class='line'>gem <span class="s2">&quot;sinatra&quot;</span>, <span class="s2">&quot;1.0&quot;</span>
</span><span class='line'>
</span><span class='line'>jm3 % <span class="nb">time </span>bundle install
</span><span class='line'>Fetching <span class="nb">source </span>index from http://rubygems.org/
</span><span class='line'>Using rack <span class="o">(</span>1.2.1<span class="o">)</span> from bundler gems
</span><span class='line'>Using sinatra <span class="o">(</span>1.0<span class="o">)</span> from system gems
</span><span class='line'>Your bundle is <span class="nb">complete</span>! Use <span class="sb">`</span>bundle show <span class="o">[</span>gemname<span class="o">]</span><span class="sb">`</span> to see where a bundled gem is installed.
</span><span class='line'>
</span><span class='line'>bundle install 20.67s user 1.15s system 94% cpu 22.993 total
</span><span class='line'>jm3 %
</span></code></pre></td></tr></table></div></figure>


<p>20X slowdown for a no-op? Yes, yes, it has to walk the dependency
tree and calculate recursive deps, but cache that shit!</p>

<p><img src="http://blog.jm3.net/images/posts/2010/2010-06-22-bundler-classic.jpg" alt="Bundler" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rubunkulous - a robust & resilient link-checker]]></title>
    <link href="http://blog.jm3.net/2009/09/06/rubunkulous-a-resilient-link-checker/"/>
    <updated>2009-09-06T14:54:00-07:00</updated>
    <id>http://blog.jm3.net/2009/09/06/rubunkulous-a-resilient-link-checker</id>
    <content type="html"><![CDATA[<p><a href="http://github.com/jm3/rubunkulous"><img src="http://blog.jm3.net/images/posts/2009/2009-09-06-rubunkulous-link-checker-screenshot.png" alt="alt" /></a></p>

<h2>Rubunkulous!</h2>

<blockquote><p>A robust &amp; resilient link-checker</p></blockquote>

<p>Introducing <em>Rubunkulous</em>, a <a href="http://del.icio.us" title="aka Del.icio.us">delicious</a> link-checker
using Yehuda&#8217;s <a href="http://github.com/wycats/moneta/" title="backend-agnostic key-value store">moneta gem</a> (specifically the 
<a href="http://en.wikipedia.org/wiki/Extended_file_attributes#Mac_OS_X" title="Extended filesystem attributes">xattr storage module</a>) to find and record dead links in
large bookmark collections.</p>

<p>Many <a href="http://www.malarkeysoftware.com/projects_dead-licious.html">scripts</a> and <a href="http://www.fortysomething.ca/mt/etc/archives/006230.php">apps</a> purport to check your
delicious links but all of them fall to their knees when confronted
with my massive <a href="http://delicious.com/jm3">14,000+ link bookmark collection</a>. Rubunkulous
was designed to perform well with big link collections like mine.
It caches API responses and tracks its own progress so you can
interrupt and resume it whenever you like without losing data or
wasting time re-checking links.</p>

<p>I used this project to teach myself:</p>

<ul>
<li>loading values from <a href="http://en.wikipedia.org/wiki/YAML" title="Yet Another Markup Language">Yaml</a></li>
<li>persisting to and reading from <a href="http://github.com/wycats/moneta/" title="backend-agnostic key-value store">Moneta</a> stores</li>
<li>parsing XML in ruby</li>
<li>handling ctl-C interrupts and recovering</li>
<li>opening and modifying classes with class_eval (this project began
as extensions to a Del.icio.us library for Ruby called
&#8221;<a href="http://ridiculous.rubyforge.org/" title="Ruby wrapper for the Delicious API">ridiculous</a>&#8221;, but the Ridiculous code had bugs and
did some things I didn&#8217;t need, so I gave up modifying that and
wrote my own (simpler) interface to the <a href="http://delicious.com/developers#title1">Delicious API</a>)</li>
<li>handling network exceptions</li>
</ul>


<p>I hope you enjoy it. May your links be clean as the driven snow!</p>

<p><a href="http://github.com/jm3/rubunkulous">github.com/jm3/rubunkulous</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing Rubunkulous!"]]></title>
    <link href="http://blog.jm3.net/2009/06/22/introducing-rubunkulous/"/>
    <updated>2009-06-22T17:47:00-07:00</updated>
    <id>http://blog.jm3.net/2009/06/22/introducing-rubunkulous</id>
    <content type="html"><![CDATA[<p><a href="http://github.com/jm3/rubunkulous"><img src="http://blog.jm3.net/images/posts/2009/2009-09-06-rubunkulous-link-checker-screenshot.png" alt="screenshot" /></a></p>

<p>Introducing <em>Rubunkulous</em>, a <a href="http://del.icio.us">del.icio.us</a>
link-checker using <a href="http://yehudakatz.com/">Yehuda</a>&#8217;s
<a href="http://github.com/wycats/moneta/tree/master">moneta</a> (specifically
the <a href="http://en.wikipedia.org/wiki/Extended_file_attributes#Mac_OS_X">xattr storage
module</a>) to
find and record dead links in large bookmark collections.</p>

<p>Many <a href="http://www.malarkeysoftware.com/projects_dead-licious.html">scripts</a>
and <a href="http://www.fortysomething.ca/mt/etc/archives/006230.php">apps</a>
purport to check your delicious links but all of them fall to their
knees when confronted with my massive 13,000+ link bookmark collection.
<em>Rubunkulous</em> was designed to perform well with big link collections
like mine. It caches API responses and tracks its own progress so
you can interrupt and resume it whenever you like without losing
data or wasting time re-checking links.</span></p>

<p>I used this project to teach myself:</p>

<ul>
<li>loading values from <a href="http://en.wikipedia.org/wiki/YAML">YAML</a></li>
<li>persisting to and reading from Moneta stores</li>
<li>parsing XML in ruby</li>
<li>handling ctl-C interrupts and recovering</li>
<li>opening and modifying classes with class_eval (this project began as extensions to a Del.icio.us library for Ruby called &#8221;<a href="http://ridiculous.rubyforge.org/" title="Ruby wrapper for the Delicious API" >Ridiculous</a>&#8221;, but the Ridiculous code had bugs and did some things I didn&#8217;t need, so I gave up modifying that and wrote my own (simpler) interface to the <a href="http://delicious.com/help/api">Del.icio.us API</a>.)</li>
<li>handling exceptions</li>
</ul>


<p>I hope you enjoy it, <a href="http://github.com/jm3/rubunkulous">may your links be clean as the driven snow</a>.</p>
]]></content>
  </entry>
  
</feed>
