<rss version="2.0">
  <channel>
    <title>Sandwich News</title>
    <link>http://sandwichnews.org</link>
    <description>
      The intersection of sandwiches, technology &amp; photography
    </description>
    
      <item>
        <title>Office River Timelapse</title>
        <link>http://sandwichnews.org/posts/2025/12/04/office-river-timelapse.html</link>
        <guid isPermaLink="false">posts/2025/12/04/office-river-timelapse</guid>
        <pubDate>Thu, 04 Dec 2025 18:24:34 -0700</pubDate>
        <description>&lt;p&gt;I was wondering why one of my AWS accounts had almost 1TB of data in S3. Turns out I never cleaned up the images from &lt;a href=&#34;https://shippingnews.xyz/about&#34;&gt;Shipping News&lt;/a&gt; -- a project where I captured a photo every 30 seconds from my office window, saved it to S3, and ran image recognition to detect boats passing by on the Hudson.&lt;/p&gt;
&lt;p&gt;I&#39;ve been doing a lot with &lt;a href=&#34;https://ffmpeg.org/&#34;&gt;ffmpeg&lt;/a&gt; lately, so I thought I&#39;d see if I could make a quick timelapse. This is just the first day I captured, but I think I have about a year of data...&lt;/p&gt;
&lt;figure&gt;&lt;video src=&#34;/static/images/posts/2025/12/04/timelapse_2022-08-13_web_1080p.mp4&#34; title=&#34;Hudson River Window Aug 13, 2022&#34; controls&gt;&lt;/video&gt;&lt;figcaption&gt;Hudson River Window Aug 13, 2022&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;It&#39;s been offline for a couple years now. I started getting lots of false positives, so I &#34;temporarily&#34; turned it off.&lt;/p&gt;
&lt;p&gt;I&#39;ve still been meaning to take the images with detected boats and try some labeling/training with &lt;a href=&#34;https://pjreddie.com/darknet/yolo/&#34;&gt;YOLO&lt;/a&gt;.  I&#39;d love to bring it back online if I can get more reliable detection.&lt;/p&gt;
&lt;p&gt;It would be cool to do a full year timelapse with detection -- slowing down when boats are crossing the screen, and speeding up when not much is happening.&lt;/p&gt;
&lt;p&gt;This is what makes me a digital hoarder. Now I&#39;m never going to be able to delete these images!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Yosemite Photogravure</title>
        <link>http://sandwichnews.org/posts/2022/10/21/yosemite-photogravure.html</link>
        <guid isPermaLink="false">posts/2022/10/21/yosemite-photogravure</guid>
        <pubDate>Fri, 21 Oct 2022 10:00:00 -0700</pubDate>
        <description>&lt;figure&gt;
  &lt;img src=&#34;/static/images/posts/2022/10/21/DTP-Workshop-26.jpg&#34; /&gt;
  &lt;figcaption&gt;
      Me showing off a print (photo credit &lt;a href=&#34;https://www.instagram.com/irenesearlesphotography/?hl=en&#34;&gt;Irene Searles&lt;/a&gt;)
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I had an incredible time earlier this month learning how to make
&lt;a href=&#34;https://en.wikipedia.org/wiki/Photogravure&#34;&gt;Photogravure&lt;/a&gt; prints at the &lt;a href=&#34;https://www.anseladams.com&#34;&gt;Ansel Adams Gallery&lt;/a&gt; in Yosemite.&lt;/p&gt;
&lt;p&gt;We had a fantastic instructor, &lt;a href=&#34;https://www.clayharmon.com/images&#34;&gt;Clay Harmon&lt;/a&gt;, who wrote &lt;a href=&#34;https://www.amazon.com/Polymer-Photogravure-Step-Step-Highlighting/dp/0815366043&#34;&gt;the book on Polymer Photogravure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It really was an amazing experience waking up every morning in Yosemite, walking to class (occassionally seeing bears on the way!) and spending the day making prints in Ansel Adams&#39; darkroom - I felt like a real artist!&lt;/p&gt;
&lt;p&gt;We even got the opportunity to spend some time exploring a few locations in the park to take photos, guided by Michael from the gallery who was an amazing guide and teacher.&lt;/p&gt;
&lt;p&gt;I feel like I&#39;m hooked on the process.&lt;/p&gt;
&lt;p&gt;Below are some of my prints from the workshop.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Fire Island - Photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21120172.png&#34; /&gt;&lt;figcaption&gt;Fire Island - Photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Golden Gardens Park - Photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21124247.png&#34; /&gt;&lt;figcaption&gt;Golden Gardens Park - Photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge - Chine collé photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21131826.png&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge - Chine collé photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Ballard Locks - Photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21135325.png&#34; /&gt;&lt;figcaption&gt;Ballard Locks - Photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge - photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21142630.png&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge - photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge - photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21150375.png&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge - photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Sedro Wolley Barn - photogravure print 2022&#34; src=&#34;/static/images/posts/2022/10/21/img20221018_21170082.png&#34; /&gt;&lt;figcaption&gt;Sedro Wolley Barn - photogravure print 2022&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I got to make a &lt;em&gt;ton&lt;/em&gt; of prints. None of them are perfect, but I am ready for more practice!&lt;/p&gt;
&lt;p&gt;It&#39;s really such a fun process that I can&#39;t wait to try again.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>PyCon 2022</title>
        <link>http://sandwichnews.org/posts/2022/06/03/pycon-2022.html</link>
        <guid isPermaLink="false">posts/2022/06/03/pycon-2022</guid>
        <pubDate>Fri, 03 Jun 2022 18:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL2Uw4_HvXqvYeXy8ab7iRHjA-9HiYhRQl&#34;&gt;Videos from PyCon 2022&lt;/a&gt; are online. I&#39;ve only made it through a few so far, but they&#39;ve been great. I thought I&#39;d write up a quick summary and some thoughts on the sessions I&#39;ve been able to catch.&lt;/p&gt;
&lt;h2&gt;Brandt Bucher: A Perfect Match The history, design, implementation, and future of Python&#39;s structural pattern matching&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/XpxTrDDcpPE&#34;&gt;Talk Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Brandt is the author of the specification for adding Pattern Matching to Python (in 3.10). The original spec &lt;a href=&#34;https://peps.python.org/pep-0622/&#34;&gt;PEP 622&lt;/a&gt; was later replaced with a series of PEPs, one for the spec &lt;a href=&#34;https://peps.python.org/pep-0634/&#34;&gt;PEP 634&lt;/a&gt;, one for the motivation and rationale &lt;a href=&#34;https://peps.python.org/pep-0635/&#34;&gt;PEP 635&lt;/a&gt;, and an introductory tutorial on using pattern matching in python &lt;a href=&#34;https://peps.python.org/pep-0636/&#34;&gt;PEP 636&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#39;m a big fan of pattern matching from my scala days and I&#39;m excited to see it land in python. The implementation was obviously inspired by other languages, but in a way that feels at home in python.&lt;/p&gt;
&lt;p&gt;Pattern matching makes it really easy and clear to pull apart and match against data structures.&lt;/p&gt;
&lt;p&gt;An example from the &lt;a href=&#34;https://peps.python.org/pep-0636/&#34;&gt;tutorial&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;
@dataclass
class Click:
    position: tuple
    button: Button

match event.get():
    case Click((x, y), button=Button.LEFT):  # This is a left click
        handle_click_at(x, y)
    case Click():
        pass  # ignore other clicks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can see how easy it is to destructure the &lt;code&gt;Click&lt;/code&gt; dataclass and use its attributes in our match.&lt;/p&gt;
&lt;p&gt;I&#39;m really excited this has landed in python and can&#39;t wait to start using it in my own code.&lt;/p&gt;
&lt;h1&gt;Fred Phillips: Hooking into the import system&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/ziC_DlabFto&#34;&gt;Talk Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve never really thought about it, but the import system in python is dynamic and you can provide your own import resolvers fairly easily. I guess it&#39;s somewhat similar to something like &lt;a href=&#34;https://www.baeldung.com/java-classloaders&#34;&gt;Classloaders&lt;/a&gt; in Java.&lt;/p&gt;
&lt;p&gt;In this talk, Fred walks through simplified versions of real world import hooks he&#39;s written/used in production, including a &#34;Blocklist&#34; loader (raises errors if the import is included in a blocklist), and a DB Loader (loads python code from the DB on import), as well as a tracing loader that prints out imports as they are happening.&lt;/p&gt;
&lt;p&gt;Looking into this more, I discovered &lt;a href=&#34;https://realpython.com/python-import/#example-automatically-install-from-pypi&#34;&gt;an example import finder implementation on Real Python&lt;/a&gt; that attempts to pip install modules as they are being imported.&lt;/p&gt;
&lt;p&gt;While loading code from a DB kind of scares me, it was a really interesting talk and this is something I definitely want to play with more.&lt;/p&gt;
&lt;p&gt;Related there&#39;s a draft PEP for making imports lazy &lt;a href=&#34;https://peps.python.org/pep-0690/&#34;&gt;PEP 690&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Jeremiah Paige: Intro to Introspection&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/2XDT37Tbv9c&#34;&gt;Talk Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Python has always been interesting to me w.r.t. how much information is available to inspect at runtime from your code.&lt;/p&gt;
&lt;p&gt;For example, given a method with a docstring comment, like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def my_method():
    &amp;quot;&amp;quot;&amp;quot;
    This method does something amazing!
    &amp;quot;&amp;quot;&amp;quot;
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One can access the docstring with &lt;code&gt;my_method.__doc__&lt;/code&gt; and see that comment. You can even access the source by using &lt;code&gt;inspect.getsource(my_method)&lt;/code&gt;! This kind of stuff blows my mind coming from other languages. Obviously there&#39;s a lot more useful stuff you can get including typing information, call signatures, etc. In this talk, Jeremiah walks through the basics of introspection in python, with an eye towards demystifying how the python &lt;code&gt;help&lt;/code&gt; command could be implemented. Definitely worth checking out!&lt;/p&gt;
&lt;h2&gt;Anthony Shaw: Write faster Python! Common performance anti patterns&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=YY7yJHo0M5I&amp;amp;t=1615s&#34;&gt;Talk Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anthony also discusses &lt;a href=&#34;https://github.com/tonybaloney/perflint&#34;&gt;perflint&lt;/a&gt; a linter that he&#39;s written to check for some of these performance anti-patterns. As he&#39;s mentioned in the talk and the readme, it&#39;s currently pretty early and will raise false positives (can confirm), but it&#39;s a great idea and definitely worth checking out for any performance sensitive code.&lt;/p&gt;
&lt;h2&gt;Bruce Eckel: Making Data Classes Work for You&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/w77Kjs5dEko&#34;&gt;Talk Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bruce talks about encapsulating validation logic into your Data Classes using &lt;code&gt;__post_init__()&lt;/code&gt; (and &lt;code&gt;frozen=True&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;As an example, he goes through using a &lt;code&gt;Stars&lt;/code&gt; dataclass, that basically wraps an &lt;code&gt;int&lt;/code&gt;, but restricts it to be in some range. Then any functions that take or return &lt;code&gt;Stars&lt;/code&gt; are easy to reason about.&lt;/p&gt;
&lt;p&gt;It seems like a good strategy for ensuring consistency and safety in your code.&lt;/p&gt;
&lt;p&gt;Classes are not types, but it reminded me a bit about phantom types in Scala.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>More Cyanotype Toning</title>
        <link>http://sandwichnews.org/posts/2022/02/07/more-cyanotype-toning.html</link>
        <guid isPermaLink="false">posts/2022/02/07/more-cyanotype-toning</guid>
        <pubDate>Mon, 07 Feb 2022 10:00:00 -0700</pubDate>
        <description>&lt;p&gt;I&#39;ve been &lt;em&gt;slowly&lt;/em&gt; working on a series of photographs of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Tappan_Zee_Bridge_(2017–present)&#34;&gt;Tappan Zee Bridge&lt;/a&gt; that I&#39;ve wanted to print as cyanotypes.&lt;/p&gt;
&lt;p&gt;The images really lend themselves to monochrome, and there&#39;s something about the blue of the water and the cyanotype blue that seems to work. That said, I did want to play around with some toning to introduce additional visual interest.&lt;/p&gt;
&lt;p&gt;I&#39;ve experimented with &lt;a href=&#34;/posts/2018/06/12/toning-cyanotypes.html&#34;&gt;cyanotype toning&lt;/a&gt; before, but I thought this would be a good opportunity to try out some of the toning techniques from &lt;a href=&#34;https://www.agolaz.ch&#34;&gt;Annette Golaz&lt;/a&gt;&#39;s excellent book &lt;a href=&#34;https://www.amazon.com/Cyanotype-Toning-Contemporary-Alternative-Photography/dp/0367553546/?tag=engcoffee-20&#34;&gt;Cyanotype Toning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is really an amazing book. If you&#39;re working on cyanotypes at all, you have to pick up this book. Besides the great technical content, the work shown by Annette and other highlighted artists is incredibly inspirational.&lt;/p&gt;
&lt;p&gt;I&#39;ve been really happy with most of these. There&#39;s still some details I want to improve, but overall I like the direction they are going.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype, pink pepper&#34; src=&#34;/static/images/posts/2022/02/07/220206-07629-DSC07629.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype, pink pepper&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This is one of my favorites. &lt;a href=&#34;https://en.wikipedia.org/wiki/Pink_peppercorn&#34;&gt;Pink Peppercorn&lt;/a&gt; (which is actually a berry!), produces a grayish tone. I think I got really lucky with the split tone that occurred here - the gray in the clouds while leaving some blue in the sky and water is just great.&lt;/p&gt;
&lt;p&gt;Below is an untoned version for comparison.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype&#34; src=&#34;/static/images/posts/2022/02/07/220206-07628-DSC07628.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype, oak galls&#34; src=&#34;/static/images/posts/2022/02/07/220206-07631-DSC07631.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype, oak galls&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Oak_apple&#34;&gt;Oak Galls&lt;/a&gt; produce a nice dark black color. I think this ended up a little too dark, but I really like the inky black water.&lt;/p&gt;
&lt;p&gt;Below again is an untoned version for comparison.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype&#34; src=&#34;/static/images/posts/2022/02/07/220206-07630-DSC07630.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype, oak gall&#34; src=&#34;/static/images/posts/2022/02/07/220206-07634-DSC07634.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype, oak gall&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s another w/ Oak Galls, again a bit dark.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype, logwood&#34; src=&#34;/static/images/posts/2022/02/07/220206-07633-DSC07633.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype, logwood&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Haematoxylum_campechianum&#34;&gt;Logwood&lt;/a&gt; I thought would be darker, maybe it needs more time. To me it looks a little washed out, but, maybe it&#39;s worth more exploration.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;tappan zee bridge, cyanotype&#34; src=&#34;/static/images/posts/2022/02/07/220206-07632-DSC07632.jpg&#34; /&gt;&lt;figcaption&gt;tappan zee bridge, cyanotype&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s a bonus bridge cyanotype untoned.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>360 camera</title>
        <link>http://sandwichnews.org/posts/2021/09/18/360.html</link>
        <guid isPermaLink="false">posts/2021/09/18/360</guid>
        <pubDate>Sat, 18 Sep 2021 17:00:00 -0700</pubDate>
        <description>&lt;p&gt;I&#39;ve started playing around with a 360 camera, the &lt;a href=&#34;https://amzn.to/3ApnvZd&#34;&gt;instax 360 one x2&lt;/a&gt;.&lt;/p&gt;
&lt;script type=&#34;text/javascript&#34; src=&#34;https://cdn.jsdelivr.net/npm/pannellum@2.5.6/build/pannellum.js&#34;&gt;&lt;/script&gt;
&lt;style&gt;
  #panorama {
    width: 600px;
    height: 400px;
}    
&lt;/style&gt;

&lt;p&gt;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/npm/pannellum@2.5.6/build/pannellum.css&#34;/&gt;&lt;/p&gt;
&lt;div id=&#34;panorama&#34;&gt;&lt;/div&gt;
&lt;figcaption&gt;Tappan Zee Bridge, 2021&lt;/figcaption&gt;

&lt;script&gt;
var image = &#34;/static/images/posts/2021/09/18/IMG_20210917_094313_00_043_PureShot.jpg&#34;
pannellum.viewer(&#39;panorama&#39;, {
    &#34;panorama&#34;: image,
    &#34;autoLoad&#34;: true
});
&lt;/script&gt;

&lt;p&gt;It has two super wide lenses on either side of it, that get stitched together to produce a 360 image.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge, 2021&#34; src=&#34;/static/images/posts/2021/09/18/IMG_20210917_094220_00_040.jpg&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge, 2021&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The coverage of the lenses actually overlaps enough to hide the camera (and selfie stick from view).&lt;/p&gt;
&lt;p&gt;To produce an interactive 360 view like above, the photos are stiched together into a single image using an &lt;a href=&#34;https://en.wikipedia.org/wiki/Equirectangular_projection&#34;&gt;Equirectangular projection&lt;/a&gt; (which you&#39;ve probably seen used for maps of the earth).&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge, 2021&#34; src=&#34;/static/images/posts/2021/09/18/IMG_20210917_094849_00_076.jpg&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge, 2021&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The projections themselves are sometimes interesting as photos on their own. I want to continue to experiment with this. It&#39;s interesting to me that they appear so heavily manipulated, but in some sense are &#34;straight out of the camera&#34; (not exactly, but still..)&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Tappan Zee Bridge, 2021&#34; src=&#34;/static/images/posts/2021/09/18/IMG_20210917_094420_00_048_PureShot.jpg&#34; /&gt;&lt;figcaption&gt;Tappan Zee Bridge, 2021&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;It feels like it could border on gimmicky if overdone, but I&#39;m hoping to include a few of these in an upcoming photo zine I&#39;m working on.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>110 film</title>
        <link>http://sandwichnews.org/posts/2021/01/10/110.html</link>
        <guid isPermaLink="false">posts/2021/01/10/110</guid>
        <pubDate>Sun, 10 Jan 2021 10:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;dobbs ferry train station, Feb 28th 2020&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790005.jpg&#34; /&gt;&lt;figcaption&gt;dobbs ferry train station, Feb 28th 2020&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I picked up a 110 film camera after seeing that &lt;a href=&#34;https://shop.lomography.com/en/films/110-film&#34;&gt;lomography produces film for 110&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Fujica Pocket 200F&#34; src=&#34;/static/images/posts/2021/01/10/DSC07129.png&#34; /&gt;&lt;figcaption&gt;Fujica Pocket 200F&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;Fujica Pocket 200F&lt;/em&gt; was produced in 1977 and features a 29mm fixed focus lens at f11, and a mechanical shutter speed of 1/60. There are no exposure controls.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;negative size comparison&#34; src=&#34;/static/images/posts/2021/01/10/DSC07102.jpg&#34; /&gt;&lt;figcaption&gt;negative size comparison&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;These negatives are &lt;em&gt;tiny&lt;/em&gt;, about half the size of 35mm.&lt;/p&gt;
&lt;p&gt;Overall, it was a fun camera to shoot! Since there are no exposure controls I just pointed and took the photo, hoping for the best, with mixed results :).&lt;/p&gt;
&lt;p&gt;Some of the shots came out nice, and it was fun to get the contrasty, super grainy look. It made me want to go back to shooting more film - and that&#39;s aways a good thing!&lt;/p&gt;
&lt;p&gt;Check out some other 110 cameras at &lt;a href=&#34;http://www.subclub.org/shop/110.htm&#34;&gt;the Sub Club&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;somewhere in nyc&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790012.jpg&#34; /&gt;
&lt;figcaption&gt;somewhere in nyc&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img alt=&#34;&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790001.jpg&#34; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img alt=&#34;&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790013.jpg&#34; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img alt=&#34;&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790019.jpg&#34; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img alt=&#34;half moon, dobbs ferry&#34; src=&#34;/static/images/posts/2021/01/10/f110-000101790020.jpg&#34; /&gt;&lt;figcaption&gt;half moon, dobbs ferry&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Satsop Nuclear Power Plant</title>
        <link>http://sandwichnews.org/posts/2018/08/21/satsop.html</link>
        <guid isPermaLink="false">posts/2018/08/21/satsop</guid>
        <pubDate>Tue, 21 Aug 2018 10:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-100.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/WNP-3_and_WNP-5&#34;&gt;Satsop Nuclear Power Plant&lt;/a&gt; was part of a larger effort to provide power to the Pacific Northwest.  Construction started in the late 1970s and was ultimately abandoned before completion.&lt;/p&gt;
&lt;p&gt;These days it&#39;s a &lt;a href=&#34;https://www.satsop.com/&#34;&gt;business park&lt;/a&gt;, with normal office space, big warehouses, as well as some interesting use of the tunnels and buildings for fire/military training, movies, etc.&lt;/p&gt;
&lt;p&gt;I went as part of a photo outing with &lt;a href=&#34;http://pcnw.org&#34;&gt;pcnw&lt;/a&gt; a few months ago.  It sounds like it&#39;s pretty easy to schedule a group tour of the buildings (with some cost involved) if you are in the area and want to check it out (it&#39;s a few hours south of Seattle).&lt;/p&gt;
&lt;p&gt;Since we were moving to New York, I thought this would be my last big photo trip in Seattle, so I brought way too many cameras, including my huge 4x5, which I regret lugging around (although I still haven&#39;t developed the film, so who knows!).&lt;/p&gt;
&lt;p&gt;I was pretty happy with how my instant photos came out!  I still have a ton of fun with the instax, and it&#39;s so nice to have the prints right away to share.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-101.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-102.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-103.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-104.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-105.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-106.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;satsop nuclear plant, 2018&#34; src=&#34;/static/images/posts/2018/08/21/satsop-107.jpg&#34; /&gt;&lt;figcaption&gt;satsop nuclear plant, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Instant Photography</title>
        <link>http://sandwichnews.org/posts/2018/07/10/instant-photography.html</link>
        <guid isPermaLink="false">posts/2018/07/10/instant-photography</guid>
        <pubDate>Tue, 10 Jul 2018 13:45:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I recently bought a &lt;a href=&#34;https://amzn.to/2znoG0p&#34;&gt;cheap Fuji instax camera&lt;/a&gt; for an upcoming road trip.  I had been wanting to try out the instax film and I thought my 6 year old daughter would have fun documenting the trip with me.&lt;/p&gt;
&lt;p&gt;The ergonomics of this specific camera are terrible, but having the prints instantly make up for it.&lt;/p&gt;
&lt;p&gt;Most of the fuji instant cameras are pretty basic with not a lot of control and cheap lenses, but it&#39;s exciting to start to see some 3rd party cameras coming out, like the &lt;a href=&#34;https://mint-camera.com/about-instantkon-rf70/8/6751/7ba062720037b5113a1ffbc61e11fc79&#34;&gt;Mint InstantKon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall, it&#39;s a lot of fun to use and cheap enough to just go for it.&lt;/p&gt;
&lt;p&gt;My daughter shot most of the color film right away, but wanted nothing to do with the black and white.&lt;/p&gt;
&lt;p&gt;I took the camera out on a photowalk with a friend to &lt;a href=&#34;https://www.portseattle.org/places/centennial-park&#34;&gt;Centennial Park&lt;/a&gt; here in Seattle and I was pretty happy with the results.  The black and white is a little high contrast, but it has a good look.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-100.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-101.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-102.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-103.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-104.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-105.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-106.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-107.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-108.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-109.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;near centennial park, seattle, 2018&#34; src=&#34;/static/images/posts/2018/07/10/instax-110.jpg&#34; /&gt;&lt;figcaption&gt;near centennial park, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Toning Cyanotypes</title>
        <link>http://sandwichnews.org/posts/2018/06/12/toning-cyanotypes.html</link>
        <guid isPermaLink="false">posts/2018/06/12/toning-cyanotypes</guid>
        <pubDate>Tue, 12 Jun 2018 20:45:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;cyanotype and tea, golden gardens, seattle, 2018&#34; src=&#34;/static/images/posts/2018/06/12/toning-cyanotypes/cy-trees-tea-sm.jpg&#34; /&gt;&lt;figcaption&gt;cyanotype and tea, golden gardens, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;For PCNW&#39;s &lt;a href=&#34;http://pcnw.org/support/longshot/&#34;&gt;Longshot&lt;/a&gt; this year, I worked on a series of cyanotype variations.&lt;/p&gt;
&lt;p&gt;I really love cyanotype printing.  It&#39;s one of the &lt;a href=&#34;http://www.analoguelab.com.au/cyanotype-safety/&#34;&gt;safer&lt;/a&gt; photographic processes, you can coat the paper in light, you expose in the sun, and otherwise you just need water to rinse.&lt;/p&gt;
&lt;p&gt;Sometimes, though, you get tired of blue!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mpaulphotography.wordpress.com/2011/04/01/cyanotype-toning-the-basics/&#34;&gt;MP Photography&lt;/a&gt; has a great overview and examples of toning cyanotypes.  It&#39;s pretty easy (if time consuming).&lt;/p&gt;
&lt;p&gt;The weather was a little weird when I made these: switching between overcast, rainy, sunny, cloudy, so I had a difficult time with exposure.  Luckily, toning also seems to be a good way to rescue prints with exposure issues.&lt;/p&gt;
&lt;p&gt;As part of the process, you bleach the print, so, it&#39;s ok if the print is overexposed a bit.  There&#39;s also typically some staining, so it can help a bit with midtones and highlights if underexposed.&lt;/p&gt;
&lt;p&gt;The above tea print is my favorite of the bunch.  It was a bit underexposed, so I didn&#39;t bleach it, but just soaked it in tea for 3 hours.  I think the tea tone works well for the photo, and I like the blue border that remains.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;cyanotype and coffee, golden gardens, seattle, 2018&#34; src=&#34;/static/images/posts/2018/06/12/toning-cyanotypes/cy-trees-coffee-sm.jpg&#34; /&gt;&lt;figcaption&gt;cyanotype and coffee, golden gardens, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I do really like the cooler, closer to black look you get from coffee toning.  This was a bit overexposed. I bleached for a bit, then 3 hours in coffee.  I&#39;m tempted to try for longer next time.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;cyanotype, golden gardens, seattle, 2018&#34; src=&#34;/static/images/posts/2018/06/12/toning-cyanotypes/cy-trees-plain-sm.jpg&#34; /&gt;&lt;figcaption&gt;cyanotype, golden gardens, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;For comparison, above is a normal cyanotype print with no toning.&lt;/p&gt;
&lt;p&gt;Part of the fun of these analog processes is the one of a kind results and ocassional surprises.  It&#39;s also been a fun reminder to not worry as much about mistakes or imperfections and just embrace them.&lt;/p&gt;
&lt;p&gt;The original image I used to make these prints was shot on color film with an old folding camera that had light leaks (see below)!&lt;/p&gt;
&lt;p&gt;I can see the artifacts of the leaks in the final prints, but it&#39;s a lot less noticable and doesn&#39;t bother me at all.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;golden gardens, seattle, 2018&#34; src=&#34;/static/images/posts/2018/06/12/toning-cyanotypes/cy-trees-orig-101-sm.jpg&#34; /&gt;&lt;figcaption&gt;golden gardens, seattle, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Large Format Junkyard</title>
        <link>http://sandwichnews.org/posts/2018/05/31/large-format-junkyard.html</link>
        <guid isPermaLink="false">posts/2018/05/31/large-format-junkyard</guid>
        <pubDate>Thu, 31 May 2018 16:50:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;paper and acrylic detail, junkyard, 2018&#34; src=&#34;/static/images/posts/2018/05/25/large-format-junkyard/junkyard-104.jpg&#34; /&gt;&lt;figcaption&gt;paper and acrylic detail, junkyard, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I had become interested in large format photography after a workshop with &lt;a href=&#34;http://www.daniel-carrillo.com/&#34;&gt;Daniel Carrillo&lt;/a&gt; on Wet Plate.&lt;/p&gt;
&lt;p&gt;My friend, &lt;a href=&#34;https://www.espressobuzz.net/&#34;&gt;Hank&lt;/a&gt;, had given me a large format monorail camera, and I had taken it out a few times.  It was exciting and fun, but also frustrating and my results had been mixed.&lt;/p&gt;
&lt;p&gt;When I saw &lt;a href=&#34;https://www.danieljgregory.com/&#34;&gt;Daniel Gregory&lt;/a&gt; was teaching a Large Format Film and Lighting class at &lt;a href=&#34;http://pcnw.org&#34;&gt;PCNW&lt;/a&gt; last winter, I was on board.&lt;/p&gt;
&lt;p&gt;Here are some 11x14 darkroom prints from a recent junkyard trip (a mix of Ilford Matte and Ilford Warmtone fiber papers).&lt;/p&gt;
&lt;p&gt;I&#39;ve really been enjoying the process.  While there are still frustrations, after repeated practice things are a lot smoother.  I really love the simplicity and thoughtful intention that seems to come with shooting large format.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;stack of bumpers, junkyard, 2018&#34; src=&#34;/static/images/posts/2018/05/25/large-format-junkyard/junkyard-102.jpg&#34; /&gt;&lt;figcaption&gt;stack of bumpers, junkyard, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;dashboard, junkyard, 2018&#34; src=&#34;/static/images/posts/2018/05/25/large-format-junkyard/junkyard-103.jpg&#34; /&gt;&lt;figcaption&gt;dashboard, junkyard, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;portrait of a door, junkyard, 2018&#34; src=&#34;/static/images/posts/2018/05/25/large-format-junkyard/junkyard-106.jpg&#34; /&gt;&lt;figcaption&gt;portrait of a door, junkyard, 2018&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Raspberry Anthotypes</title>
        <link>http://sandwichnews.org/posts/2017/07/07/raspberry-anthotypes.html</link>
        <guid isPermaLink="false">posts/2017/07/07/raspberry-anthotypes</guid>
        <pubDate>Fri, 07 Jul 2017 11:20:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Raspberry anthotype print, 3 days exposure&#34; src=&#34;/static/images/posts/2017/07/raspberry-anthotypes/35789893805_c1b0bc5ae7.jpg&#34; /&gt;&lt;figcaption&gt;Raspberry anthotype print, 3 days exposure&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve been paging through the excellent
&lt;a href=&#34;https://www.amazon.com/Book-Alternative-Photographic-Processes/dp/1285089316/?tag=engcoffee-20&#34;&gt;Book of Alternative Photographic Processes&lt;/a&gt;
by &lt;a href=&#34;http://www.christopherjames-studio.com/&#34;&gt;Christopher James&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anthotypes caught my eye as something fun and easy to try.
It&#39;s an early process that uses flower or plant material
(the name is from the greek &lt;em&gt;anthos&lt;/em&gt; meaning flower).&lt;/p&gt;
&lt;p&gt;If you&#39;ve ever noticed paint or fabric washed out from spending a long time in the sun,
that&#39;s basically the process!&lt;/p&gt;
&lt;p&gt;There&#39;s a good step-by-step set of directions with photos on
the &lt;a href=&#34;http://www.alternativephotography.com/anthotypes-making-print-using-plants/&#34;&gt;Alternative Photography website&lt;/a&gt;,
but basically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mash up some flowers, plants, or fruits to produce a liquid.&lt;ul&gt;
&lt;li&gt;optionally add alcohol to help with extraction, or vinegar (supposedly darkens?).&lt;/li&gt;
&lt;li&gt;optionally strain out seeds, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;coat some watercolor paper with the liquid and let it dry&lt;/li&gt;
&lt;li&gt;place something on the paper to block the sun where you want the image to appear&lt;ul&gt;
&lt;li&gt;the color of the paper will be the darkest area of the print&lt;/li&gt;
&lt;li&gt;anything uncovered will be lightened by the sun&lt;ul&gt;
&lt;li&gt;unlike a &#39;typical&#39; process, you want a &lt;em&gt;positive&lt;/em&gt; image, not a &lt;em&gt;negative&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;you can use cutouts, plants, etc. or print a black and white image on a transparency&lt;/li&gt;
&lt;li&gt;a clip photo frame will help keep everything in place&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;put it in the sun, and wait!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Raspberry anthotype prints, in progress&#34; src=&#34;/static/images/posts/2017/07/raspberry-anthotypes/34981034903_b0a4b3ca3e.jpg&#34; /&gt;&lt;figcaption&gt;Raspberry anthotype prints, in progress&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Exposure times seem to vary greatly depending on the plant material used.&lt;/p&gt;
&lt;p&gt;For my prints, I used raspberry with some alcohol and put them out in the sun for 3 full days.
They probably could have used another day or two, but I got impatient.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Raspberry anthotype print&#34; src=&#34;/static/images/posts/2017/07/raspberry-anthotypes/35658008121_5742e14377.jpg&#34; /&gt;&lt;figcaption&gt;Raspberry anthotype print&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As far as I know, there&#39;s no known way to fix the images (make them permanent).
Over time and with more UV exposure the images will eventually fade.&lt;/p&gt;
&lt;p&gt;Anthotypes are a very old process (1842), but they never became that popular because of
the long exposure times and image impermanence - there&#39;s still a lot to explore!&lt;/p&gt;
&lt;p&gt;It&#39;s a really fun, easy, safe and environmentally friendly photographic process.
I&#39;d definitely recommend giving it a try!&lt;/p&gt;
&lt;p&gt;I&#39;m looking forward to trying it more with other plants.
Blackberries and spinach look like they produce good results with reasonable exposure times.
&lt;a href=&#34;https://books.google.com/books?id=mn5ZCQAAQBAJ&amp;amp;pg=PT86&amp;amp;lpg=PT86&amp;amp;dq=onion+skin+anthotype+recipe&amp;amp;source=bl&amp;amp;ots=b441YOVO5y&amp;amp;sig=SPnWSOMwBTZ4soTCOOD_X-YMGNw&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ved=0ahUKEwjc4ICukfnUAhXL7IMKHaIpBHAQ6AEIMzAC#v=onepage&amp;amp;q=onion%20skin%20anthotype%20recipe&amp;amp;f=false&#34;&gt;Onion skin&lt;/a&gt;
looks really fantastic, but seems to take a month or more (I&#39;m not sure I have the patience required).&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Lumen prints</title>
        <link>http://sandwichnews.org/posts/2017/06/13/lumen-prints.html</link>
        <guid isPermaLink="false">posts/2017/06/13/lumen-prints</guid>
        <pubDate>Tue, 13 Jun 2017 11:38:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Lumen print, fennel&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/35147116921_1a7dcbffd7.jpg&#34; /&gt;&lt;figcaption&gt;Lumen print, fennel&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As part of this year&#39;s PCNW &lt;a href=&#34;http://pcnw.org/support/longshot/&#34;&gt;Longshot&lt;/a&gt; event this past weekend,
&lt;a href=&#34;http://ginawhitephoto.com/home.html&#34;&gt;Gina White&lt;/a&gt; and others were leading analog printing activities with Cyanotypes and Lumen prints.&lt;/p&gt;
&lt;p&gt;Jill Enfield has a &lt;a href=&#34;http://masteringphoto.com/photographic-alternative-processes-lumen-prints/&#34;&gt;good overview of the process&lt;/a&gt;, including some really interesting examples.&lt;/p&gt;
&lt;p&gt;Basically, it&#39;s just putting photo printing paper out in the sun.  These prints should &lt;strong&gt;not&lt;/strong&gt; be developed (they will just turn black), but can be fixed.  The fixing will wash out a lot of the color, but make the print stable.  Gold toning seems to work well.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Lumen print, garden flower&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/35110619222_2c0c5b8ebe.jpg&#34; /&gt;&lt;figcaption&gt;Lumen print, garden flower&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Different paper will produce different results, and you can use old/expired or even fogged paper or film.&lt;/p&gt;
&lt;p&gt;The prints here I made were all done on Ilford Warmtone paper.  Note that it&#39;s just ordinary black and white photo paper, but it gets really vibrant colors when left in the sun.  These prints were gold toned, and no fixer
was used.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Lumen prints in progress&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/35288585225_c4391a03ea.jpg&#34; /&gt;&lt;figcaption&gt;Lumen prints in progress&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Online I&#39;ve found people recommend 20-60 minutes for fiber paper.  Gina recommended much longer times, 5-6 hours.  The color did seem to become more vibrant as time went on.&lt;/p&gt;
&lt;p&gt;I did get impatient and my prints were only exposed for 3 hours. I&#39;d like to experiment more on time.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Lumen print in progress&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/35248686576_ea5f08c674.jpg&#34; /&gt;&lt;figcaption&gt;Lumen print in progress&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Moisture (from the plant) seems to play a big part in the color shifts.&lt;/p&gt;
&lt;p&gt;Some of the detail from these I find pretty interesting, there&#39;s almost a 3D feeling.  I&#39;m not sure how much is a result of the toning vs. the print.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;flower detail&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/34445202104_d6dc4027f3.jpg&#34; /&gt;&lt;figcaption&gt;flower detail&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;fennel detail&#34; src=&#34;/static/images/posts/2017/06/13/lumen-prints/35122872392_3bf460b196.jpg&#34; /&gt;&lt;figcaption&gt;fennel detail&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m not that crazy about the prints I made, but it was fun and easy.  I&#39;d definitely like to try them again and see if I can get better results.&lt;/p&gt;
&lt;p&gt;Give it a shot if you haven&#39;t already!  All you need is some old photo paper!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Hand Coated Photography</title>
        <link>http://sandwichnews.org/posts/2016/08/09/hand-coated-photography.html</link>
        <guid isPermaLink="false">posts/2016/08/09/hand-coated-photography</guid>
        <pubDate>Tue, 09 Aug 2016 21:09:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Sedro Wolley Barn, Van Dyke Print&#34; src=&#34;/static/images/posts/2016/08/09/hand-coated-photography/28779416942_0871210132.jpg&#34; /&gt;&lt;figcaption&gt;Sedro Wolley Barn, Van Dyke Print&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This past weekend I was fortunate enough to take a workshop on some historical photo
processes at &lt;a href=&#34;http://pcnw.org&#34;&gt;pcnw&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can check out a &lt;a href=&#34;https://www.flickr.com/photos/logrodnek/albums/72157672241163415&#34;&gt;few of my scans on flickr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We covered both &lt;a href=&#34;https://en.wikipedia.org/wiki/Cyanotype&#34;&gt;Cyanotypes&lt;/a&gt;
 and &lt;a href=&#34;http://sandykingphotography.com/resources/technical-writing/vandyke&#34;&gt;Van Dyke&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For both of these processes you apply the chemicals necessary for photosensitivity by hand
on paper.&lt;/p&gt;
&lt;p&gt;I already like making photo prints by hand, and I think this lends even more to that process.
As a &#39;modern&#39; photographer, I hate to admit that I like even the visible brush marks, but I
really do!&lt;/p&gt;
&lt;h3&gt;Cyanotypes&lt;/h3&gt;
&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Sedro Wolley Barn, Cyanotype Print&#34; src=&#34;/static/images/posts/2016/08/09/hand-coated-photography/28266906494_a204e42d95.jpg&#34; /&gt;&lt;figcaption&gt;Sedro Wolley Barn, Cyanotype Print&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The cyanotype process is especially interesting to me.  This was originally used
for reproducing drawings, and is how &lt;a href=&#34;https://en.wikipedia.org/wiki/Blueprint&#34;&gt;blueprints&lt;/a&gt;
got their names (they were cyanotypes).&lt;/p&gt;
&lt;p&gt;There are also some &lt;a href=&#34;https://digitalcollections.nypl.org/collections/photographs-of-british-algae-cyanotype-impressions#/&#34;&gt;incredible early images by Anna Atkins&lt;/a&gt;
published in 1843 using cyanotypes for images of seaweed and algae.&lt;/p&gt;
&lt;p&gt;Yes, the chemicals are toxic, but seemingly less-so than almost any other photo process?&lt;/p&gt;
&lt;p&gt;The &#39;developer&#39; is just plain water...&lt;/p&gt;
&lt;p&gt;You don&#39;t even really need a darkroom for this process, just no UV light.  And to develop,
you can use the sun (though it may be unpredictable).&lt;/p&gt;
&lt;p&gt;Exposures take a long time (20 minutes), but, that&#39;s par for the course here.&lt;/p&gt;
&lt;p&gt;Once you coat the images, it&#39;s pretty smooth sailing.&lt;/p&gt;
&lt;h3&gt;Van Dyke&lt;/h3&gt;
&lt;p&gt;I honestly like the look of this process more than cyanotypes... But, it feels
a little heavier.  It requires a real fix, and thus an archival wash... It&#39;s more
like making a silver print.&lt;/p&gt;
&lt;h3&gt;Future work&lt;/h3&gt;
&lt;p&gt;Even though I think my cyanotypes weren&#39;t especially successful, I feel like
it is a process I really enjoyed and would like to explore more.  The strong
blues don&#39;t work everywhere (although you can modify the tone a bit with other
bleaching/toning processes.)&lt;/p&gt;
&lt;p&gt;Look for more here or on &lt;a href=&#34;http://photos.ogrodnek.com/&#34;&gt;my photo site&lt;/a&gt; on that subject :).&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Pushing bytes is expensive</title>
        <link>http://sandwichnews.org/posts/2016/03/16/pushing-bytes-is-expensive.html</link>
        <guid isPermaLink="false">posts/2016/03/16/pushing-bytes-is-expensive</guid>
        <pubDate>Wed, 16 Mar 2016 16:05:00 -0700</pubDate>
        <description>&lt;p&gt;In this post I&#39;ll be comparing cloud hosting costs, which I&#39;m sure will be hopelessly out of date in just a few months.&lt;/p&gt;
&lt;p&gt;I&#39;m writing this post to try to solicit feedback on cheaper file transfer options.  If you have any advice or feedback, I&#39;d love to hear about it!&lt;/p&gt;
&lt;p&gt;Maybe it should have been obvious, but I&#39;ve been somewhat surprised at the high cost of transfer vs. storage when you start talking 10s of terabytes.&lt;/p&gt;
&lt;p&gt;For example, storing 10TB of data in S3: $302.60, transferring 10TB of data out of S3: $921.51.&lt;/p&gt;
&lt;p&gt;I&#39;ve also been (pleasantly) surprised at how aggressive the AWS/CloudFront (CDN) pricing is -- at $0.085/GB (US only), it appears to be the cheapest way to get data out of AWS.  It&#39;s cheaper than both S3 directly ($0.09) and even cheaper than serving directly from an EC2 instance (also $0.09).  This is kind of amazing considering all the benefits of the CF service vs. doing it yourself, or even S3.&lt;/p&gt;
&lt;p&gt;I&#39;ve been working out the details for a SaaS app that doesn&#39;t use a lot of storage, but has the potential to have a lot of subscribers.  So, it will use say 200MB of storage, but need to serve that data potentially 50,000 times each month.  The S3 costs are neglible, a few cents, but even the cheapeast CF tier (US only), we are talking $870.40/month.&lt;/p&gt;
&lt;p&gt;I love the CloudFront feature set and service and will continue to use it where it makes sense.&lt;/p&gt;
&lt;p&gt;For this app, I will have a hard time being competitive with other apps in this space with those costs, so I&#39;ve been looking for cheaper solutions.  Below is a list of what I&#39;ve compiled.  I&#39;m not considering any &#34;free tiers&#34; for the comparison.  These are great for development/etc., but I think not relevant in an ongoing cost comparison.&lt;/p&gt;
&lt;table class=&#34;table&#34;&gt;
  &lt;tr&gt;&lt;th&gt;Provider&lt;/th&gt;&lt;th&gt;Transfer Cost/GB&lt;/th&gt;&lt;/tr&gt;

  &lt;tr&gt;&lt;td&gt;AWS/CloudFront (US)&lt;/td&gt;&lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/cloudfront/pricing/&#34;&gt;$0.085&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;AWS/S3 (us-east)&lt;/td&gt;&lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/s3/pricing/&#34;&gt;$0.09&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;AWS/EC2&lt;/td&gt;&lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/ec2/pricing/&#34;&gt;$0.09&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;

  &lt;tr&gt;&lt;td&gt;Google Cloud Storage&lt;/td&gt;&lt;td&gt;&lt;a href=&#34;https://cloud.google.com/storage/pricing&#34;&gt;$0.12&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;BackBlaze/B2&lt;/td&gt;&lt;td&gt;&lt;a href=&#34;https://www.backblaze.com/b2/cloud-storage-pricing.html&#34;&gt;$0.05&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;Other Options&lt;/h3&gt;
&lt;h4&gt;CloudFlare&lt;/h4&gt;
&lt;p&gt;CloudFlare is a pretty full featured CDN that actually even offers a &#34;free&#34; tier.&lt;/p&gt;
&lt;p&gt;I signed up for a &#34;pro&#34; account to test it out.  The problem is that even for the pro and business levels, there&#39;s absolutely no record provided of file access.  That requires an Enterprise/Custom plan, where the pricing is determined by the sales team.  I haven&#39;t yet made a call to a sales rep to determine what final pricing would be for my use case.&lt;/p&gt;
&lt;p&gt;The other tricky thing here is that I still need to separately maintain and pay for an origin, the costs of which are entirely determined by how effectively CloudFlare can cache my content.  What I mean is, if I put CloudFlare in front of CloudFront, and I&#39;m only getting 50% hit rate from CloudFlare, I&#39;m still paying for $435/month from CloudFront on top of what I&#39;m paying from CloudFlare (that&#39;s a lot of CFs).&lt;/p&gt;
&lt;h4&gt;Digital Ocean&lt;/h4&gt;
&lt;p&gt;From what I can tell, they don&#39;t offer a straight cloud storage solution, but their &#34;Most Popular&#34; plan features 3TB of data transfer included for $20/month.&lt;/p&gt;
&lt;p&gt;This works out to $0.00666/GB.  Of course, I would like some basic redudency, so, say two machines and a load balancer, works out to about $0.01/GB/month? (($20*3)/6000), which is by far the cheapest I&#39;ve seen.&lt;/p&gt;
&lt;p&gt;Of course, there&#39;s quite a bit more there to build and manage.&lt;/p&gt;
&lt;h4&gt;Reserved/Custom CloudFront pricing&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&#34;https://aws.amazon.com/cloudfront/pricing/&#34;&gt;CloudFront pricing page&lt;/a&gt; does mention that you can reach out for reserved pricing if you commit to 10TB/month for a year.&lt;/p&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Must be within the provider&#39;s ToS to support file distribution&lt;/li&gt;
&lt;li&gt;In searching for options, I&#39;ve seen a few &#34;Unlimited&#34; or &#34;Unmetered&#34; options, but if you look at the fine print, they&#39;re not meant for file storage/distribution, and that&#39;s not allowed.&lt;/li&gt;
&lt;li&gt;Reasonable file serving redundancy&lt;/li&gt;
&lt;li&gt;I&#39;d like to avoid a single machine for file serving.  I&#39;ll probably use S3 as the &#34;source of truth&#34;, but I want to avoid downtime in file serving.&lt;/li&gt;
&lt;li&gt;Access logs available&lt;/li&gt;
&lt;li&gt;I need to be able to compile basic download stats on files served (apache style logs or similar).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Please Send Feedback/Suggestions!&lt;/h2&gt;
&lt;p&gt;Again, I&#39;m looking for feedback and suggestions for a cheap, reliable file hosting provider.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Pike Place Market</title>
        <link>http://sandwichnews.org/posts/2016/03/15/pike-place-market.html</link>
        <guid isPermaLink="false">posts/2016/03/15/pike-place-market</guid>
        <pubDate>Tue, 15 Mar 2016 16:47:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;a href=&#34;https://photos.ogrodnek.com/p/pike-place/&#34;&gt;
  &lt;img class=&#34;img-responsive&#34; src=&#34;https://photos.ogrodnek.com/static/photos/pike-place/umbrella-thumb-375x375.jpg&#34; /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just finished my final project for Black and White Photo II at &lt;a href=&#34;http://pcnw.org&#34;&gt;PCNW&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I chose to focus on Pike Place Market here in Seattle.&lt;/p&gt;
&lt;p&gt;I spent quite a bit of time there!  It was really great to get to know the space, people, and community so well.&lt;/p&gt;
&lt;p&gt;The project was a ton of work, and I still feel like I could have used another month printing and editing.  While I feel like I will continue to work on and develop this project, I&#39;m really happy at where it ended up and was proud to present these images to the rest of my class.&lt;/p&gt;
&lt;p&gt;These were all shot on an older &lt;a href=&#34;https://en.wikipedia.org/wiki/Rolleicord&#34;&gt;Rolleicord&lt;/a&gt;, Kodak TMax 400 film, and printed on Ilford Warmtone Glossy paper.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://photos.ogrodnek.com/p/pike-place/&#34;&gt;Pike Place Market&lt;/a&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>AWS Podcast</title>
        <link>http://sandwichnews.org/posts/2016/03/15/aws-podcast.html</link>
        <guid isPermaLink="false">posts/2016/03/15/aws-podcast</guid>
        <pubDate>Tue, 15 Mar 2016 16:16:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;a href=&#34;https://engineers.coffee&#34;&gt;&lt;img src=&#34;https://engineers.coffee/static/images/episode-cover.png&#34; width=256 /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I recently started a new weekly aws/cloud/tech podcast with &lt;a href=&#34;https://twitter.com/floodfx&#34;&gt;Donnie Flood&lt;/a&gt; called &lt;a href=&#34;http://engineers.coffee/&#34;&gt;Engineers &amp;amp; Coffee&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&#39;s been a lot of fun doing it and I&#39;m really proud of what we&#39;ve put out there.  I can&#39;t wait to see how it goes from here.&lt;/p&gt;
&lt;p&gt;If you haven&#39;t yet, please &lt;a href=&#34;http://engineers.coffee/&#34;&gt;give it a listen&lt;/a&gt;, and please send us some feedback!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Holga 120 Wide Pinhole Camera Review</title>
        <link>http://sandwichnews.org/posts/2016/01/28/holga-120wpc-review.html</link>
        <guid isPermaLink="false">posts/2016/01/28/holga-120wpc-review</guid>
        <pubDate>Thu, 28 Jan 2016 22:21:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;img class=&#34;img-responsive&#34; src=&#34;/static/images/posts/2016/01/28/holga-120wpc-review/holgawpc.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to some really amazing Seattle photographers, I&#39;ve recently started shooting pinhole (photography without a lens!)&lt;/p&gt;
&lt;p&gt;While you don&#39;t need to buy a camera to shoot pinhole, I think the &lt;a href=&#34;http://shop.lomography.com/en/holga-120-wide-pinhole-camera&#34;&gt;Holga 120 Wide Pinhole Camera&lt;/a&gt; has some nice features and is worth checking out.&lt;/p&gt;
&lt;p&gt;I put together my first YouTube photography video with a quick review and intro for the camera.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/FvOAl1xJYm8&#34; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Please let me know what you think, and subscribe to my channel if you&#39;d like to see more.&lt;/p&gt;
&lt;p&gt;You can see some of my &lt;a href=&#34;http://photos.ogrodnek.com/p/pinhole/&#34;&gt;pinhole photography on my portfolio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>New Photo Portfolio Site</title>
        <link>http://sandwichnews.org/posts/2016/01/09/new-photo-portfolio-site.html</link>
        <guid isPermaLink="false">posts/2016/01/09/new-photo-portfolio-site</guid>
        <pubDate>Sat, 09 Jan 2016 16:37:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;&#34; src=&#34;https://photos.ogrodnek.com/static/photos/postcards-seattle/women-pier-thumb-375x375.jpg&#34; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I still post new photos to &lt;a href=&#34;https://www.flickr.com/photos/logrodnek/&#34;&gt;my account on Flickr&lt;/a&gt;, but I&#39;ve been wanting
to put together a site with an organized, curated set of my favorite photos.&lt;/p&gt;
&lt;p&gt;I finally got around to it: &lt;a href=&#34;https://photos.ogrodnek.com&#34;&gt;photos.ogrodnek.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wanted it to be clean, simple, look good on mobile, and FAST, and I think I&#39;m off to a pretty good start.&lt;/p&gt;
&lt;h2&gt;tech&lt;/h2&gt;
&lt;p&gt;I went back and forth between building my own thing and using a portfolio site, and of course I ended up building my own thing.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&#34;http://cactusformac.com/&#34;&gt;Cactus&lt;/a&gt; to do the templating and generate the static site content, which is deployed to S3 and uses CloudFront as the CDN.&lt;/p&gt;
&lt;p&gt;You can see the source and scripts that ends up generating the site here: &lt;a href=&#34;https://github.com/ogrodnek/photos.ogrodnek.com&#34;&gt;https://github.com/ogrodnek/photos.ogrodnek.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Cactus&lt;/h3&gt;
&lt;p&gt;So far I like it... I&#39;ve tried a bunch of other static site generators and I think Cactus fits with me the best so far.  Unfortunately, it&#39;s not that well documented.&lt;/p&gt;
&lt;h3&gt;CloudFront&lt;/h3&gt;
&lt;p&gt;I love CloudFront!  It really makes serving content like this so much faster.  The new support for gzip compression is a huge help.  For personal sites like this, it&#39;s also pretty easy to fit comfortably within the free usage tier.&lt;/p&gt;
&lt;p&gt;I don&#39;t yet have a good/automated setup for doing cache invalidaton yet, or for setting cache expiration headers.  I think the newer version of cactus does have a plugin for doing asset fingerprinting to generate unique infinitely cachable names, which would definitely help.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>args4j-helpers</title>
        <link>http://sandwichnews.org/posts/2014/02/26/args4j-helpers.html</link>
        <guid isPermaLink="false">posts/2014/02/26/args4j-helpers</guid>
        <pubDate>Wed, 26 Feb 2014 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;I really like using &lt;a href=&#34;http://args4j.kohsuke.org/&#34;&gt;args4j&lt;/a&gt; for command-line parsing in both java, and scala, but I found myself writing the same boilerplately code to parse options, deal with help, deal with parsing issues, etc.  &lt;a href=&#34;https://github.com/ogrodnek/args4j-helpers&#34;&gt;args4j-helpers&lt;/a&gt; is a project that simplifies parsing with args4j.&lt;/p&gt;
&lt;p&gt;It provides typical option parsing error handling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If help (provided via &lt;code&gt;OptionWithHelp&lt;/code&gt; base trait bound to &lt;code&gt;--help&lt;/code&gt; and &lt;code&gt;-h&lt;/code&gt;) is requested, print usage information to stderr, exit with code &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If a required option is missing (&lt;code&gt;required=true&lt;/code&gt;), print usage information to stderr, exit with code &lt;code&gt;1&lt;/code&gt; (unless help was requested).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This typical parsing code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Options {
  import org.kohsuke.args4j.Option

  @Option(name=&#34;--help&#34;, aliases=Array(&#34;-h&#34;), usage=&#34;show this message&#34;)
  var help = false

  @Option(name=&#34;--blah&#34;, aliases=Array(&#34;-b&#34;), usage=&#34;some val&#34;, metaVar=&#34;BLAH&#34;)
  var blah: Int = 0
}

def main(args: Array[String]) {
  val options = new Options
  val parser = new CmdLineParser(options)

  try {
    parser.parseArgument(args : _*)

    if (options.help) {
      parser.printUsage(System.err)
      sys.exit(0)
    }
  } catch {
    case e: CmdLineException =&amp;gt; {
      System.err.println(e.getMessage)
      parser.printUsage(System.err)
      sys.exit(1)
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;can be simplified as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Options extends OptionsWithHelp {
  import org.kohsuke.args4j.Option

  @Option(name=&#34;--blah&#34;, aliases=Array(&#34;-b&#34;), usage=&#34;some val&#34;, metaVar=&#34;BLAH&#34;)
  var blah: Int = 0
}

def main(args: Array[String]) {
  val options = optionsOrExit(args, new Options)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Additionally, the helper class handles the case where help is requested and required arguments are missing (which is missing from the simplified boilerplate code).&lt;/p&gt;
&lt;p&gt;The code is in scala, and &lt;a href=&#34;https://github.com/ogrodnek/args4j-helpers&#34;&gt;available on github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the future, I&#39;d like to extend it to add better support for more scala-ish types (&lt;code&gt;Option&lt;/code&gt;, &lt;code&gt;Seq&lt;/code&gt;, etc., which should be mostly possible by implementing additional args4j OptionHandlers).&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Crucible Survivor - a code review dashboard</title>
        <link>http://sandwichnews.org/posts/2014/02/14/crucible-survivor-code-review-dashboard.html</link>
        <guid isPermaLink="false">posts/2014/02/14/crucible-survivor-code-review-dashboard</guid>
        <pubDate>Fri, 14 Feb 2014 10:15:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;figure&gt;&lt;img alt=&#34;Crucible Survivor Dashboard&#34; src=&#34;https://raw.github.com/ogrodnek/crucible-survivor/master/docs/crucible-survivor-small.png&#34; /&gt;&lt;figcaption&gt;Crucible Survivor Dashboard&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve talked a lot about the importance of &lt;a href=&#34;&#34;&gt;code reviews and developer feedback&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ogrodnek/crucible-survivor&#34;&gt;Crucible Survivor&lt;/a&gt; is a Hall of Fame / Hall of Shame dashboard that helps to encourage completing your reviews.&lt;/p&gt;
&lt;p&gt;It integrates with with &lt;a href=&#34;https://www.atlassian.com/software/crucible/overview&#34;&gt;Crucible&lt;/a&gt; (obviously) for code review stats.&lt;/p&gt;
&lt;h2&gt;Scoring&lt;/h2&gt;
&lt;p&gt;The scoring is pretty simple right now.  Each reviewer gets a &lt;em&gt;Fame&lt;/em&gt; point for completing a review, and a &lt;em&gt;Shame&lt;/em&gt; point for each review they have not yet completed.&lt;/p&gt;
&lt;p&gt;We&#39;ve had this running for a few months now, and the general thinking is it would be better to have open reviews be more shameful the longer they have been kept open.  Maybe a future improvement.&lt;/p&gt;
&lt;h2&gt;Design / Credits&lt;/h2&gt;
&lt;p&gt;The design is taken from &lt;a href=&#34;http://blog.gengo.com/jira-survivor/&#34;&gt;Jira Survivor&lt;/a&gt;, which itself was forked from &lt;a href=&#34;http://99designs.com/tech-blog/blog/2013/01/05/github-survivor/&#34;&gt;Github Survivor&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Code and Application Architecture&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/ogrodnek/crucible-survivor&#34;&gt;code&lt;/a&gt; is a large departure from the original projects.  The original projects use MongoDB to store data scraped from the github/jira APIs, and a python web app to serve the site.&lt;/p&gt;
&lt;p&gt;Crucible Survivor is an angular app that is mostly static.  The review stats are included in the app as a JS include.  The app is hosted as a static website in S3, with the contents of the stats JS generated periodically by a jenkins server.&lt;/p&gt;
&lt;p&gt;This was a hack-day experiment in &#39;static&#39; dashboard apps, and I&#39;m really happy with how it came out.  I really like how gathering the content to display is decoupled from the display.  Serving the site requires no server infrastructure, and the update process can be very flexible.  Finally, it&#39;s incredible easy to test/run locally -- just generate a fake stats file and open the site.&lt;/p&gt;
&lt;h3&gt;Grab the code, get it running!&lt;/h3&gt;
&lt;p&gt;The code is &lt;a href=&#34;https://github.com/ogrodnek/crucible-survivor&#34;&gt;open sourced, and available on github&lt;/a&gt; along with instructions on configuring, running, developing.&lt;/p&gt;
&lt;p&gt;I&#39;d love to hear any feedback or comments.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Reader Driven Development</title>
        <link>http://sandwichnews.org/posts/2013/02/15/reader-driven-development.html</link>
        <guid isPermaLink="false">posts/2013/02/15/reader-driven-development</guid>
        <pubDate>Fri, 15 Feb 2013 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;In this talk on 
&lt;a href=&#34;http://vimeo.com/14313378&#34;&gt;Effective ML&lt;/a&gt;, 
&lt;a href=&#34;http://cufp.org/users/yminsky&#34;&gt;Yaron Minsky&lt;/a&gt; talks about Reader Driven Development.  That is, writing your code with the reader in mind.  Making decisions that will make the code more easily read and understood by other developers down the line.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The interest of the reader always pushes in the direction of clarity, simplicity, and the ability to change the code later. In most real projects, code is read and changed many more times than it is written. The readers interest are paramount in that regard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When writing code the interests of the reader and writer may be at odds, and when faced with a decision, always err in the direction of the reader.  The reader is always right.  Regardless of team size, it&#39;s helpful to program this way.  Even code you&#39;ve written yourself may not be as clear 6 months or a year later otherwise.  Great perspective, and I think it fits in nicely with previous posts here on 
&lt;a href=&#34;2012-06-13-the-golden-rule-of-programming-style&#34;&gt;programming style&lt;/a&gt; and 
&lt;a href=&#34;2012-03-13-on-code-reviews-and-developer-feedback&#34;&gt;code reviews&lt;/a&gt; (tend to agree with your reviewers, they are the audience!).&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Manly Burger @ Unami Burger</title>
        <link>http://sandwichnews.org/posts/2012/07/15/manly-burger-@-unami-burger.html</link>
        <guid isPermaLink="false">posts/2012/07/15/manly-burger-@-unami-burger</guid>
        <pubDate>Sun, 15 Jul 2012 12:42:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/logrodnek/7572332580/&#34; title=&#34;manly burger by logrodnek, on Flickr&#34;&gt;&lt;img alt=&#34;manly burger&#34; height=&#34;332&#34; src=&#34;https://farm8.staticflickr.com/7129/7572332580_63432d805b.jpg&#34; width=&#34;500&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The manly burger at &lt;a href=&#34;http://www.umami.com/umami-burger/&#34;&gt;unami burger&lt;/a&gt;: &#34;beer-cheddar cheese, smoke salt-onion strings, bacon lardons.&#34; What else do I have to say?&lt;/p&gt;

&lt;p&gt;This might be the best burger I have ever eaten. It&#39;s that good.&lt;/p&gt;
&lt;p&gt;We also got the beet salad (in the background), and some thin fries. The ketchup is made there and had an interesting flavor - very vinegary, maybe a little truffle oil?&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Roast Pork @ Tommy DiNic&#39;s</title>
        <link>http://sandwichnews.org/posts/2012/07/08/roast-pork-@-tommy-dinics.html</link>
        <guid isPermaLink="false">posts/2012/07/08/roast-pork-@-tommy-dinics</guid>
        <pubDate>Sun, 08 Jul 2012 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/logrodnek/7525019722/&#34; title=&#34;Tommy DiNic&#39;s&#34;&gt;&lt;img src=&#34;https://farm9.staticflickr.com/8148/7525019722_3e9a582652.jpg&#34; width=&#34;500&#34; height=&#34;332&#34; alt=&#34;DSC03547&#34;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We were just in Philadelphia, and stopped by the &lt;a href=&#34;http://www.readingterminalmarket.org/&#34;&gt;Reading Terminal Market&lt;/a&gt; in search of the roast pork sandwich at &lt;a href=&#34;http://tommydinics.com/&#34;&gt;Tommy DiNic&amp;#8217;s&lt;/a&gt;. You may have seen it featured on &lt;a href=&#34;http://www.youtube.com/watch?v=mLYiR-dSbOs&#34;&gt;Man Vs. Food&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/logrodnek/7525020962/&#34; title=&#34;Roast Pork at Tommy DiNic&#39;s by logrodnek, on Flickr&#34;&gt;&lt;img src=&#34;https://farm9.staticflickr.com/8424/7525020962_42f9b147e6.jpg&#34; width=&#34;500&#34; height=&#34;332&#34; alt=&#34;DSC03555&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What a sandwich! This is definitely one worth going out of your way for. The official way to get it is with sharp provolone and greens (broccoli rabe). They were out of the rabe, so we had to go with spinach, which is prepared the same way.&lt;/p&gt;
&lt;p&gt;The pork is incredibly juicy and delicious, then you have the nice bite of really good sharp provolone, and the garlicky bitterness of the greens. Delicious!&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>The golden rule of programming style</title>
        <link>http://sandwichnews.org/posts/2012/06/13/golden-rule-of-programming-style.html</link>
        <guid isPermaLink="false">posts/2012/06/13/golden-rule-of-programming-style</guid>
        <pubDate>Wed, 13 Jun 2012 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;There&#39;s an interesting page on the subject of &lt;a href=&#34;http://docs.scala-lang.org/style/files.html&#34;&gt;compilation units per file&lt;/a&gt; over at the 
&lt;a href=&#34;http://docs.scala-lang.org/style/overview.html&#34;&gt;scala style guide&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The guideline, is, delightfully vague, which I will paraphrase as: 
Mostly use single files, unless you can&#39;t, or unless it&#39;s better if you don&#39;t. &lt;/p&gt;
&lt;p&gt;The author(s) go on to expand on the reasoning behind breaking the guideline:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another case is when multiple classes logically form a single, cohesive group, sharing concepts to the point where maintenance is greatly served by containing them within a single file. These situations are harder to predict…  Generally speaking, if it is easier to perform long-term maintenance and development on several units in a single file rather than spread across multiple, then such an organizational strategy should be preferred for these classes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This touches on what I consider to be the golden rule of programming style: &lt;strong&gt;Make your intent clear and the code easy to read.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Software spends most of its life in maintenance, which is why we have style guides and coding standards.  It&#39;s valuable to have consistent looking code to promote a shared vocabulary, improve readability, and steer away from confusing or error-prone constructs. &lt;/p&gt;
&lt;p&gt;It is just as important to be able to understand, both as an author and as a reviewer, that in certain cases following the letter of the law goes against the main goal of improving readability and maintenance.  A one-size-fits-all rule does not always work, and as the authors of this particular guideline mention, &#34;these situations are harder to predict.&#34; &lt;/p&gt;
&lt;h3&gt;Make your intent clear and the code easy to read.&lt;/h3&gt;</description>
      </item>
    
      <item>
        <title>On Code Reviews and Developer Feedback</title>
        <link>http://sandwichnews.org/posts/2012/03/13/on-code-reviews-and-developer-feedback.html</link>
        <guid isPermaLink="false">posts/2012/03/13/on-code-reviews-and-developer-feedback</guid>
        <pubDate>Tue, 13 Mar 2012 12:00:00 -0700</pubDate>
        <description>&lt;blockquote&gt;
&lt;p&gt;While he was making his points on stage, I was taking an inventory of the things I didn’t agree with. 
And when presented with an opportunity to speak with him, I quickly pushed back at some of his ideas. I must have seemed like such an asshole. &lt;/p&gt;
&lt;p&gt;His response changed my life. It was a simple thing. He said “Man, give it five minutes.” I asked him what he meant by that? He said, it’s fine to disagree, 
it’s fine to push back, it’s great to have strong opinions and beliefs, but give my ideas some time to set in before you’re sure you want to argue against them. 
“Five minutes” represented “think”, not react. He was totally right. I came into the discussion looking to prove something, not learn something. &lt;/p&gt;
&lt;p&gt;There’s also a difference between asking questions and pushing back. Pushing back means you already think you know. Asking questions means you want to know. Ask more questions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is such a great outlook and a great way to approach the discussion of feedback for code reviews and design reviews. &lt;/p&gt;
&lt;p&gt;It&#39;s surprising how little time development teams devote to training, or even internal discussion on effective feedback.  As developers, we are constantly engaged in this kind of communication: white-boarding sessions, spec reviews, design reviews, code reviews.  We&#39;re expected to give and receive feedback on a daily basis, but few of us are properly prepared for it.  Not only do we lack the training, but we have many negative examples to draw from.  Who hasn&#39;t been a part of a design review where tempers flare?  Properly giving feedback is something that requires constant attention and practice.  Receiving feedback can be just as difficult. &lt;/p&gt;
&lt;h3&gt;Culture of Communication&lt;/h3&gt;
&lt;p&gt;One of the major pillars of our 
&lt;a href=&#34;&#34;&gt;engineering culture at bizo&lt;/a&gt; is &#34;the 3 Cs&#34;: Communication, Communication, Communication. &lt;/p&gt;
&lt;p&gt;We&#39;ve tried hard to build a team of engineers that are eager to receive feedback, humble about their abilities, objective and gracious with their feedback, and freely giving of their own knowledge and experience.  We see communication as a prerequisite for building a world-class team and developing high-quality code. You often hear the phrase &#34;
&lt;a href=&#34;http://bobsutton.typepad.com/my_weblog/2006/07/strong_opinions.html&#34;&gt;strong opinions, weakly held&lt;/a&gt;,&#34; and that is the kind of culture we have tried to build. &lt;/p&gt;
&lt;p&gt;Communication is hard.  It takes real team agreement and commitment to continued work to keep this culture alive and well. It&#39;s important the team views effective communication as important and that the culture supports it. &lt;/p&gt;
&lt;h3&gt;Code Reviews&lt;/h3&gt;
&lt;p&gt;Code reviews are something that can easily be approached from the wrong perspective, both as an author or reviewer. &lt;/p&gt;
&lt;p&gt;As a reviewer, it can be easy to jump in and argue, to try and push &#39;your&#39; solution (even though it may be equivalent), to push back instead of asking questions and trying to understand. &lt;/p&gt;
&lt;p&gt;As an author, it&#39;s far too easy to get attached to your code, to your specific solution/naming/etc.  It&#39;s also easy to feel like each comment is an attack on your ability, and that by accepting the feedback, this somehow means that you were wrong or did a bad job.  Of course, nothing could be further from the truth! &lt;/p&gt;
&lt;p&gt;At Bizo, we perform code reviews for every change.  They are a major part of our culture of communication.  In order to perform effective code reviews, it&#39;s important to have some shared guidelines that help support effective communication. &lt;/p&gt;
&lt;p&gt;Here are some guidelines we&#39;ve found to be helpful for performing code reviews: &lt;/p&gt;
&lt;h3&gt;What is a code review&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A careful line-by-line critique of code by peers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Happens in a non-threatening context&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Goal is cooperation and mutual learning, not fault finding&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Code reviews are a team exercise to improve understanding and make the code better! &lt;/p&gt;
&lt;p&gt;When people think of code reviews they usually think of catching bugs.  Code reviews do occasionally catch bugs or potential performance problems, but this is rare.&lt;/p&gt;
&lt;p&gt;Just as important is fostering a shared understanding of the code and exposure to new approaches, techniques, and patterns.  Seeing how your peers program is a great way to learn from them.&lt;/p&gt;
&lt;p&gt;Ensuring coding standards and style guides is another way code reviews help.  Working on a team it&#39;s important to keep readability and quality high using a shared vocabulary. &lt;/p&gt;
&lt;h4&gt;As an author&lt;/h4&gt;
&lt;p&gt;As an author, it&#39;s important to view each comment as a new opportunity to improve your code.  Instead of jumping into defense mode, take a step back and think.  Try to approach the code again for the first time with this new perspective.  Your team has a lot of experience and varied backgrounds -- draw from them!  They are there to help you.  Use the gift of their experience and knowledge to improve the code.&lt;/p&gt;
&lt;p&gt;Trust the team, and view all comments as action items.  Some changes can seem arbitrary, especially when it comes to naming and organization.  Unless there&#39;s a strong reason, tend to agree with your reviewers.  If a reviewer finds something confusing, it is confusing!  Code spends most of its life in maintenance and programming is a team sport.  Remember that they are your audience, and you want them to be able to understand your code at 4am after a system crash. &lt;/p&gt;
&lt;h4&gt;As a reviewer&lt;/h4&gt;
&lt;p&gt;As a reviewer, it&#39;s important to take the time to understand the code, think, and ask questions to understand the code before providing feedback.  The author probably spent a lot more time thinking about the problem and the approach over the course of the project.&lt;/p&gt;
&lt;p&gt;Be strict on coding standard and style guide violations.  The real cost of software is maintenance (
&lt;a href=&#34;http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-139411.html#16712&#34;&gt;80% according to Sun&lt;/a&gt;).  It&#39;s important the code is easily understood by the team.&lt;/p&gt;
&lt;p&gt;Be gentle on personal preferences.  If it&#39;s not a standard violation and just a matter of personal preference, defer to the author.  It&#39;s okay to present your perspective, but mention that it&#39;s just a preference and not meant to be taken as an action item.&lt;/p&gt;
&lt;p&gt;Trust the author.  It&#39;s often the case that there are many valid approaches to a problem.  It&#39;s great to present alternative approaches and discuss pros/cons of various approaches.  If you see alternative solutions, bring them up!  When discussing alternatives, make sure to listen to the author.  Remember they are the subject matter expert and you are working together on the same team. &lt;/p&gt;
&lt;h4&gt;It takes work!&lt;/h4&gt;
&lt;p&gt;Communication is hard!  It&#39;s easy to screw-up.  It&#39;s easy to go into attack or defense mode when you&#39;re passionate about what you&#39;re doing.  It&#39;s really something we all need to remind ourselves to work on every day.  It&#39;s something we need to periodically remind ourselves as a team.  Try to view each review as an opportunity to practice these guidelines.  Just remember to take a step back, think, and ask questions.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Downtown LA Breakfast Sandwich</title>
        <link>http://sandwichnews.org/posts/2011/12/18/downtown-la-breakfast.html</link>
        <guid isPermaLink="false">posts/2011/12/18/downtown-la-breakfast</guid>
        <pubDate>Sun, 18 Dec 2011 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/12/18/downtown-la-breakfast/tumblr_lwdvj90f7w1qz7rvyo1_r1_500.png&#34;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Breakfast sandwich from &lt;a href=&#34;http://sandwichshopla.com/&#34;&gt;Sandwich Shop&lt;/a&gt; in downtown LA.&lt;/p&gt; &lt;p&gt;Egg, cheese, and bacon on ciabatta. The interesting part is that it’s typically served “with vegetables,” which means grilled onions and peppers, jalapeños, and tomato. It’s very tasty and makes me wonder why I don’t see more jalapeños at breakfast.&lt;/p&gt; &lt;p&gt;I’ve been making my own version of this sandwich the last couple weekends and I’ve been really happy with it.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/logrodnek/6529350329/&#34;&gt;&lt;img src=&#34;/static/images/posts/2011/12/18/downtown-la-breakfast/6529350329_06d141fe74.jpg&#34;/&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The peppers and onions take awhile to cook, but it’s worth it.&lt;/p&gt; &lt;p&gt;My one regret is that I didn’t get a chance to try out the Bulgogi Cheesesteak at the Sandwich Shop… Next trip.&lt;/p&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>Cole&#39;s Sandwiches in downtown LA</title>
        <link>http://sandwichnews.org/posts/2011/12/17/coles-sandwiches.html</link>
        <guid isPermaLink="false">posts/2011/12/17/coles-sandwiches</guid>
        <pubDate>Sat, 17 Dec 2011 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/12/17/coles-sandwiches/tumblr_lwc4pr6IcA1qz7rvyo1_500.png&#34;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href=&#34;http://colesfrenchdip.com&#34;&gt;Cole&#39;s Sandwiches&lt;/a&gt; in downtown LA.&lt;/p&gt; &lt;p&gt;Cole&#39;s sandwiches claims to be the originator of the French Dip sandwich. Of course, so does &lt;a href=&#34;http://www.philippes.com/&#34;&gt;Philippe&#39;s&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Either way, it&#39;s worth a stop. The sign says &#34;since 1908&#34; and the bar inside looks pretty authentic. It&#39;s got a great feel. There&#39;s a great draught beer list.&lt;/p&gt; &lt;p&gt;The menu is simple: french dip sandwiches, with your choice of meat. They&#39;re served with some ridiculously spicy mustard and an equally spicy pickle that&#39;s been pickled alongside some jalapenos. There&#39;s something about the spiciness that goes really well with a meaty/bready sandwich. It just works.&lt;/p&gt; &lt;p&gt;I went here for lunch twice while I was in downtown LA. I ate at the bar: beef one day, and pastrami the next.&lt;/p&gt; &lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/12/17/coles-sandwiches/6524306803_bd974e65fb_z.jpg&#34;/&gt;&lt;/p&gt; &lt;p&gt;I can&#39;t recommend this place enough. The sandwiches are good, the beers are good, and the place itself has a great feel.&lt;/p&gt;&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>5 minute web framework review - reading params</title>
        <link>http://sandwichnews.org/posts/2011/11/01/5-minute-web-framework-review.html</link>
        <guid isPermaLink="false">posts/2011/11/01/5-minute-web-framework-review</guid>
        <pubDate>Tue, 01 Nov 2011 10:00:00 -0700</pubDate>
        <description>&lt;p&gt;Through various experiments, hackdays, conversations with other developers, etc. I&#39;ve found myself experimenting with a few different web frameworks. The focus has been mostly simple webapps / simple REST services written in scala that return html or json. I thought it might be interesting to dive into some focused comparisons in a series of posts.&lt;/p&gt;
&lt;p&gt;This is not an exhaustive comparison. I&#39;m going to be focusing on the frameworks I&#39;ve found the most interesting for my use cases lately, namely &lt;a href=&#34;https://scalatra.org/&#34;&gt;scalatra&lt;/a&gt;, &lt;a href=&#34;https://www.playframework.com/&#34;&gt;play&lt;/a&gt;, and &lt;a href=&#34;https://eclipse-ee4j.github.io/jersey/&#34;&gt;jersey&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the first comparison, I want to focusing on reading query and path parameters. Parameter de-serialization has always been a pain. The web uses strings, and strings are messy. Are my required params specified? Are they the right types? Can I easily convert to the types my program expects? Do they pass my validation? etc.&lt;/p&gt;
&lt;p&gt;Let&#39;s look at how each framework helps us deal with these common concerns.&lt;/p&gt;
&lt;h1&gt;jersey&lt;/h1&gt;
&lt;p&gt;I like jersey. It&#39;s a reference implementation of JSR-311: Java API for RESTful Web Services. It&#39;s also quite nice to work with in scala.&lt;/p&gt;
&lt;h2&gt;query parameters&lt;/h2&gt;
&lt;p&gt;With jersey, query parameters are simply specified as method parameters. Simple types are automatically converted, and it&#39;s easy to specify defaults. It will also automatically call converters for use with your own complex types. Unfortunately, you must use annotations to map query param names to method params.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;def doGet(@QueryParam(&amp;quot;name&amp;quot;) name: String,
@QueryParam(&amp;quot;count&amp;quot;) @DefaultValue(&amp;quot;2&amp;quot;) count: Int): String = {
  &amp;quot;name: %s, count: %d\n&amp;quot;.format(name, count)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It works pretty much as you&#39;d expect:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:8080/hello?name=larry&amp;amp;count=5&amp;quot;
name: larry, count: 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the types aren&#39;t correct, you&#39;ll get a 404:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl &amp;quot;http://localhost:8080/hello?name=larry&amp;amp;count=a&amp;quot; -D -
HTTP/1.1 404 Not Found
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;path parameters&lt;/h2&gt;
&lt;p&gt;Path parameters in jersey work pretty much the same way as query params, i.e. typed, with default values and appearing as method arguments. Additionally you can do some simple validation using regular expressions. Their names and path location are specified when defining the route.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;@Path(&amp;quot;/hello/{userid}&amp;quot;)
class Hello {
  def doGet(@PathParam(&amp;quot;userid&amp;quot;) id: Int)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&#39;s a different example showing some simple regex validation support:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;@Path(&amp;quot;/hello/{username: [a-zA-Z][a-za-z_0-9] }&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And, again, if the path doesn&#39;t match your regex, or type, you will get a 404.&lt;/p&gt;
&lt;h2&gt;other params&lt;/h2&gt;
&lt;p&gt;There are also &lt;code&gt;@CookieParam&lt;/code&gt;, &lt;code&gt;@HeaderParam&lt;/code&gt; annotations for reading cookie and header values, as well as support for pulling in session or request variables using @Context or custom annotations (e.g. I&#39;ve created &lt;code&gt;@IpAddress&lt;/code&gt; for pulling in the ip).&lt;/p&gt;
&lt;h2&gt;overall thoughts&lt;/h2&gt;
&lt;p&gt;I really like the automatic de-serialization and type conversion, and having the framework handle errors for incompatible parameters automatically.&lt;/p&gt;
&lt;p&gt;I also like the POJO mindset. It&#39;s just a function with arguments like any other. All else being equal, this makes testing in any framework super easy.&lt;/p&gt;
&lt;p&gt;The annotations do seem a little noisy, especially having to specify the parameter name. I think we can do better.&lt;/p&gt;
&lt;h1&gt;scalatra&lt;/h1&gt;
&lt;p&gt;scalatra is also very nice for simple apps, and I&#39;ve quickly become a fan of scalate which it uses for templating.&lt;/p&gt;
&lt;p&gt;When it comes to dealing with parameters though, it feels like a step back. Everything is strings. The fact that it&#39;s scala makes it easier to deal with, but it does feel like the framework could go a little further to help you out.&lt;/p&gt;
&lt;h2&gt;query parameters&lt;/h2&gt;
&lt;p&gt;To read query parameters, you use the params method from ScalatraServlet. Params is a &lt;code&gt;MultiMapHeadView[String, String]&lt;/code&gt;. So yes, you are back to dealing with Strings (or a &lt;code&gt;Seq[String]&lt;/code&gt; if using multiParams).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;get(&amp;quot;/hello&amp;quot;) {
  val name:String = params.getOrElse(&amp;quot;name&amp;quot;, halt(400))
  val count:Int = params.getOrElse(&amp;quot;count&amp;quot;, &amp;quot;2&amp;quot;).toInt

  &amp;quot;name: %s, count: %d\n&amp;quot;.format(name, count)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Calling this path without a name will generate a 400, as expected:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:8080/hello&amp;quot; -D -
HTTP/1.1 400 Bad Request
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don&#39;t specify count, you will get the default of 2. However, if you specify a non-int, you&#39;ll get a 200 where the contents are the stack trace for the toInt call. Again, your validation is all manual -- if you want better type validation, it&#39;s up to you.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:8080/hello?name=larry&amp;amp;count=a&amp;quot; -D -
HTTP/1.1 200 OK
…


java.lang.NumberFormatException: For input string: &amp;quot;a&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;path parameters&lt;/h2&gt;
&lt;p&gt;Path params work exactly the same way (including being accessed in params), and are named as part of your route&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;get(&amp;quot;/hello/:name/:count&amp;quot;) {
  val name:String = params.getOrElse(&amp;quot;name&amp;quot;, halt(400))
  val count:Int = params.getOrElse(&amp;quot;count&amp;quot;, &amp;quot;2&amp;quot;).toInt

  &amp;quot;name: %s, count: %d\n&amp;quot;.format(name, count)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:8080/hello/larry/5&amp;quot;
name: larry, count: 5
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;overall thoughts&lt;/h2&gt;
&lt;p&gt;The manual de-serialization seems a little dated, and gets old quick. Scala does make it nicer than it would be in java, since you can do things like params.&lt;code&gt;getOrElse(&#34;name&#34;, halt(400)&lt;/code&gt;), but I would like to see more.&lt;/p&gt;
&lt;p&gt;I also miss the POJO mindset… when testing you need to do whatever additional setup is necessary to serialize your params as strings and stick them in a map.&lt;/p&gt;
&lt;p&gt;I guess I also don&#39;t like that barring convention, there&#39;s no formal definition of what parameters you are expecting and what their types are - maybe you are calling params.get somewhere in the middle of your method..&lt;/p&gt;
&lt;h1&gt;play&lt;/h1&gt;
&lt;p&gt;play the framework feels a little heavy compared to jersey and scalatra, but if definitely shines when it comes to dealing with parameters.&lt;/p&gt;
&lt;h2&gt;query parameters&lt;/h2&gt;
&lt;p&gt;Query parameters in play are done really well. It&#39;s almost perfect.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;def hello(name: String, count: Int = 2) = {
  &amp;quot;name: %s, count: %d\n&amp;quot;.format(name, count)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:9000/hello?name=larry&amp;quot;
name: larry, count: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can even use Option for parameters that may be available:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-scala&#34;&gt;def hello(name: Option[String], count: Int = 2) = {
  &amp;quot;name: %s, count: %d\n&amp;quot;.format(name.getOrElse(&amp;quot;anon&amp;quot;), count)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One problem is that type conversion errors are silently ignored, and defaults will be used:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:9000/hello?name=larry&amp;amp;count=a&amp;quot;
name: larry, count: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, so they&#39;re not really ignored. If you call &lt;code&gt;Validation.hasErrors&lt;/code&gt;, it will return true, and you can discover the error. This is the same mechanism you need to use to mark parameter as required:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def hello(name: String, count: Int = 2) = {
  Validation.required(&amp;quot;name&amp;quot;, name)
  if (Validation.hasErrors) {
  // handle error
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;path parameters&lt;/h2&gt;
&lt;p&gt;Path parameters work the same way. They&#39;re defined with placeholders in your route, and automatically passed in as the correct argument. In play, routes are defined external to your code, in a routes file. E.g.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /hello/{name} Application.hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our method looks the same as the first Query param example. Calling it looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:9000/hello/larry&amp;quot;
name: larry, count: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the case of path parameters, we will get a 404 if missing the parameter (since it won&#39;t match our route).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl &amp;quot;http://localhost:9000/hello/&amp;quot; -D -
HTTP/1.1 404 Not Found
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;overall thoughts&lt;/h2&gt;
&lt;p&gt;Overall I think parameters in play are done really well.&lt;/p&gt;
&lt;p&gt;Like jersey, I really appreciate the POJO approach. play does it even better by eliminating the extra annotations and leveraging scala&#39;s default argument support.&lt;/p&gt;
&lt;p&gt;Validation does seem a little clunky, though. It seems like more could be done there.&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>the story of HOD - ahead of its time, obsolete at launch</title>
        <link>http://sandwichnews.org/posts/2011/10/10/the-story-of-hod.html</link>
        <guid isPermaLink="false">posts/2011/10/10/the-story-of-hod</guid>
        <pubDate>Mon, 10 Oct 2011 12:00:00 -0700</pubDate>
        <description>&lt;p&gt;We&#39;ve been using AWS as long as bizo has been around, since early 2008. Hadoop has always been a big part of that. When we first started, we were mostly using a shared hadoop cluster. This was kind of a pain for job scheduling, but also was mostly wasteful during off-peak hours... Thus, HOD was born.&lt;/p&gt;
&lt;p&gt;From its documentation, &#34;The goal of HOD is to provide an on demand, scalable, sandboxed infrastructure to run Hadoop jobs.&#34; &lt;a href=&#34;http://aws.amazon.com/elasticmapreduce/&#34;&gt;Sound familiar&lt;/a&gt;? HOD was developed late September and October of 2008, and launched for internal use December 12th, 2008. Amazon announced &lt;a href=&#34;http://aws.amazon.com/elasticmapreduce/&#34;&gt;EMR&lt;/a&gt; April of 2009. It&#39;s amazing how similar they ended up being... especially since we had no knowledge of EMR at the time. Even though HOD had a few nice features missing from EMR, the writing was on the wall. For new tasks, we wrote them for EMR. We slowly migrated old reports to EMR when they needed changes, or we had the time.&lt;/p&gt;
&lt;h1&gt;Architecture&lt;/h1&gt;
&lt;p&gt;HOD borrowed quite liberally from the design of &lt;a href=&#34;http://aws.amazon.com/articles/1632&#34;&gt;Alexa&#39;s GrepTheWeb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/10/10/hod_overview.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Users submitted job requests to a controller which managed starting exclusive hadoop clusters (master, slaves, hdfs), retrieving job input from S3 to HDFS, executing the job (hadoop map/reduce), monitoring the job, storing job results, and shutting down the cluster on completion. Job information and status was stored in SimpleDB, S3 was used for job inputs and outputs, and SQS was used to manage the job workflow.&lt;/p&gt;
&lt;h1&gt;Job Definition&lt;/h1&gt;
&lt;p&gt;Jobs were defined as thrift structures:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct JobRequest {
   1: JobConf job = {},
   2: i32 requested_nodes = 4, // requested number of hadoop slaves
   3: string node_type = &#34;m1.large&#34;, // machine size
   4: i32 requested_priority, // job priority
   5: string hadoop_dist, // hadoop version e.g. &#34;0.18.3&#34;
   6: set depends_on = [], // ids of job dependencies
   7: list on_success = [], // success notification
   8: list on_failure = [], // failure notification
   9: set flags = [] // everyone loves flags
 }

 struct JobConf {
   1: string job_name,
   2: string job_jar,  // s3 jar path
   3: string mapper_class,
   4: string combiner_class,
   5: string reducer_class,
   6: set job_input,  // s3 input paths
   7: string job_output,  // s3 output path (optional)
   8: string input_format_class,
   9: string output_format_class,
   10: string input_key_class,
   11: string input_value_class,
   12: string output_key_class,
   13: string output_value_class,

   // list of files for hadoop distributed cache
   14: set user_data = [],
   15: map other_config = {}, // passed directly JobConf.set(k, v)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&#39;ll notice that dependencies could be specified. HOD could hook up the output of 1 or more jobs into the input of a job and wouldn&#39;t run the job until all of its dependencies have successfully completed.&lt;/p&gt;
&lt;h1&gt;User Interaction&lt;/h1&gt;
&lt;p&gt;We had a user program, similar to emr-client that helped construct and job jobs, e.g.:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JOB=&#34;\
 -m com.bizo.blah.SplitUDCMap \
 -r com.bizo.blah.UDCReduce \
 -jar com-bizo-release:blah/blah/blah.jar
 -jobName blah \
 -i com-bizo-data:blah/blah/blah/${MONTH} \
 -outputKeyClass org.apache.hadoop.io.Text \
 -outputValueClass org.apache.hadoop.io.Text \
 -nodes 10 \
 -nodeType c1.medium \
 -dist 0.18.3 \
 -emailSuccess larry@bizo.com \
 -emailFailure larry@bizo.com \
&#34;

$HOD_HOME/bin/hod_submit $JOB $@
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There was also some support for querying jobs:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/10/10/hod_status.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;As well as support for viewing job output, logs, counters, etc.&lt;/p&gt;
&lt;h1&gt;Nice features&lt;/h1&gt;
&lt;p&gt;We&#39;ve been very happy users of Amazon&#39;s EMR since it launched in 2009. There&#39;s nothing better than systems you don&#39;t need to support/maintain yourself! And they&#39;ve been really busy making EMR more easy to use and adding great features. Still, there are a few things I miss from HOD.&lt;/p&gt;
&lt;h2&gt;Workflow support&lt;/h2&gt;
&lt;p&gt;As mentioned, HOD had support for constructing job workflows. You could wire up dependencies amount multiple jobs. E.g. here&#39;s an example workflow&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/static/images/posts/2011/10/10/hod_acct_01_28_2009.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;It would be nice to see something like this in EMR. For really simple workflows, you can sometime squeeze them into a single EMR job as multiple steps, but that doesn&#39;t always make sense and isn&#39;t always convenient.&lt;/p&gt;
&lt;h2&gt;Notification support&lt;/h2&gt;
&lt;p&gt;HOD supported notifications directly. Initially just email notifications, but there was a plugin structure in place with an eye towards supporting HTTP endpoint, and SQS notifications.Yes, this is possible by adding a custom EMR job step at the end that checks the status of itself and sends an email/failure notification... But, c&#39;mon, why not just build in easy SNS support? Please?&lt;/p&gt;
&lt;h2&gt;Counter support&lt;/h2&gt;
&lt;p&gt;Building on that, HOD had direct support/understanding for hadoop counters. When processing large volumes of data, they become really critical in tracking the health of your reports over time. This is something I really miss. Although, it&#39;s less obvious how to fold this in with Hive jobs, which is how most of our reports are written these days.&lt;/p&gt;
&lt;h2&gt;Arbitrary Hadoop versions&lt;/h2&gt;
&lt;p&gt;HOD operated with straight hadoop, so it was possible to have it install an arbitrary version/package just by pointing it to the right distribution in S3.Since Amazon isn&#39;t directly using a distribution from the hadoop/hive teams, you need to wait for them to apply their patches/changes and can only run with versions they directly support. This has mostly been a problem with Hive, which moves pretty quickly.It would be really great if they could get to a point where their changes have been folded back into the main distribution.Of course, this is probably something you can do yourself, again with a custom job step to install your own version of Hive… Still, they have some nice improvements, and again, it would be nice if it were just a simple option to the job.&lt;/p&gt;
&lt;h1&gt;The Past / The Future&lt;/h1&gt;
&lt;p&gt;Of course, HOD wasn&#39;t without its problems :). It&#39;s become a bear to manage, especially since we pretty much stopped development / maintenance (aside from rebooting it) back in 2009. It was definitely with a sigh of relief that I pulled the plug.&lt;/p&gt;
&lt;p&gt;Still, HOD was a really fun project! It was an early project for me at Bizo, and it was really amazing how easy it was to write a program that starts up machines! and gets other programs installed and running! Part of me wonders if there isn&#39;t a place for an open source EMR-like infrastructure somewhere? Maybe for private clouds? Maybe for people who want/need more control? Or for cheapskates? :)&lt;/p&gt;
&lt;p&gt;Or maybe HOD v2 is just some wrappers around EMR that provides some of the things I miss : workflow support, notifications, easier job configuration...Something to think about for that next hack day :).&lt;/p&gt;</description>
      </item>
    
      <item>
        <title>hackday - analog meters</title>
        <link>http://sandwichnews.org/posts/2010/08/13/hackday-analog-meters.html</link>
        <guid isPermaLink="false">posts/2010/08/13/hackday-analog-meters</guid>
        <pubDate>Fri, 13 Aug 2010 10:00:00 -0700</pubDate>
        <description>&lt;p&gt;For this last hackday, I decided to work on something more hardware hacking related. At this year&#39;s &lt;a href=&#34;https://makerfaire.com/&#34;&gt;Maker Fair&lt;/a&gt;, I was really inspired by all the cool stuff people were building, so I picked up an &lt;a href=&#34;https://www.arduino.cc/&#34;&gt;arduino&lt;/a&gt; and started playing around with a couple of things.&lt;/p&gt;
&lt;p&gt;I&#39;ve always wanted to have some cool old-school analog VU type meters displaying web requests.&lt;/p&gt;
&lt;p&gt;Here&#39;s my completed hackday project:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4073/4886748674_69d378a309.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s a view of the components from the back:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4096/4886751606_76ebe9ed1c.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s battery operated and receives data wirelessly over RF from another arduino I have hooked up via serial to my laptop.&lt;/p&gt;
&lt;p&gt;It&#39;s pretty simple, but I&#39;m still totally psyched about how it came out.&lt;/p&gt;
&lt;p&gt;The main components are some analog panel meters (kinda pricey, but awesome), and an RF receiver. The frame is a piece of scrap acrylic from TAP Plastics that I drilled and cut to size, and the stand is a piece of a wire clothes hanger bent to shape.&lt;/p&gt;
&lt;p&gt;Connected to my computer is a another arduino (actually a &lt;a href=&#34;http://www.appliedplatonics.com/volksduino/&#34;&gt;volksduino&lt;/a&gt;) that receives updates over USB and sends the data out over RF:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4142/4886752598_2522c0839b_d.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;You may be asking, why bother with wireless if you need a computer hooked up through serial anyway. Or you may ask why not just connect to a wireless network directly.&lt;/p&gt;
&lt;p&gt;Well, I wanted the meters to be able to be moved around, or mounted on a wall... I wanted them wireless. But, it turns out that wireless and even ethernet solutions for connecting an arduino to the internet directly are comparatively pretty expensive. Even using bluetooth is expensive. My long term plan is to have a single arduino connected to the internet directly (via ethernet or wireless), and have it serve as a proxy over RF for the others... So this is a bit of work towards that.&lt;/p&gt;
&lt;p&gt;I wrote a bit of Java code to connect to amazon&#39;s cloudwatch to pull the load balancer statistics for two of our services. I then discovered it&#39;s near impossible to connect to anything over USB in Java... It is ridiculous. Luckily, it&#39;s REALLY easy to do this with &lt;a href=&#34;https://processing.org/&#34;&gt;Processing&lt;/a&gt;, so I wrote a simple processing program that used my cloudwatch library and wrote it out to serial.&lt;/p&gt;
&lt;p&gt;And that&#39;s really it. The arduino reads data over serial, and periodically sends it over RF. The arduino hooked up to the meters simply reads the values over RF and sets the meters to display a scaled version of the results. They&#39;re showing requests per second. We get a huge amount of requests per second with these services, so the numbers on the dial aren&#39;t actually correct (I need to make some custom faceplates). It also flashes an LED every time it gets a RF transmission.&lt;/p&gt;
&lt;p&gt;Here&#39;s a quick video of it in action:&lt;/p&gt;
&lt;p&gt;The one thing I&#39;m not crazy about is that the maximum resolution you can get from cloudwatch is stats per minute, so the meters don&#39;t actually change as often as I would like.&lt;/p&gt;
&lt;p&gt;Still, pretty cool. I&#39;m looking forward to building some more displays like this in the future.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>