<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.7.4">Jekyll</generator><link href="http://matt.meshul.am/feed.xml" rel="self" type="application/atom+xml" /><link href="http://matt.meshul.am/" rel="alternate" type="text/html" /><updated>2018-10-07T09:29:50-05:00</updated><id>http://matt.meshul.am/</id><title type="html">matt meshulam</title><subtitle>Maker at large</subtitle><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><entry><title type="html">My Year of Making Stuff</title><link href="http://matt.meshul.am/blog/2017/my-year-of-making-stuff/" rel="alternate" type="text/html" title="My Year of Making Stuff" /><published>2017-01-19T00:00:00-06:00</published><updated>2017-01-19T00:00:00-06:00</updated><id>http://matt.meshul.am/blog/2017/my-year-of-making-stuff</id><content type="html" xml:base="http://matt.meshul.am/blog/2017/my-year-of-making-stuff/">&lt;p&gt;In 2016 I worked on a ridiculously broad range of projects, both for work and
independently. Sometimes I forget projects or things I learned a while ago, so I decided
to write up a summary of the highlights.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I started the year writing Scala and Javascript at TempoIQ, which was
incredibly my first time working as an official software engineer. It was the perfect startup
experience: constantly learning and building cool things and culminating in an
underwhelming acqui-hire.&lt;/li&gt;
  &lt;li&gt;My brief time at the acquiring company was in Ruby on Rails.
It was a fun throwback to my first-ever paid programming gig in 2007–
building a course website for one of my professors when Rails was just a couple
years old.&lt;/li&gt;
  &lt;li&gt;Since August-ish, I’ve been working with Hologram on Developer Experience.
In November we released a brand
new &lt;a href=&quot;https://hologram.io/docs/&quot;&gt;documentation site&lt;/a&gt;!&lt;/li&gt;
  &lt;li&gt;I had a small project helping a fellow member of
&lt;a href=&quot;http://pumpingstationone.org&quot;&gt;Pumping Station One&lt;/a&gt; on some software for a 3D
head-and-torso scanner. I didn’t get involved until late in the project, but
it got me jazzed about &lt;a href=&quot;https://twitter.com/mattmeshulam/status/811801934290124800&quot;&gt;3D
scanning technology&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Speaking of PS:1, I started teaching the &lt;a href=&quot;/blog/2016/introduction-to-cnc/&quot;&gt;ShopBot CNC
class&lt;/a&gt; there back in January.
Over the course of the year I authorized over 100 people on the farily
complex piece of equipment.&lt;/li&gt;
  &lt;li&gt;Thanks to PS:1 and the ShopBot, I also had my first paid machinist job,
helping a member make an enclosure for a product prototype he’s developing.&lt;/li&gt;
  &lt;li&gt;I was really all about the ShopBot last year–my 
&lt;a href=&quot;/projects/CNC-birdbath/&quot;&gt;Birdbath&lt;/a&gt; was probably my most involved CNC project
to date. And it also marked my return to making videos; the last time I spent
serious time in an editing program was in high school.&lt;/li&gt;
  &lt;li&gt;I played around with using Android devices as interfaces for embedded
electronics projects (Arduino and similar). I got a prototype light controller
working but lost momentum as I realized I don’t like developing Android apps.&lt;/li&gt;
  &lt;li&gt;On the more traditional craft/woodworking side, I made an &lt;a href=&quot;/projects/cutting-board/&quot;&gt;end grain cutting
board&lt;/a&gt;!&lt;/li&gt;
  &lt;li&gt;For Reverb, I developed an &lt;a href=&quot;https://interact.reverb.com/bonamassa/&quot;&gt;interactive
tour&lt;/a&gt; of guitarist Joe Bonamassa’s
home and studio.&lt;/li&gt;
  &lt;li&gt;I dipped my toe into Twitter bots with one that &lt;a href=&quot;https://twitter.com/538minus8&quot;&gt;replayed FiveThirtyEight’s
articles&lt;/a&gt; from eight years ago.
&lt;a href=&quot;https://github.com/meshulam/replay-bot&quot;&gt;Code here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;In order to learn more about the Rust programming language and the internals
of Git, I started re-implementing Git in Rust. &lt;a href=&quot;https://github.com/meshulam/grit&quot;&gt;I didn’t get very
far&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;I designed and built some lampshades from laser-cut acrylic. Once PS:1’s new
big laser cutter comes online, I’m hoping to revisit that project.&lt;/li&gt;
  &lt;li&gt;Toward the end of the year I started attending &lt;a href=&quot;https://chihacknight.org/&quot;&gt;Chi Hack
Night&lt;/a&gt;, where I’ve been working with the &lt;a href=&quot;http://chicagojustice.org/&quot;&gt;Chicago
Justice Project&lt;/a&gt; on scraping and analyzing news
coverage of crime in Chicago.&lt;/li&gt;
  &lt;li&gt;And my final project of 2016: &lt;a href=&quot;/projects/robby-1/&quot;&gt;Robby #1&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">In 2016 I worked on a ridiculously broad range of projects, both for work and independently. Sometimes I forget projects or things I learned a while ago, so I decided to write up a summary of the highlights.</summary></entry><entry><title type="html">CNC Experiments: Baltic Birch Plywood</title><link href="http://matt.meshul.am/blog/2016/cnc-experiments/" rel="alternate" type="text/html" title="CNC Experiments: Baltic Birch Plywood" /><published>2016-09-23T00:00:00-05:00</published><updated>2016-09-23T00:00:00-05:00</updated><id>http://matt.meshul.am/blog/2016/cnc-experiments</id><content type="html" xml:base="http://matt.meshul.am/blog/2016/cnc-experiments/">&lt;p&gt;I’m planning some projects involving CNCing shapes from plywood
and wanted to get a better sense of what tools/feedrates/etc will produce
the best results. There’s a near-infinite supply of anecdotal feeds &amp;amp;
speeds advice 
online, but not nearly as much data from controlled tests.&lt;/p&gt;

&lt;p&gt;I recently bought some new end mills and was doing some test cuts of my own, 
and figured the results might be helpful for others.&lt;/p&gt;

&lt;h2 id=&quot;tldr&quot;&gt;TL;DR&lt;/h2&gt;

&lt;p&gt;To cut parts from Baltic birch plywood, use a 1/4” 2-flute straight end mill at 
10k RPM and a feed rate of 150-200 IPM. Use conventional milling and a max pass 
depth of 0.25”.&lt;/p&gt;

&lt;h2 id=&quot;the-setup&quot;&gt;The setup&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Material:&lt;/strong&gt; 12mm (measured 0.470”) Baltic Birch plywood&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Two brand new 2-flute 1/4” end mills:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Freud 04-110 1/4” straight&lt;/li&gt;
  &lt;li&gt;Freud 76-102 1/4” down spiral&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CNC:&lt;/strong&gt; 48x96 inch ShopBot PRS at Pumping Station: One&lt;/p&gt;

&lt;p&gt;I modeled a small test shape in Fusion 360 and generated sevaral toolpaths 
with varying feed rate, number of depth passes, and milling direction. Spindle speed was
a constant 10k RPM.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-09-23-toolpath.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-09-23-toolpath.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Fig 1: Fusion 360 model and toolpaths&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Here are the 8 samples I cut:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Sample&lt;/th&gt;
      &lt;th&gt;Tool&lt;/th&gt;
      &lt;th&gt;Feed rate (IPM)&lt;/th&gt;
      &lt;th&gt;Passes&lt;/th&gt;
      &lt;th&gt;Milling direction&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;A1&lt;/td&gt;
      &lt;td&gt;Straight&lt;/td&gt;
      &lt;td&gt;75&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;A2&lt;/td&gt;
      &lt;td&gt;Straight&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;A3&lt;/td&gt;
      &lt;td&gt;Straight&lt;/td&gt;
      &lt;td&gt;225&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;A4&lt;/td&gt;
      &lt;td&gt;Straight&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;B1&lt;/td&gt;
      &lt;td&gt;Downcut&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Climb&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;B2&lt;/td&gt;
      &lt;td&gt;Downcut&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;B3&lt;/td&gt;
      &lt;td&gt;Downcut&lt;/td&gt;
      &lt;td&gt;225&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;B4&lt;/td&gt;
      &lt;td&gt;Downcut&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Conventional&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;I swapped the slowest cut (A1) for medium-speed climb cut (B1) when I switched from
the straight to the downcut bit. I originally planned to redo all 4 parts as climb cuts,
but decided to just do one for comparison as I knew conventional was better for my
purposes (more on that later).&lt;/p&gt;

&lt;h3 id=&quot;straight-vs-downcut&quot;&gt;Straight vs. Downcut&lt;/h3&gt;

&lt;p&gt;The side walls of the downcut cuts had subtle ridges, while the straight tool’s cuts
were almost perfectly smooth. The downcut was louder when cutting, and I 
assume those two things are related. The shaft of the downcut bit is about 1/4” shorter
than the straight bit, so it’s possible the collet didn’t get as good of a grip
on the downcut, causing some chatter. Not sure what else could have caused it,
I certainly didn’t expect such a difference in finish between two such similar tools.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-09-23-downcut-edges.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-09-23-downcut-edges.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Fig 2: Downcut parts. From top: B4, B2, B3&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-09-23-straight-edges.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-09-23-straight-edges.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Fig 3: Straight flute parts. From top: A4, A2, A3&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;The straight flute parts had a slightly cleaner bottom surface, which is expected, but the difference was very
minor. I wouldn’t consider the difference to be significant, and would probably disappear entirely
with light sanding (I didn’t sand at all before these photos).&lt;/p&gt;

&lt;h3 id=&quot;feed-rate&quot;&gt;Feed rate&lt;/h3&gt;

&lt;p&gt;I varied the feed rate from a definitely-too-low 75 IPM (0.00375” chip load) to
225 IPM (0.01125” chip load). The ShopBot can comfortably go a little faster, but 
I stopped there because with such a small part, it would have been unlikely to
ever accelerate much faster than that.&lt;/p&gt;

&lt;p&gt;There was very little difference in cut quality over this 300% variation
in speed. The slowest cuts were slightly louder than the others, and the
chips produced were noticably smaller, but nothing too concerning. One
of the biggest effects of changing feed rate is the lifetime of the tool,
so perhaps there would be a noticeable difference in that regard between
150 and 225 IPM. But for hobbyist-level usage, I’d be comfortable recommending
anything in that range.&lt;/p&gt;

&lt;p&gt;I’d like to test even higher chip loads by reducing spindle speed below 10,000 RPM, 
but that will need to wait for the next round of experiments.&lt;/p&gt;

&lt;h3 id=&quot;climb-vs-conventional-milling--other-dimensional-variations&quot;&gt;Climb vs. conventional milling &amp;amp; other dimensional variations&lt;/h3&gt;

&lt;p&gt;I’ve noticed that climb toolpaths tend to produce parts slightly larger than their
specified dimensions, and conventional toolpaths are usually right on.
I think this is because of the deflection of the bit from the
difference in force between the two sides of the path.&lt;/p&gt;

&lt;p&gt;On each part, I used calipers to measure the width of the two “teeth”:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Cut type&lt;/th&gt;
      &lt;th&gt;Min (inches)&lt;/th&gt;
      &lt;th&gt;Max (inches)&lt;/th&gt;
      &lt;th&gt;Count&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;As designed&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;0.940&lt;/td&gt;
      &lt;td&gt;0.940&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Conventional 2-pass&lt;/td&gt;
      &lt;td&gt;0.937&lt;/td&gt;
      &lt;td&gt;0.941&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Climb 2-pass&lt;/td&gt;
      &lt;td&gt;0.950&lt;/td&gt;
      &lt;td&gt;0.951&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Conventional 1-pass&lt;/td&gt;
      &lt;td&gt;0.929&lt;/td&gt;
      &lt;td&gt;0.931&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The climb cut was about 0.01” oversized, and the 1-pass conventional cut
was about 0.01” undersized. Precise dimensioning in wood is always
an uphill battle due to heat- and humidity-related expansion, but these 
0.01” variations make a big difference for joinery.&lt;/p&gt;

&lt;p&gt;The long slots on each part were designed to be as wide as the thickness of the
material (0.470”) to allow two parts to slot into each other. 
The smaller 1-pass parts could slide into each other easily,
with some wiggle when joined. The conventional 2-pass parts could be joined
with some force, but were difficult to re-separate. The climb-milled parts
were too big (resulting in a slot too narrow) to be joined at all.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-09-23-straight-dims.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-09-23-straight-dims.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Fig 4: Straight bit parts with dimensions&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-09-23-downcut-dims.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-09-23-downcut-dims.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Fig 5: Downcut bit parts with dimensions&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;h3 id=&quot;pass-depthnumber-of-passes&quot;&gt;Pass depth/number of passes&lt;/h3&gt;

&lt;p&gt;The A4 and B4 tests cut a single ~0.5” deep pass instead of splitting
the depth into two passes. It sounded like the spindle was struggling a little more
than with the other cuts, but the quality of the finish was still great. In fact, 
some of the 2-pass parts had a visible line halfway through the part at the
bottom of the first pass (see Figure 3 above), so the single pass actually had
a better finish.&lt;/p&gt;

&lt;p&gt;The different sound when cutting, combined with the smaller finished dimension,
leads me to believe that cutting 1/2” deep is causing excess vibration in the tool.
If you’re really in a hurry it works well enough, but I’d advise going a little
faster and taking two passes instead.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;These tests didn’t cover the full range of every CNC parameter I’m interested in, but
I definitely learned a lot by this more scientific approach. Hopefully others
will find these observations useful as well!&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">I’m planning some projects involving CNCing shapes from plywood and wanted to get a better sense of what tools/feedrates/etc will produce the best results. There’s a near-infinite supply of anecdotal feeds &amp;amp; speeds advice online, but not nearly as much data from controlled tests.</summary></entry><entry><title type="html">Worms! Worms! Worms!</title><link href="http://matt.meshul.am/blog/2016/worms/" rel="alternate" type="text/html" title="Worms! Worms! Worms!" /><published>2016-05-22T00:00:00-05:00</published><updated>2016-05-22T00:00:00-05:00</updated><id>http://matt.meshul.am/blog/2016/worms</id><content type="html" xml:base="http://matt.meshul.am/blog/2016/worms/">&lt;p&gt;Last weekend I finished a project that’s been on my list for close to a year: 
I started a vermicomposting system. In case you aren’t familiar with the concept,
vermicomposting is a composting technique that uses specific species of worms to 
turn food waste into a fantastic fertilizer (read: worm poop).&lt;/p&gt;

&lt;p&gt;I’ve vermicomposted on and off for a few years in college and afterwards, using a plastic bin with drainage holes drilled in the bottom. This setup worked fine, but 
despite the holes the compost tended to stay very wet, which I suspect encouraged flies and unsavory smells to take hold more than they should. 
Vermicompost should not smell bad at all.&lt;/p&gt;

&lt;p&gt;This time around I decided to build a wood box with a better engineered drainage solution. I’ve heard mixed reviews of using wood containers, but my thinking is that the exposed wood would help regulate moisture by absorbing water when it’s overly wet, and release it if the compost dries up too much.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-finished.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-finished.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Finished worm box (sans lid)&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;The drainage system is a ~1-inch deep “tray” in the bottom of the bin, covered with a fine screen (actually some sheer polyester fabric). All the composting action happens above the screen, but if it becomes oversaturated then water should drain through the screen into the bottom.&lt;/p&gt;

&lt;p&gt;I also added a sealable spout for easy draining of the excess water, by repurposing the top of a plastic soda bottle and using tons of silicone.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-drain.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-drain.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Inside view of tray and drain spout, with screen removed&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;I bought 1/4 pound of red wigglers from a very nice &lt;a href=&quot;http://www.windycityworms.com/&quot;&gt;local woman&lt;/a&gt; selling worms from her own composting system, but realized it would take too long for them to repopulate to fill the bin. So I re-upped with another half pound or so from a live bait shop. Hopefully the hippie organic worms will get along with the more rough-around-the-edges bait worms.&lt;/p&gt;

&lt;p&gt;I’ve been slowly ramping up feeding them scraps this week, and will be figuring out what a good steady-state amount to feed them while they grow into the container. But I think they’re happy so far.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-worms.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2016-05-21-wormbox-worms.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;For anyone considering setting up a vermicomposting system like this, I highly recommend
reading &lt;a href=&quot;http://www.redwormcomposting.com/&quot;&gt;Red Worm Composting&lt;/a&gt;. It’s a great combination 
of anecdotes and more scientific information about this style of composting.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">Last weekend I finished a project that’s been on my list for close to a year: I started a vermicomposting system. In case you aren’t familiar with the concept, vermicomposting is a composting technique that uses specific species of worms to turn food waste into a fantastic fertilizer (read: worm poop).</summary></entry><entry><title type="html">Introduction to CNC Routing</title><link href="http://matt.meshul.am/blog/2016/introduction-to-cnc/" rel="alternate" type="text/html" title="Introduction to CNC Routing" /><published>2016-02-08T16:58:11-06:00</published><updated>2016-02-08T16:58:11-06:00</updated><id>http://matt.meshul.am/blog/2016/introduction-to-cnc</id><content type="html" xml:base="http://matt.meshul.am/blog/2016/introduction-to-cnc/">&lt;p&gt;Last week I taught a new class at &lt;a href=&quot;https://pumpingstationone.org&quot;&gt;Pumping Station: One&lt;/a&gt;, an introduction to CNC routing, focusing on our 4’x8’ ShopBot and Vectric VCarve. In the past we taught the concepts and did a hands-on authorization in a marathon 3-hour session. This wasn’t ideal for a few reasons: it’s hard to absorb so much information in that format, and the authorization aspect meant the sessions had to be capped at 3-4 people since everyone needed to get hands-on time. This led to many members needing to wait a long time before they could get into an auth session.&lt;/p&gt;

&lt;p&gt;This was the first time we split up the authorization into a 2-hour classroom portion, and then a shorter authorization session. I was able to cover concepts in more depth, and people who were casually interested in CNC could attend to learn more without committing to a full authorization.&lt;/p&gt;

&lt;p&gt;The class was about 2/3 concepts and 1/3 a demo of VCarve. I’m not in love with VCarve: it’s not free for hobbyists and is Windows-only, but it has basic vector design and CAM in one package, so it’s good enough. In the future we’ve discussed teaching a different toolchain, but the majority of the class would still stay about the same. I made some slides for the concepts portion, and I figured they might be valuable to post publicly. &lt;a href=&quot;https://s3.amazonaws.com/meshulam-web-content/2016/CNC+Presentation.pdf&quot;&gt;So you can download the slides here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They will probably evolve as we teach more sessions of the class, I will try to keep the PDF up to date.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">Last week I taught a new class at Pumping Station: One, an introduction to CNC routing, focusing on our 4’x8’ ShopBot and Vectric VCarve. In the past we taught the concepts and did a hands-on authorization in a marathon 3-hour session. This wasn’t ideal for a few reasons: it’s hard to absorb so much information in that format, and the authorization aspect meant the sessions had to be capped at 3-4 people since everyone needed to get hands-on time. This led to many members needing to wait a long time before they could get into an auth session.</summary></entry><entry><title type="html">Dotfile Makeover 2016</title><link href="http://matt.meshul.am/blog/2016/delving-into-personal-configuration/" rel="alternate" type="text/html" title="Dotfile Makeover 2016" /><published>2016-01-18T18:16:49-06:00</published><updated>2016-01-18T18:16:49-06:00</updated><id>http://matt.meshul.am/blog/2016/delving-into-personal-configuration</id><content type="html" xml:base="http://matt.meshul.am/blog/2016/delving-into-personal-configuration/">&lt;p&gt;For the past couple years, I’ve halfheartedly maintained a &lt;a href=&quot;https://github.com/meshulam/dotfiles&quot;&gt;dotfile repository&lt;/a&gt; where I keep config files for the Unix-style applications I use on a regular basis. Most of it was naïvely adopted from convincing-sounding commenters on Hacker News, who mandated using the hottest Z Shell frameworks, Vim plugin managers, and other configuration esoterica.&lt;/p&gt;

&lt;p&gt;A lot about it was kind of magic to me, and I had a suspicion that some of the configuration was unnecessary for my own use, or was even resulting in poor performance. So I finally decided to give my configs a once-over.&lt;/p&gt;

&lt;h3 id=&quot;objectives&quot;&gt;Objectives&lt;/h3&gt;

&lt;p&gt;I use a small number of computers and OSes on a regular basis: personal and work OS X laptops, personal Ubuntu server, plus the fleet of CentOS servers that I need to log into occasionally. While the specific breakdown will change over time, I wanted my personal configuration to reflect some aspects of how I use computers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;OS neutral&lt;/strong&gt; - My configs should be relatively portable across different Unix-like OSes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;As simple as possible, but no simpler&lt;/strong&gt; - Just like in real software development, every additional component has an intrinsic cost in complexity and future maintenance. Before adding a new tool or changing something, evaluate whether it’s worth the cost.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Enrichment over redefinition&lt;/strong&gt; - There will always be times when I need to log onto a box that doesn’t have my configs installed. This should ideally not be a miserable experience. Changing keybindings and stuff is fine, but my own environment shouldn’t differ too dramatically from a “stock” setup. No need to reinvent the wheel, after all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were two main areas I wanted to focus on: my shell and Vim configs.&lt;/p&gt;

&lt;h3 id=&quot;shell&quot;&gt;Shell&lt;/h3&gt;

&lt;p&gt;Most people get on perfectly well with Bash, but I chose to stick with ZSH, which I’ve been using for a couple years. This was mainly because I’ve gotten used to the awesome tab-completion, but re-reading &lt;a href=&quot;http://www.slideshare.net/jaguardesignstudio/why-zsh-is-cooler-than-your-shell-16194692&quot;&gt;this presentation&lt;/a&gt; reaffirmed my conviction.&lt;/p&gt;

&lt;p&gt;I’ve been using &lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;oh-my-zsh&lt;/a&gt; since I started using zsh, but have been thinking about dumping it for a while. It seems to make new terminal sessions start up slowly, and I wasn’t sure I needed a whole plugin system to configure the few things I actually use from it.&lt;/p&gt;

&lt;p&gt;I made a simple &lt;a href=&quot;https://github.com/meshulam/dotfiles/blob/master/.zshrc&quot;&gt;.zshrc&lt;/a&gt; that  sources all files in a given directory, letting me split up my config into separate files for aliases, prompt, etc:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;ZSH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;~/cfg/zsh
&lt;span class=&quot;nv&quot;&gt;GLOB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ZSH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/*&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;sourcefile &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$~&lt;/span&gt;GLOB
&lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$sourcefile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This seems to be a good compromise between a framework like oh-my-zsh and a single monolithic .zshrc. I started with a totally blank slate and have been re-adding aliases and options that I’ve noticed not working the way I want or expect.&lt;/p&gt;

&lt;p&gt;Notable things I did:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Replaced oh-my-zsh’s git prompt with Git’s provided &lt;a href=&quot;https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh&quot;&gt;git-prompt.sh&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Learned how to configure &lt;a href=&quot;https://github.com/meshulam/dotfiles/blob/a0bd77afdda1f2a3616da7fd490269762dfa4705/zsh/history.zsh&quot;&gt;history sharing between shell sessions&lt;/a&gt; so I know why it sometimes doesn’t behave how I expect it to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I really like that I’ve either written or explicitly added everything that gets sourced. I think I’ll be much less likely to be surprised by behavior or performance problems in the future.&lt;/p&gt;

&lt;h3 id=&quot;vim-config&quot;&gt;Vim config&lt;/h3&gt;

&lt;p&gt;I wound up sticking with &lt;a href=&quot;https://github.com/tpope/vim-pathogen&quot;&gt;Pathogen&lt;/a&gt; as a Vim plugin manager and using Git submodules to pin to plugin versions. There are newer frameworks that help with stuff like auto-updating, but I don’t add/update plugins too often so I wanted to stick with the simplest thing. I don’t use submodules in Git too often, so I made a command cheatsheet for adding/updating them.&lt;/p&gt;

&lt;p&gt;I still went through my existing plugins and vimrc and made some changes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set spacebar as the leader key and started using it in custom keybindings. I never got too crazy with adding key mappings but I can see myself using it more now that I understand the leader is basically a user-owned “namespace” for shortcuts.&lt;/li&gt;
  &lt;li&gt;Mapped ‘jk’ to exiting insert mode: &lt;code class=&quot;highlighter-rouge&quot;&gt;inoremap jk &amp;lt;esc&amp;gt;&lt;/code&gt;. This one has been a life-changer. Hitting escape has been in my muscle memory for years, but after a day I was totally used to it and will never go back. It’s so fast!&lt;/li&gt;
  &lt;li&gt;Got rid of &lt;a href=&quot;https://github.com/fholgado/minibufexpl.vim&quot;&gt;MiniBufExpl&lt;/a&gt; as a way to display open buffers like tabs. I still get the urge to cycle through buffers, but I’m trying to break that habit and figure out a more vim-like workflow that works for me. For now, listing buffers and switching by number is working okay.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;further-changes&quot;&gt;Further changes&lt;/h3&gt;

&lt;p&gt;At some point I’ll tackle my tmux config, since I’m sure I could be using more of its power day-to-day. I’d also like to write an install script to automatically symlink the config files from the repo to their expected locations. But for now I’m happy with where things are at, and being more familiar with my configs will make me more likely to dive in and change stuff if I feel the need to.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">For the past couple years, I’ve halfheartedly maintained a dotfile repository where I keep config files for the Unix-style applications I use on a regular basis. Most of it was naïvely adopted from convincing-sounding commenters on Hacker News, who mandated using the hottest Z Shell frameworks, Vim plugin managers, and other configuration esoterica.</summary></entry><entry><title type="html">Carbonation Rig</title><link href="http://matt.meshul.am/blog/2015/carbonation-rig/" rel="alternate" type="text/html" title="Carbonation Rig" /><published>2015-10-02T01:24:40-05:00</published><updated>2015-10-02T01:24:40-05:00</updated><id>http://matt.meshul.am/blog/2015/carbonation-rig</id><content type="html" xml:base="http://matt.meshul.am/blog/2015/carbonation-rig/">&lt;p&gt;I recently got the itch to make my own sodas and other carbonated beverages. So I did what any reasonable person would do and bought a large CO2 tank, a regulator and various fasteners and tubing.&lt;/p&gt;

&lt;p&gt;Why DIY instead of use a popular off-the-shelf solution like a SodaStream? I’m not forced to buy CO2 refills through a single source, plus I can carbonate stuff other than pure water (though apparently newer, more expensive SS models are OK for pre-carbonation mixing). Not to mention, now I’m just a few short steps away from having a kegerator setup as well &lt;em&gt;(step one: cut a hole in a fridge)&lt;/em&gt;.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2015-10-02-2015-10-01_20.56.16_jzhnd2.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2015-10-02-2015-10-01_20.56.16_jzhnd2.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;The rig&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;I’ve been using the rig for about a month now, and it works like a charm. Here’s how I did it.&lt;/p&gt;

&lt;h2 id=&quot;the-build&quot;&gt;The build&lt;/h2&gt;

&lt;p&gt;I bought everything but the CO2 cylinder itself from Amazon:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B008EKR0UG&quot;&gt;Taprite Regulator&lt;/a&gt; - Hooks onto the canister and allows you to adjust the output pressure&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B0064OI77Y&quot;&gt;Hose and ball lock valve&lt;/a&gt; - Hose connects to the regulator and the lock mates with the …&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B008071H8O&quot;&gt;Ball lock to threaded cap adaptor&lt;/a&gt; - Screws onto any standard plastic bottle and allows for easy connect/disconnect of the hose without depressurizing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got a brand new 5lb aluminum cylinder filled with food-grade CO2 from a &lt;a href=&quot;http://www.citywelding.com/&quot;&gt;local welding supply store&lt;/a&gt;. Now that I own the cylinder I can trade it in for a refill for about $20. But I expect this one to last around a year unless I start going soda-crazy.&lt;/p&gt;

&lt;p&gt;The assembly was pretty straightforward: screw the regulator onto the tank, and slip the hose onto the barbed output of the regulator. I put the end of the hose into hot water for a minute to soften it up, then lightly tightened the hose clamp onto it.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2015-10-02-2015-10-01_20.49.52_ckogxd.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2015-10-02-2015-10-01_20.49.52_ckogxd.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;The regulator&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;I always keep the valve on the tank fully opened, but when not in use I close the output valve on the regulator. That seems to strike a good balance between convenience and not losing CO2 to leaks.&lt;/p&gt;

&lt;h2 id=&quot;using-it&quot;&gt;Using it&lt;/h2&gt;

&lt;p&gt;I’ve accumulated various sizes of plastic soda bottles that I re-use. The process is pretty simple:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Mix your drink, chilling it as cold as you can. Cold water absorbs CO2 better.&lt;/li&gt;
  &lt;li&gt;Fill the bottle, leaving a few inches at the top to make agitating it more effective.&lt;/li&gt;
  &lt;li&gt;Squeeze the bottle so that there’s almost no air left at the top, then screw on the carbonation cap.&lt;/li&gt;
  &lt;li&gt;Open the regulator valve and set the regulator to 32-40psi. The ball valve will prevent gas from actually coming out until you connect it to the cap.&lt;/li&gt;
  &lt;li&gt;Connect the ball valve to the cap and agitate the bottle for about a minute. I braced for an exploding bottle the first few times I hooked it up, but no disasters so far.&lt;/li&gt;
  &lt;li&gt;Let the bottle sit pressurized for another few minutes. This can be with the hose still connected, or the cap should maintain pressure even when disconnected.&lt;/li&gt;
  &lt;li&gt;Open the bottle and enjoy your DIY soda!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;tips&quot;&gt;Tips&lt;/h2&gt;

&lt;p&gt;I’m still experimenting with recipes and such, but a few things I’ve learned so far:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The biggest challenge for me is getting the carbonation to “stay.” It’s almost always well carbonated right when I open the bottle, but often if I leave a glass out for over 20 minutes or so, it’s mostly flat. A few things mitigate this problem: keep the water as cold as possible; avoid carbonating liquids with particulate like fruit pulp; and using clean bottles and glassware. Not sure if there’s anything else I’m doing wrong to cause this problem.&lt;/li&gt;
  &lt;li&gt;I find most flavors taste better with at least a little sweetness, even if it’s not traditional soda-level sweet. I mixed up a batch of simple syrup and toss in a few teaspoons before carbonating.&lt;/li&gt;
  &lt;li&gt;Certain flavors come out more after carbonating and others seem to get overshadowed. Luckily this process is ideal for micro-batches, so iteration is cheap and easy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also just ordered Dave Arnold’s &lt;a href=&quot;http://www.amazon.com/Liquid-Intelligence-Science-Perfect-Cocktail/dp/0393089037&quot;&gt;Liquid Intelligence&lt;/a&gt;, which has a whole chapter on carbonated drinks. So I’m sure that will yield more inspiration.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">I recently got the itch to make my own sodas and other carbonated beverages. So I did what any reasonable person would do and bought a large CO2 tank, a regulator and various fasteners and tubing.</summary></entry><entry><title type="html">Coriander seeds</title><link href="http://matt.meshul.am/blog/2015/coriander-seeds/" rel="alternate" type="text/html" title="Coriander seeds" /><published>2015-08-14T02:10:58-05:00</published><updated>2015-08-14T02:10:58-05:00</updated><id>http://matt.meshul.am/blog/2015/coriander-seeds</id><content type="html" xml:base="http://matt.meshul.am/blog/2015/coriander-seeds/">&lt;p&gt;Did you know that coriander and cilantro are the same thing? I remember how my mind was blown when I first discovered that. Anyway, I was growing some cilantro on my balcony and neglected it during a particularly hot and dry period. It bloomed and went to seed, so I picked it and let it dry out inside for a week or so. I figured I could use the seeds as a spice; I’d never grown my own spices before!&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2015-08-14-2015-08-10_18.28.43_p3pkfb.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2015-08-14-2015-08-10_18.28.43_p3pkfb.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Coriander seeds on the stem&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Compared to the &lt;em&gt;Swad&lt;/em&gt; brand seeds I normally use, these were larger and lighter colored, and didn’t have as strong of a flavor. So while a fun experiment, I’ll stick with store-bought coriander seeds.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2015-08-14-2015-08-10_18.37.01_it8wq5.jpg&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2015-08-14-2015-08-10_18.37.01_it8wq5.jpg&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
    &lt;figcaption&gt;Side by side seed comparison&lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Homegrown on the left; store bought on the right&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">Did you know that coriander and cilantro are the same thing? I remember how my mind was blown when I first discovered that. Anyway, I was growing some cilantro on my balcony and neglected it during a particularly hot and dry period. It bloomed and went to seed, so I picked it and let it dry out inside for a week or so. I figured I could use the seeds as a spice; I’d never grown my own spices before!</summary></entry><entry><title type="html">Dusting off the old web-log</title><link href="http://matt.meshul.am/blog/2015/dusting-off-the-old-web-log/" rel="alternate" type="text/html" title="Dusting off the old web-log" /><published>2015-07-07T01:41:49-05:00</published><updated>2015-07-07T01:41:49-05:00</updated><id>http://matt.meshul.am/blog/2015/dusting-off-the-old-web-log</id><content type="html" xml:base="http://matt.meshul.am/blog/2015/dusting-off-the-old-web-log/">&lt;p&gt;I’ve been meaning to start writing again for a while, and before I did that I wanted to refresh my blog design and ultimately my web presence. Did that mean delaying writing instead of &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=JFDI&quot;&gt;JFDI&lt;/a&gt;-ing? Yeah, but here we are finally.&lt;/p&gt;

&lt;p&gt;I moved off my stuffy, passé WordPress site onto these shiny new &lt;a href=&quot;https://ghost.org/&quot;&gt;Ghost&lt;/a&gt; digs. I had taken a time-consuming detour through the land of static site generators, specifically Pelican, but after hours of tweaking templates and CSS, Ghost won out for its plethora of high-quality modern themes. Currently I’m trialing Ghost’s hosted service, and have been pretty happy with it so far (granted, I’m only partially through writing my first post).&lt;/p&gt;

&lt;p&gt;So why the renewed interest in blogging?&lt;/p&gt;

&lt;p&gt;I’ve been working on various creative projects lately, and figured I should really get in the habit of documenting the stuff I’m doing; personal marketing and all that. So here we go again.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">I’ve been meaning to start writing again for a while, and before I did that I wanted to refresh my blog design and ultimately my web presence. Did that mean delaying writing instead of JFDI-ing? Yeah, but here we are finally.</summary></entry><entry><title type="html">Archiving a website with Amazon S3</title><link href="http://matt.meshul.am/blog/2013/archiving-a-website-with-amazon-s3/" rel="alternate" type="text/html" title="Archiving a website with Amazon S3" /><published>2013-08-24T16:14:16-05:00</published><updated>2013-08-24T16:14:16-05:00</updated><id>http://matt.meshul.am/blog/2013/archiving-a-website-with-amazon-s3</id><content type="html" xml:base="http://matt.meshul.am/blog/2013/archiving-a-website-with-amazon-s3/">&lt;p&gt;About five years ago, my friend Zach and I made the EnerJar, an open-source hardware design for a power meter. We created a website, enerjar.net, to document the design. We used the Drupal CMS framework so that we could easily update the content and allow users to comment on it.&lt;/p&gt;

&lt;p&gt;After a few months, the site sat pretty much unchanged, but it was still backed by a database, PHP, and a bit of configuration on a shared hosting environment. After having to fix the site a few times after surprise upgrades and configuration changes, I decided to transition it to a static website where it could live reliably for the rest of time.&lt;/p&gt;

&lt;p&gt;Static websites have many benefits over ones which rely on server-side scripting: they’re cheaper and simpler to host, have virtually no risk of security breaches, and are much more scalable. Of course the downside is that users can’t really interact with static websites, so they only work if you’re okay with a simple read-only product.&lt;/p&gt;

&lt;p&gt;Here’s how I transitioned enerjar.net into a static site hosted on Amazon S3:&lt;/p&gt;

&lt;h2 id=&quot;step-0-prepare-the-site&quot;&gt;Step 0: prepare the site&lt;/h2&gt;

&lt;p&gt;You’re effectively taking a picture of each page on your website, so any dynamic features will no longer work. This includes comments, searching (sometimes), and submitting new content. If you’re transitioning a site that uses a framework like WordPress or Drupal, you’ll want to disable any of these features in advance so that visitors don’t even see them. Otherwise they get an error message when trying to actually submit a comment or something.&lt;/p&gt;

&lt;h2 id=&quot;step-1-download-the-site&quot;&gt;Step 1: download the site&lt;/h2&gt;

&lt;p&gt;From any Unix/Linux/OSX command line, you can use wget to recursively download all the resources on your site. I used the following command:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;wget --recursive --page-requisites --html-extension --convert-links --domains enerjar.net http://enerjar.net/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;“recursive” says to follow links on the page and continue to follow any links on the sub-pages. “page-requisites” tells wget to download not just the page itself, but resources like CSS and Javascript files. “domains” limits the recursive link-following to the enerjar.net domain, so it doesn’t try to download external links.&lt;/p&gt;

&lt;p&gt;I begrudgingly used “html-extension” and “convert-links” to rename every downloaded page file so that it ends with the .html extension. &lt;em&gt;*This could break outside links to your site, but it means you don’t need to manually configure content types for these files on S3. **If a page URL doesn’t end with a file extension, for example, *something.com/blog/entry1&lt;/em&gt;, wget will download it without an extension, to a file called entry1. The problem is that S3 doesn’t know that entry1 is an html file, so when visiting the re-hosted page, your browser will download the file instead of displaying it as an actual page. By adding the .html extension on download we avoid this problem. Maybe someone knows a better way to do this, but I was lazy and this was good enough for me.&lt;/p&gt;

&lt;h2 id=&quot;step-2-test-the-downloaded-site&quot;&gt;Step 2: Test the downloaded site&lt;/h2&gt;

&lt;p&gt;Open the HTML files that you downloaded with wget and make sure that everything shows up correctly and that links still work. For some reason wget didn’t download some of the images on the site, so I had to manually get them and put them in the proper directories. Once everything looks good, you are ready for the fun parts.&lt;/p&gt;

&lt;h2 id=&quot;step-3-create-a-new-s3-bucket&quot;&gt;Step 3: Create a new S3 bucket&lt;/h2&gt;

&lt;p&gt;If you don’t already have one, open an Amazon Web Services account and create a new S3 bucket. Put it in whatever region you want, but &lt;strong&gt;the name of the bucket must be exactly the same as your root domain name&lt;/strong&gt;. So I named my bucket “enerjar.net”.&lt;/p&gt;

&lt;h2 id=&quot;step-3-upload-the-site-contents&quot;&gt;Step 3: Upload the site contents&lt;/h2&gt;

&lt;p&gt;After fiddling with various command-line tools for AWS, I gave up and used Amazon’s Java uploader in the browser. You need to use the Java one to upload directories, otherwise you’ll need to manually recreate the directory tree and upload files into each folder separately. Be sure to upload the site into the root directory of the bucket.&lt;/p&gt;

&lt;h2 id=&quot;step-4-configure-static-website-hosting&quot;&gt;Step 4: configure static website hosting&lt;/h2&gt;

&lt;p&gt;In “properties” for the bucket, select &lt;em&gt;Static website hosting-&amp;gt;Enable website hosting&lt;/em&gt;. Set your root and error documents as necessary.&lt;/p&gt;

&lt;h2 id=&quot;step-5-custom-domain&quot;&gt;Step 5: Custom domain&lt;/h2&gt;

&lt;p&gt;Follow &lt;a href=&quot;http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html&quot;&gt;Amazon’s tutorial&lt;/a&gt; for setting up DNS for hosting a static site with your own domain. The only snag I hit was that it didn’t autocomplete the domain name for the alias. I thought it needed to be the domain of the actual S3 bucket (e.g. enerjar.net.s3-website-blahblah), but it actually just expects the root domain for the region where your bucket lives. In my case, &lt;em&gt;s3-website-us-west-2.amazonaws.com&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-6-dns-and-finishing-up&quot;&gt;Step 6: DNS and finishing up&lt;/h2&gt;

&lt;p&gt;As covered in the linked tutorial in step 5, you’ll need to set up your domain to use Amazon’s name servers. Make sure you also transfer any other DNS records (mailservers, subdomains, etc) to your Route 53 configuration.&lt;/p&gt;

&lt;p&gt;That’s it! You should now have a rock-solid, super-cheap hosting setup for your now-static website.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">About five years ago, my friend Zach and I made the EnerJar, an open-source hardware design for a power meter. We created a website, enerjar.net, to document the design. We used the Drupal CMS framework so that we could easily update the content and allow users to comment on it.</summary></entry><entry><title type="html">A way-too-deep look at Ubuntu Edge’s Indiegogo numbers</title><link href="http://matt.meshul.am/blog/2013/a-way-too-deep-look-at-the-numbers-of-ubuntu-edges-indiegogo-campaign/" rel="alternate" type="text/html" title="A way-too-deep look at Ubuntu Edge's Indiegogo numbers" /><published>2013-07-31T16:07:58-05:00</published><updated>2013-07-31T16:07:58-05:00</updated><id>http://matt.meshul.am/blog/2013/a-way-too-deep-look-at-the-numbers-of-ubuntu-edges-indiegogo-campaign</id><content type="html" xml:base="http://matt.meshul.am/blog/2013/a-way-too-deep-look-at-the-numbers-of-ubuntu-edges-indiegogo-campaign/">&lt;p&gt;&lt;strong&gt;TL;DR: Prospective Ubuntu Edge buyers are ridiculously sensitive to changes in pricing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you follow tech news you’ve probably heard quite a bit about &lt;a href=&quot;http://www.indiegogo.com/projects/ubuntu-edge--35&quot;&gt;Ubuntu’s crowdfunding campaign&lt;/a&gt;, which is trying to raise $32 million to build a cutting-edge smartphone called the Ubuntu Edge. In the 9 days since the campaign began, there’s been a lot of speculation on whether it will fall short of its all-or-nothing funding target. One site, &lt;a href=&quot;http://ubuntu-edge.info/&quot;&gt;ubuntu-edge.info&lt;/a&gt;, shows the amount raised over time:&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu1_ioxjxm.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu1_ioxjxm.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt;Judging from the red on-target line, they aren’t looking too good. But that’s boring. Let’s take a closer look at the rate of the funding so far:&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu2_rrw6nr.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu2_rrw6nr.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt; The weird shape is at least partially due to Ubuntu’s pricing scheme. They began the campaign with two price levels: a limited number of units for $600, and the rest being sold for $830. Then, after a few days, they introduced limited quantities available at lower price points: $625, $675, $725, $775, $780, etc. &lt;a href=&quot;http://images.indiegogo.com/file_attachments/2991/files/20130724034144-IndieGogo_Perk-list_72.png&quot;&gt;See here&lt;/a&gt; for the full distribution.
What struck me from looking at this graph is how clearly you can see the slope changing when a price level sold out. I speculated the story looked like this:&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu3_ld0ffy.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu3_ld0ffy.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt;Fortunately, we don’t need to rely on our eyeballs when there’s data involved; the dataset is available from the site above if you know where to look. I manually picked a single point around each of the kinks I observed and put them into Excel, since I’m not cool enough to use R for this kind of thing.&lt;/p&gt;

&lt;p&gt;First I wanted to confirm that the funds raised in each time interval roughly equaled the corresponding price level*available quantity. It’s not going to be exact since there are some other contribution levels (e.g. $20 just to support them, $10,000 if you are rich and like having Limited Edition things), but most of the money is coming from people just wanting to preorder a phone so this will get us in the ballpark.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu4_hu5jru.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu4_hu5jru.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt;For each interval I drew on the graph above, I took the ending timestamp and cumulative amount raised (columns A and C) from ubuntu-edge.info. By subtracting each dollar amount from the previous row, I got the amount raised per interval (column D). Then I entered the cheapest price level at each time and the quantity available, assuming my hypothesis was correct. Note that we don’t know how many suckers bought the $830 device before Ubuntu added lower price tiers, but they did state that the “hundreds” of them would get a refund for the difference.&lt;/p&gt;

&lt;p&gt;For the rest of the time intervals, we can easily calculate the amount we expected to raise assuming all revenue came from the cheapest presale price level (column I). Then we can see the amount (column J) and percentage (column K) that this estimate differs from the actual amount. Our initial model is actually a really good fit; the first three intervals we have error %’s for are hovering at 5%. Without looking at the numbers, it feels about right that 5% of the revenue is coming from altruistic contributions.&lt;/p&gt;

&lt;p&gt;Before going any further I want to point out that the math is actually a little fuzzier than it looks. There’s nothing to stop someone from buying a more expensive phone when a cheaper level is still available, thus throwing off our Quantity column. Indeed we can see this is happening on the campaign site, since 34 phones have been bought for $830 even with the lower prices available. But we’re just going for ballpark numbers here, and the ballpark looks about right.&lt;/p&gt;

&lt;p&gt;Since intervals 1, 3, and 4 all have a deviation remarkably close to 5%, let’s assume the same holds true for the time period when just the $830 phone was available. To get column K to result in a value of ~5%, there must have been about 740 suckers:&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu5_lsvhyt.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu5_lsvhyt.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;But what’s going on with our error during the $725 and $775 periods? We shoot up to 14% and then 25%. Did people suddenly start buying $10k phones? Did we miss the real points when the price levels sold out?&lt;/p&gt;

&lt;p&gt;Actually, there’s an explanation. When introducing the new price levels during the campaign, Ubuntu also added a “Double Edge” deal, where you can preorder two phones for $1400. Which works out to $700 apiece. Which just happens to be a worse deal than the $675 level but a better deal than the $725 level. So naturally, when the $675 phones sold out, the Double Edge started to get picked up. Let’s keep calibrating our model to a 5% altruism rate and solve for the # of units sold as a double deal:&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu6_wcunit.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu6_wcunit.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Note that the equation for column I has changed to account for the new component.&lt;/p&gt;

&lt;p&gt;Our model estimates that 414 phones (207 units) have been sold as doubles. When I grabbed this data, the actual total was 264 double packs. Not terribly far off.&lt;/p&gt;

&lt;p&gt;Finally, let’s look at the rate of unit sales during each interval to get a feel for price elasticity and the effect of time. It’s pretty obvious that sales slowed down after the initial cheap phones ran out, and we can see a distinct slope change when each subsequent level was depleted, so we know there’s some correlation with price. We also know that sales are probably going to be faster at the beginning when there’s more hype and will slow down after that, at least until it gets very close to the end of the campaign.&lt;/p&gt;

&lt;figure&gt;
    
    &lt;a href=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu7_eblkma.png&quot; class=&quot;image-popup&quot;&gt;
    
        &lt;img src=&quot;http://matt.meshul.am/images/2013-07-31-ubuntu7_eblkma.png&quot; alt=&quot;&quot; /&gt;
    
    &lt;/a&gt;
    
    
&lt;/figure&gt;

&lt;p&gt;Column B is just each timestamp subtracted from the previous. Column H is what we’re interested in: total unit sales (cheapest single price level+doubles) normalized over time.&lt;/p&gt;

&lt;p&gt;I’m staggered by how much price affects the rate of sales. After the initial $600 level sold out, sales trickled in at just 6% of their previous velocity. &lt;strong&gt;When the price went from $625 to $675, only an 8% increase, the rate slowed by almost 60%&lt;/strong&gt;. This corresponds to a crazy-high &lt;a href=&quot;http://en.wikipedia.org/wiki/Price_elasticity_of_demand&quot;&gt;price elasticity of demand&lt;/a&gt; of 7.3. Any way you cut it, prospective Ubuntu Edge buyers are ridiculously price-sensitive.&lt;/p&gt;

&lt;p&gt;What about the effect of time? Early on in the campaign a $830 price point yielded a sales rate of 23.6 units/hour. Later on, this rate was crossed again when the price went up from $725 to $775. Let’s split the difference and speculate that if the price only increased to $750, the sales rate would have once again hit exactly 23.6.&lt;/p&gt;

&lt;p&gt;This would mean that the passage of 3.5 days (from the start of the $830 interval to the start of the $775 interval) has about the same effect on sales as increasing the price by $80 (9.6%).&lt;/p&gt;

&lt;p&gt;Of course it’s hard to conclude anything from this limited set of data. But perhaps these observations can inspire future crowdfunding projects to experiment with different pricing schemes. Personally, I like the idea of surprise price &lt;em&gt;decreases&lt;/em&gt;. You can recapture some of the natural time decay as the campaign goes on, and whoever does this first could get some extra media coverage as well. But it may not be worth it if your early adopters feel like they got screwed.&lt;/p&gt;</content><author><name>Matt Meshulam</name><email>matt@meshul.am</email></author><category term="blog" /><summary type="html">TL;DR: Prospective Ubuntu Edge buyers are ridiculously sensitive to changes in pricing.</summary></entry></feed>