<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>jes5199 of blog</description><title>Jes' Codex</title><generator>Tumblr (3.0; @jes5199)</generator><link>http://jes5199.tumblr.com/</link><item><title>Don't use the stock ruby on Mac OS X</title><description>&lt;p&gt;Math doesn&amp;#8217;t work correctly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;gt; 212227119877294391 * 86400&lt;/p&gt;
&lt;p&gt;=&amp;gt; 359548130941076096&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On non-broken rubies:&lt;/p&gt;
&lt;blockquote&gt;

&lt;p&gt;&amp;gt; 212227119877294391 * 86400&lt;/p&gt;
&lt;p&gt;=&amp;gt; 18336423157398235382400&lt;/p&gt;

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

&lt;p&gt;(This has something to do with Fixnums that are larger than 32 bits failing to jump to Bignums correctly. I do not know whether it affects other 64bit versions of ruby)&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/42535629581</link><guid>http://jes5199.tumblr.com/post/42535629581</guid><pubDate>Thu, 07 Feb 2013 18:23:00 -0500</pubDate><category>ruby</category><category>core</category><category>bugs</category><category>1.8.7</category><category>osx</category></item><item><title>wooo</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lz7da9KV281qagp7wo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;wooo&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/17396210415</link><guid>http://jes5199.tumblr.com/post/17396210415</guid><pubDate>Fri, 10 Feb 2012 19:27:45 -0500</pubDate></item><item><title>clojure first impression</title><description>&lt;p&gt;&lt;span&gt; &lt;/span&gt;I realized that I&amp;#8217;ll never be able to finish inventing a programming language if I don&amp;#8217;t learn a LISP first.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;ve been playing with Project Euler with a Clojure repl, and &amp;#8230; well, it&amp;#8217;s not ruby and it&amp;#8217;s not Haskell.&lt;/p&gt;
&lt;p&gt;But it has a lot of lazy data structures, so I decided to pretend I was writing Haskell anyway and see what happens.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a Haskell-ish way to generate the fibonacci numbers:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;let fib = 1 : 1 : (map (uncurry (+)) (zip (drop 1 fib) fib))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So I decided to port it directly to Clojure. It wouldn&amp;#8217;t be possible to do in a language that didn&amp;#8217;t have lazy sequences, but I was able to do it in Clojure pretty straightforwardly. Here&amp;#8217;s a before-and-after, so you can see how the two definitions relate:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; let  fib    =            1:1 : (map (uncurry      (+)) ( zip                     (drop 1  fib )  fib    ) )
(defn fib [] ( lazy-cat [ 1 1 ] (map (partial apply + ) ( partition 2 (interleave (drop 1 (fib)) (fib) ) ) ) ) )

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;Gosh, you know, after a while you don&amp;#8217;t even see those parentheses. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;#8217;s see how it works!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s Haskell, for reference:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prelude&amp;gt; take 30 fib&lt;br/&gt;[1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And the Clojure:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;user=&amp;gt; (take 30 (fib))&lt;br/&gt;&lt;strong&gt;java.lang.OutOfMemoryError: Java heap space&lt;/strong&gt;&lt;br/&gt;(1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Well, there you have it.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/12982472442</link><guid>http://jes5199.tumblr.com/post/12982472442</guid><pubDate>Fri, 18 Nov 2011 17:24:00 -0500</pubDate></item><item><title>In which I brainstorm about my first 3D fabbing project</title><description>&lt;p&gt;OK, so (for @keystricken&amp;#8217;s birthday, [hi, Mon!]) I made a thing (with the help of &lt;a title="Shapeways" href="http://www.shapeways.com/"&gt;Shapeways&lt;/a&gt;&amp;#8217;s Selective Laser &lt;a title="Sintering" href="http://en.wikipedia.org/wiki/Selective_laser_sintering"&gt;Sintering&lt;/a&gt; machine)&lt;/p&gt;
&lt;p&gt;&lt;img height="500" width="375" alt="sundial" src="http://farm6.static.flickr.com/5023/5659909432_4d0e4e3787.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;Which is really just a physical projection of a 3D model I made in CAD:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://beta.jes5199.com/images/242921.v0.s13.convert.large.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;which was really challenging since I had never really used 3D CAD before at all.&lt;/p&gt;
&lt;p&gt;after some flailing about, I came up with a process that looked like this:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Draw something on paper&lt;/li&gt;
&lt;li&gt;Scan it in&lt;/li&gt;
&lt;li&gt;Use The GIMP&amp;#8217;s filters and levels a to turn it into a monochrome (like seriously just black and white, not greyscale) image.&lt;/li&gt;
&lt;li&gt;Use Inkscape&amp;#8217;s &amp;#8220;Trace Bitmap&amp;#8221; command to turn the drawings into SVG vector graphics&lt;/li&gt;
&lt;li&gt;Import the SVG into FreeCAD &amp;#8220;as geometry&amp;#8221;&lt;/li&gt;
&lt;li&gt;Notice that FreeCAD has mysteriously failed to correctly understand some of the shapes&lt;/li&gt;
&lt;li&gt;curse, reopen the SVG in Inkscape, stare at the control points of the paths until I notice that there&amp;#8217;s two points on the same pixel (don&amp;#8217;t ask me how I can see that), delete one, and save again&lt;/li&gt;
&lt;li&gt;Import the SVG into FreeCAD &amp;#8220;as geometry&amp;#8221;&lt;/li&gt;
&lt;li&gt;Extrude the geometry into solids&lt;/li&gt;
&lt;li&gt;Notice that FreeCAD has failed to understand that white shapes inside of black shapes are actually &amp;#8220;holes&amp;#8221;&lt;/li&gt;
&lt;li&gt;Use the FreeCAD &amp;#8220;Boolean Difference&amp;#8221; function to generate new solids that are black shapes with the white shapes subtracted &amp;#8230; one pair at a time.&lt;/li&gt;
&lt;li&gt;Get confused as hell, and try to backtrack even though &amp;#8220;Undo&amp;#8221; always seems to be disabled&lt;/li&gt;
&lt;li&gt;Cut and paste these solids into the main document&lt;/li&gt;
&lt;li&gt;Using my high-school algebra, figure out what angle to rotate the solids to&lt;/li&gt;
&lt;li&gt;Notice that every pasted object seems to have a new and different understanding of where the point 0,0,0 is, so that math on the coordinates is meaningless.&lt;/li&gt;
&lt;li&gt;Try to use the mouse to move a shape: either mysteriously fling an object way, way outside the visible scope of the document, or accidentally hit &amp;#8220;ESC&amp;#8221; while dragging the object (which is not &amp;#8216;cancel&amp;#8217; like my muscle memory suggests, but rather &amp;#8220;please crash the program&amp;#8221;)&lt;/li&gt;
&lt;li&gt;Give up on the mouse and painstakingly, manually move each object into an X/Y/Z coordinate triple using the numeric entry boxes that puts it into a place that doesn&amp;#8217;t look completely wrong.&lt;/li&gt;
&lt;li&gt;(Eventually) export the CAD model as VRML&lt;/li&gt;
&lt;li&gt;Try to open the VRML file in Meshworks&lt;/li&gt;
&lt;li&gt;Meshwork says it&amp;#8217;s not VRML! Run `file` on the file&lt;/li&gt;
&lt;li&gt;Realize that FreeCAD helpfully gzips files, sometimes, without warning.&lt;/li&gt;
&lt;li&gt;gunzip the file&lt;/li&gt;
&lt;li&gt;Open the VRML file in Meshworks&lt;/li&gt;
&lt;li&gt;drag it around in Meshworks, and marvel at how it&amp;#8217;s both easier to manipulate and harder to see details on, compared to FreeCAD&lt;/li&gt;
&lt;li&gt;Export the model to STL&lt;/li&gt;
&lt;li&gt;Upload the STL file to Shapeways&lt;/li&gt;
&lt;li&gt;Wait for an automated email&lt;/li&gt;
&lt;li&gt;Holy crap it worked.&lt;/li&gt;
&lt;li&gt;Give Shapeways some money&lt;/li&gt;
&lt;li&gt;Wait a couple weeks&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I think I can probably do better in the future. It seems like it should be possible to make a toolchain that does (image)-&amp;gt;Trace-&amp;gt;Extrude-&amp;gt;Rotate-&amp;gt;Translate-&amp;gt;Export without human intervention.&lt;/p&gt;
&lt;p&gt;If I had that, I&amp;#8217;d actually work on writing a program that solved the interesting parts of the sundial (most of which I solved on paper for this prototype)&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Solar noon is always north/up, but what clock time that is locally depends on how far east or west you are from the central meridian of your time zone. The clock dial is rotated by a number of degrees that&amp;#8217;s your time zone&amp;#8217;s central longitude minus your actual longitude.&lt;/li&gt;
&lt;li&gt;In order to have evenly spaced shadows for each hour (see &lt;a href="http://www.mysundial.ca/tsp/equatorial_sundial.html"&gt;Equatorial Sundial&lt;/a&gt;), the dial should be inclined to an angle that&amp;#8217;s 90 degrees minus your longitude. That means that your lower gnomon (which doubles as the support) should be at a length that can be calculated using trigonometry (uh, the cotangent of your latitude times the radius of the dial, I think)&lt;/li&gt;
&lt;li&gt;The top dial is your &amp;#8220;summer&amp;#8221; dial and the lower dial is your &amp;#8220;winter&amp;#8221; dial. A nice cheat is to have the top dial already offset by 15 degrees so that it is set to Daylight Savings Time&lt;/li&gt;
&lt;li&gt;The lower dial runs counter-clockwise. In this prototype, I cheated and just mirrored the lower dial. Mirrored Roman Numerals are actually sort of evil, though, since IV becomes VI, etc.&lt;/li&gt;
&lt;/ol&gt;</description><link>http://jes5199.tumblr.com/post/4978997702</link><guid>http://jes5199.tumblr.com/post/4978997702</guid><pubDate>Wed, 27 Apr 2011 02:25:00 -0400</pubDate></item><item><title>A* is easy.</title><description>&lt;p&gt;I&amp;#8217;ve been trying to learn some old-school algorithms; the sort of things that CS people study but rarely come up at programming gigs.&lt;/p&gt;
&lt;p&gt;The thing is, descriptions of algorithms online tend to suck. and open source implementations of textbook algorithms tend to suck.&lt;/p&gt;
&lt;p&gt;So, I&amp;#8217;m going to try to improve the situation. So, here&amp;#8217;s my first attempt. &lt;a href="http://en.wikipedia.org/wiki/A*"&gt;A* algorithm&lt;/a&gt; in simple readable ruby: &lt;a href="https://github.com/jes5199/astar/blob/master/astar.rb"&gt;&lt;a href="https://github.com/jes5199/astar/blob/master/astar.rb"&gt;https://github.com/jes5199/astar/blob/master/astar.rb&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/4163768083</link><guid>http://jes5199.tumblr.com/post/4163768083</guid><pubDate>Mon, 28 Mar 2011 14:53:00 -0400</pubDate></item><item><title>ruby String += considered harmful</title><description>&lt;p&gt;In real code, we found a very, very slow loop. Changing two characters:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;+=&lt;/code&gt; is about 100 seconds.&lt;br/&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; is around 1/3 of a second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using &lt;code&gt;+=&lt;/code&gt; on a string creates a copy and then discards the original, while &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; allows the ruby interpreter to intelligently resize the buffer.&lt;/p&gt;
&lt;p&gt;The only gotcha is that &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; will mutate your string object, which means that it&amp;#8217;s not safe to use on a method&amp;#8217;s parameters. &lt;code&gt;#dup&lt;/code&gt; those strings, if you need to append to them.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/3183893559</link><guid>http://jes5199.tumblr.com/post/3183893559</guid><pubDate>Tue, 08 Feb 2011 13:53:00 -0500</pubDate></item><item><title>"organizations which design systems are constrained to produce designs which are copies of the..."</title><description>“organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Law"&gt;http://en.wikipedia.org/wiki/Conway%27s_Law&lt;/a&gt;&lt;/em&gt;</description><link>http://jes5199.tumblr.com/post/2434753110</link><guid>http://jes5199.tumblr.com/post/2434753110</guid><pubDate>Thu, 23 Dec 2010 15:08:52 -0500</pubDate></item><item><title>Full_disclosure#History</title><description>&lt;blockquote&gt;Rogues are very keen in their profession, and know already much more than we can teach them respecting their several kinds of roguery.&lt;/blockquote&gt;
&lt;p&gt;I love everything about this internet artifact I&amp;#8217;ve found: &lt;a href="http://en.wikipedia.org/wiki/Full_disclosure#History"&gt;http://en.wikipedia.org/wiki/Full_disclosure#History&lt;/a&gt; . Actually, I want you to have &lt;a href="http://en.wikipedia.org/w/index.php?title=Full_disclosure&amp;amp;oldid=391912788#History"&gt;today&amp;#8217;s snapshot&lt;/a&gt; of the wikipedia article - I suspect that eventually this page will get cleaned up into an encyclopedia article, and it&amp;#8217;s just too nice as work of (oh, I don&amp;#8217;t know) postmodern literature? cyberspace effluvia? bird cage lining?&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/1685248755</link><guid>http://jes5199.tumblr.com/post/1685248755</guid><pubDate>Thu, 25 Nov 2010 18:57:00 -0500</pubDate></item><item><title>re-open source development</title><description>&lt;p&gt;&lt;br/&gt;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212; Forwarded message &amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&lt;br/&gt;From: &lt;strong class="gmail_sendername"&gt;Markus Roberts&lt;/strong&gt; &lt;span dir="ltr"&gt;&amp;lt;&lt;a target="_blank" href="mailto:markus@puppetlabs.com"&gt;markus@puppetlabs.com&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt; Date: Tue, Sep 14, 2010 at 1:57 PM&lt;br/&gt;Subject: [Puppet-dev] Oops&lt;br/&gt;To: puppet-dev &amp;lt;&lt;a target="_blank" href="mailto:puppet-dev@googlegroups.com"&gt;puppet-dev@googlegroups.com&lt;/a&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Funny story: as the number of developers working on Puppet and related  projects at PuppetLabs has increased, the average distance between them  has dropped geometrically*, to the point that if we want to discuss  something we&amp;#8217;re working on with someone, we can (in many cases  literally) reach out and tap a fellow developer on the shoulder.  This  is great for us but it has had an unfortunate unintended consequence:  we&amp;#8217;ve been doing more and more face-to-face discussions and less and  less on this list.&lt;br/&gt;&lt;br/&gt;Oops.&lt;br/&gt;&lt;br/&gt;This wasn&amp;#8217;t intentional and (though it seems blindingly  obvious in hindsight) wasn&amp;#8217;t expected either.  It was, as one five year  old put it, a blundersight.&lt;br/&gt;&lt;br/&gt;So we&amp;#8217;re going to try something we  hope will fix things; office chat is still going to go on as normal &amp;#8212;  we&amp;#8217;ll spare you our debates about whether we should try having lunch at  the place with the cult videos on all the TVs again or who&amp;#8217;s going to  show the new developer the ropes &amp;#8212; but if anyone starts to have a  substantive discussion about Puppet &amp;amp; friends we&amp;#8217;ll cut them off and  tell them to tell it to the list.  &lt;br/&gt;&lt;br/&gt;That means that when we&amp;#8217;re kicking around ideas you&amp;#8217;ll get to see  them and put in your two cents worth on equal footing with the  developers in the office (since we really do want your input).  It also means that you&amp;#8217;ll get to see some  ideas that never go anywhere, and crazy things that are (mercifully)  shot down in their first few hours.  But then you&amp;#8217;ll also get to see the  direction of our thinking long before some of it results in a line of  code, and help us shape it before anything is settled.&lt;br/&gt;&lt;br/&gt;Hopefully, it&amp;#8217;ll be just like the old days.&lt;br/&gt;&lt;br/&gt;&amp;#8212; PuppetLab Developer Team:&lt;br/&gt;&lt;br/&gt;    Luke Kanies&lt;br/&gt;    Markus Roberts&lt;br/&gt;    Rein Henrichs&lt;br/&gt;    Jesse Wolfe&lt;br/&gt;    Igal Koshevoy&lt;br/&gt;    Matt Robinson&lt;br/&gt;    Nick Lewis&lt;br/&gt;     Paul Berry&lt;br/&gt;    Jacob Helwig&lt;br/&gt;&lt;br/&gt;* Actually, it&amp;#8217;s probably something  like k*(sqrt(s^2/n)-r) for n developers of mean radius r in a s x s  office, with k some constant around 3.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/1122792751</link><guid>http://jes5199.tumblr.com/post/1122792751</guid><pubDate>Tue, 14 Sep 2010 17:51:18 -0400</pubDate></item><item><title>ICFP composability</title><description>&lt;p&gt;I participated in the 2010 ICFP programming contest a couple weeks ago, and my team (&amp;#8220;vorpal&amp;#8221;) did the best of any team I&amp;#8217;ve been on yet: 16th place.&lt;/p&gt;
&lt;p&gt;While I&amp;#8217;m waiting for teammate Paul Berry to write a detailed retelling of our progress, it occurred to me that I want to share the most elegant function I&amp;#8217;ve written in a long time:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type Fuel = [[[Integer]]]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;parseFuel :: String -&amp;gt; (Fuel, String)&lt;br/&gt;parseFuel = parseTritList $ parseTritList $ parseTritList $ parseIntSchemeTwo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;where I was taking a string of trinary digits and creating a &amp;#8220;Fuel&amp;#8221;, which turned out to be, in the context of the puzzle, a list of lists of lists of integers.&lt;/p&gt;
&lt;p&gt;It helps that the ICFP&amp;#8217;s serialization format was elegantly recursive, but I can&amp;#8217;t help but have the feeling that Haskell functions are &lt;em&gt;composable&lt;/em&gt; in a way that other languages aren&amp;#8217;t. Which is frustrating, because generally I don&amp;#8217;t want to be writing Haskell, there&amp;#8217;s just occasional moments like this where it&amp;#8217;s a perfect fit.&lt;/p&gt;
&lt;p&gt;In traditional haskell style, I&amp;#8217;ll give you the type signature of the component functions, and leave the implementation as an exercise for the reader:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;parseIntSchemeTwo :: String -&amp;gt; (Integer, String)&lt;br/&gt;parseTritList :: (String -&amp;gt; (a, String)) -&amp;gt; String -&amp;gt; ([a], String)&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/770038709</link><guid>http://jes5199.tumblr.com/post/770038709</guid><pubDate>Sun, 04 Jul 2010 15:06:11 -0400</pubDate></item><item><title>make vim stupider</title><description>&lt;p&gt;I get frustrated when vim is too smart, especially when it reindents things without me asking.&lt;/p&gt;
&lt;p&gt;This is a minimal, dumb indent system that I might be happy with. We&amp;#8217;ll see.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function! SimpleIndent()
    return indent(prevnonblank(v:lnum-1))
endfunction

function! MyO()
    let line = line(".")
    let i = indent(nextnonblank(line))
    call append(line-1, repeat(" ", i))
    call cursor(line, i) 
endfunction

map O :call MyO()&amp;lt;CR&amp;gt;a

filetype indent off
set indentexpr=SimpleIndent()

&lt;/code&gt;&lt;/pre&gt;</description><link>http://jes5199.tumblr.com/post/751122747</link><guid>http://jes5199.tumblr.com/post/751122747</guid><pubDate>Tue, 29 Jun 2010 17:52:00 -0400</pubDate></item><item><title>I always forget to add the "sign-off" line to my git commits</title><description>&lt;p&gt;export EDITOR=cat&lt;/p&gt;
&lt;p&gt;while git rebase &amp;#8212;continue&amp;#160;; do git commit &amp;#8212;amend -s&amp;#160;; done&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/608156532</link><guid>http://jes5199.tumblr.com/post/608156532</guid><pubDate>Mon, 17 May 2010 19:11:09 -0400</pubDate></item><item><title>git-git</title><description>&lt;p&gt;I&amp;#8217;ve just created a new command for git, called &lt;code&gt;git&lt;/code&gt;. It only does one thing: it calls git.&lt;/p&gt;
&lt;p&gt;So, if you need to fetch changes, instead of typing:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git fetch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now you can type:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git git fetch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It even works recursively:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git git git git git git git git git fetch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;git-git is available on my github at &lt;a href="http://github.com/jes5199/git-git"&gt;http://github.com/jes5199/git-git&lt;/a&gt;&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/508598944</link><guid>http://jes5199.tumblr.com/post/508598944</guid><pubDate>Fri, 09 Apr 2010 13:12:10 -0400</pubDate></item><item><title>Does Google Make Us Stupid?</title><description>&lt;p&gt;No.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/405524314</link><guid>http://jes5199.tumblr.com/post/405524314</guid><pubDate>Mon, 22 Feb 2010 16:38:44 -0500</pubDate></item><item><title>(observation)</title><description>&lt;p&gt;Sysadmins and programmers have less in common than I realized.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/382193772</link><guid>http://jes5199.tumblr.com/post/382193772</guid><pubDate>Wed, 10 Feb 2010 13:49:00 -0500</pubDate></item><item><title>"So we’ve already reduced the code to the two hardest problems left in computer science: naming..."</title><description>“So we’ve already reduced the code to the two hardest problems left in computer science: naming conventions and cache invalidation”</description><link>http://jes5199.tumblr.com/post/367402995</link><guid>http://jes5199.tumblr.com/post/367402995</guid><pubDate>Tue, 02 Feb 2010 15:41:15 -0500</pubDate></item><item><title>uploading to flickr with ruby</title><description>&lt;p&gt;there&amp;#8217;s been some serious bit rot in the flickr API libs for ruby.&lt;br/&gt;flickr is still suggesting this list of broken, abandoned libraries:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://premshree.seacrow.com/code/ruby/flickr-ruby"&gt;flickr-ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redgreenblu.com/flickr/"&gt;flickr.rb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyforge.org/projects/rflickr/"&gt;rflickr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I found some random old blog posts about flickr_fu, and it seemed more OK but still unfinished, and still abandoned.&lt;/p&gt;
&lt;p&gt;But I&amp;#8217;ve found that some good people have forked the project on github, and they have a version that&amp;#8217;s in good shape: &lt;a href="http://github.com/seboslaw/flickr_fu"&gt;http://github.com/seboslaw/flickr_fu&lt;/a&gt; is the version that seems freshest today, but there&amp;#8217;s several other active branches in the &lt;a href="http://github.com/seboslaw/flickr_fu/network"&gt;network&lt;/a&gt; (I can&amp;#8217;t tell to what degree they&amp;#8217;re collaborating)&lt;/p&gt;
&lt;p&gt;github means opensource sucks less.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/354893586</link><guid>http://jes5199.tumblr.com/post/354893586</guid><pubDate>Tue, 26 Jan 2010 16:44:24 -0500</pubDate></item><item><title>on Parsing Expression Grammars</title><description>&lt;p&gt;Co-worker &lt;a href="http://opensourcebridge.org/users/54"&gt;Markus Roberts&lt;/a&gt; wrote:&lt;/p&gt;
&lt;blockquote&gt;&lt;a title="Parsing Expression Grammars" href="http://en.wikipedia.org/wiki/Parsing_expression_grammar"&gt;PEGs&lt;/a&gt; are, to my way of thinking, a beautiful sweet spot in grammar space, a worthy peer of limited-lookahead and regular expressions, but like these they cover a specific range of the problem space very well, if you take them on their own terms, and will fight you every step of the way if you don&amp;#8217;t.  Trying to use a regular expression as if it was a broken way of writing context free grammars, or using BNF to write a regular expression would get you into the same sort of problems.&lt;/blockquote&gt;
&lt;p&gt;Well, I&amp;#8217;m on the bandwagon for this way of thinking; watching the glowing community response to PEGs in both the functional-programming and the post-smalltalk camps has convinced me that it&amp;#8217;s clearly filling a need.&lt;br/&gt; One one hand, it&amp;#8217;s pretty clear that I, personally, haven&amp;#8217;t quite gotten a handle on what the right way to use this tool is, yet. For example: the very notion of replacing our lexer+RACC with &lt;a href="http://treetop.rubyforge.org/"&gt;Treetop&lt;/a&gt; assumes that it&amp;#8217;s a drop-in replacement for a lexer+parser.&lt;br/&gt; On the other hand, even without really understanding what I was doing, I&amp;#8217;ve been able to make the PEG do what I wanted (and parse almost all of the &lt;a href="http://reductivelabs.com/trac/puppet/wiki/LanguageTutorial"&gt;puppet language&lt;/a&gt;) without bothering to actually learn the idioms or the theory*, and the failure modes generally haven&amp;#8217;t been very mysterious. (* for example, I&amp;#8217;m extremely confused about when it backtracks and when it doesn&amp;#8217;t, but that hasn&amp;#8217;t stopped me)&lt;br/&gt; On the third hand, every PEG system I see implements almost exactly the same functionality. That suggests to me that there hasn&amp;#8217;t been much evolution in the design; there may be still be easy hacks that dramatically improve usability. I want to try to think of these while I&amp;#8217;m still a naive user; once I understand the nuances, I might stop being aware of the pain points.&lt;/p&gt;</description><link>http://jes5199.tumblr.com/post/325969607</link><guid>http://jes5199.tumblr.com/post/325969607</guid><pubDate>Sat, 09 Jan 2010 20:27:00 -0500</pubDate></item></channel></rss>
