<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkUMRXoycCp7ImA9WxBSFUs.&quot;"><id>tag:blogger.com,1999:blog-16002962</id><updated>2009-12-23T01:24:44.498-08:00</updated><title>The Web and all that Jazz</title><subtitle type="html">Whatever technical thing I find interesting.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://webjazz.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>337</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TheWebAndAllThatJazz" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CkUMRXs6fyp7ImA9WxBSFUs.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-3546872875335494945</id><published>2009-12-23T01:17:00.001-08:00</published><updated>2009-12-23T01:24:44.517-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-23T01:24:44.517-08:00</app:edited><title>Practice coding faster</title><content type="html">map_with_index.  Why is there no map_with_index in ruby?  Ends up it's because you don't need it.  You can simply do this:&lt;p&gt;&lt;/p&gt;&lt;script src="http://gist.github.com/262055.js?file=map_with_index.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Even now, I'm learning things about Ruby.  The rabbit hole is deep.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Anyway, a post about &lt;a href="http://imprompt.us/2009/code-fast/"&gt;learning how to code fast&lt;/a&gt; came across my desk.  I knew that I wasn't quite as fast as other coders, but I had always thought that I thought deeper on the solution.  But I think what he says makes sense.  I know that violinists slowly ramp up their speed to a point where they're almost making mistakes, faster than they'd actually play the piece to practice playing it at the correct speed.  Same with drawing.  The more you practice drawing faster, the better you get at being economic with your strokes.  So I figured I'd try the same with programming, since I've never done much of this type of exercise.&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt;I decided to do the first &lt;a href="http://www.rubyquiz.com/quiz1.html"&gt;Ruby Quiz&lt;/a&gt;, since I was most familiar with Ruby, and I should be able to do it quickly.  It took me about three hours, including reading the instructions, going on bathroom breaks, etc.  I think I should have been faster, and I noticed where I slowed down.  I found myself trying things out in irb a lot because I didn't know the exact behavior of some array and string functions.  Also, I spent some time in the beginning pondering how to structure it--should it be a class, or just a collection of functions, or should I extend the classes?  &lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt;I'm not thrilled about how it's structured, but it works.  Well, there's a small bug in there, but I'm going to refrain from fixing it.  It'll tack on another 30 mins.  The point of the exercise is that I can see what I need to work on.  I'll try again next time with the next ruby quiz.&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/262420.js?file=ruby_quiz_001.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com/"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/practice-coding-faster"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-3546872875335494945?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=-B41awDSGOg:dp8m5Ykj7k4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=-B41awDSGOg:dp8m5Ykj7k4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=-B41awDSGOg:dp8m5Ykj7k4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=-B41awDSGOg:dp8m5Ykj7k4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/-B41awDSGOg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/3546872875335494945/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/12/practice-coding-faster.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3546872875335494945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3546872875335494945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/-B41awDSGOg/practice-coding-faster.html" title="Practice coding faster" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/12/practice-coding-faster.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGRXY6eSp7ImA9WxBSFEw.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-2706426550816268857</id><published>2009-12-21T09:21:00.001-08:00</published><updated>2009-12-21T09:23:44.811-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T09:23:44.811-08:00</app:edited><title>On to the new old thing</title><content type="html">&lt;p&gt;Ever since I quit my job at the lab 4 years ago to pursue a startup, I'd been fumbling around learning all sorts of things.  And though I had determination and persistence, I simply didn't know a lot of things outside of coding.  Who wants this?  Why would they pay money for it?  Where do you find them?  How do you change your idea if it doesn't work?  Going into it, I knew I didn't know anything and that I'd learn, but I also didn't know what I didn't know.  &lt;/p&gt;  &lt;p&gt;For the past year and a half, I've been with &lt;a href="http://www.frogmetrics.com/"&gt;a startup&lt;/a&gt; that went into the YC program. So as much as I wanted to pursue my own ideas, I was advised to join up and watch other people and learn.  And learn a lot I did.  What to do, and what not to do.  And just seeing founder from other startups helped.  What their thought processes and attitudes about their line was work was.  Meeting role models are easier than reading about them, I guess.  &lt;/p&gt;  &lt;p&gt;And yet, while I've been learning about things outside of code, I felt like I've been sailing downwind when it came to technical things.  Sure, I'd mess around with &lt;a href="http://webjazz.blogspot.com/2009/02/introducing-frock-flocking-chicken.html"&gt;chickens flocking&lt;/a&gt; (which embarrassingly, I haven't gotten back to), but for the most part, I was consumed by work.  Getting the tickets done and getting better at communicating with other team members.  &lt;/p&gt;  &lt;p&gt;However, much of my creativity was sapped.  It was hard to fire up the editor afterwards and explore something new.  I have a whole list of things I wanted to dive into more deeply.  Haskell's type system.  Erlang servers.  Spatial trees for Frock.  Arc language.  Potion language.  Prof Strang's Linear Algebra lectures.  Visualizations and info graphics.  Mobile web apps.  3D printers.  And though I've dabbled in all of the above, it's not yet been enough to satiate my cravings.  &lt;/p&gt;  &lt;p&gt;But I have learned that it's also a lesson in keeping things small and simple at first.  Much kudos to those working a full time job and are able to get a side project up and running.&lt;/p&gt;  &lt;p&gt;This blog also suffered as a result.  I was afraid that the things I was learning outside of code might reveal too much about the internals of the startup I was with, so I just left nothing to chance.  I simply fell out of the habit of blogging about what I've learned, and as a result I feel like my writing skills have deteriorated.  &lt;/p&gt;  &lt;p&gt;But now I've left the startup, moved to Mountain View, and I'm pursuing my own once again.  It's not a secret what I'm working on, but I'd just rather talk about it in a separate post.  I've also started exploring other technical topics as well, as I hinted in the last post about Potion.  I'll start finishing up the backlogged technical posts.&lt;/p&gt;  &lt;p&gt;So for those of you that still are subscribed, well, thanks for your faith.  I'll be writing more, and I hope you'll be able to learn something from reading this blog as well.  Have a great holiday!&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com/"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/on-to-the-new-old-thing"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-2706426550816268857?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=tDpYnd6qv8g:2JnPGKnvyWY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=tDpYnd6qv8g:2JnPGKnvyWY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=tDpYnd6qv8g:2JnPGKnvyWY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=tDpYnd6qv8g:2JnPGKnvyWY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/tDpYnd6qv8g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/2706426550816268857/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/12/on-to-new-old-thing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2706426550816268857?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2706426550816268857?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/tDpYnd6qv8g/on-to-new-old-thing.html" title="On to the new old thing" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/12/on-to-new-old-thing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DRnk-fSp7ImA9WxBSEkk.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8152602516149818974</id><published>2009-12-19T11:10:00.001-08:00</published><updated>2009-12-19T11:11:17.755-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-19T11:11:17.755-08:00</app:edited><title>Playing with potion</title><content type="html">&lt;p&gt;For fun this morning, I cloned _why's potion and started going through the tutorial.  After cloning it, I was able to compile it on my mac, and then I tried to run:&lt;/p&gt;  &lt;p&gt;  &lt;/p&gt;&lt;div&gt;"hello world" print&lt;/div&gt;  &lt;p&gt;  &lt;/p&gt;&lt;div&gt;and it seg faulted.  Boo.  So in case any of you are looking for a work around, this worked:&lt;/div&gt;  &lt;p&gt;  &lt;/p&gt;&lt;div&gt;&lt;span style=""&gt;&lt;a class="git_url_facebox" rel="#git-clone" color="#4183c4" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em;  text-decoration: underline;"&gt;&lt;div class="data syntax type-"&gt;  &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;  &lt;pre class="line_numbers"&gt;   &lt;/pre&gt; &lt;/td&gt; &lt;td width="100%"&gt;  &lt;div class="highlight"&gt;&lt;pre&gt;&lt;div class="line" id="LC1"&gt;1 times:&lt;/div&gt;&lt;div class="line" id="LC2"&gt;  "hello world!\n" print&lt;/div&gt;&lt;div class="line" id="LC3"&gt;.&lt;/div&gt;&lt;div class="line" id="LC4"&gt; &lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;/div&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;  &lt;/p&gt;&lt;div&gt;And looking through the source, I found the about function's easter eggs.  Humorous.&lt;/div&gt;  &lt;p&gt;  &lt;/p&gt;&lt;div&gt;&lt;div class="data syntax type-"&gt;  &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;  &lt;pre class="line_numbers"&gt;   &lt;/pre&gt; &lt;/td&gt; &lt;td width="100%"&gt;  &lt;div class="highlight"&gt;&lt;pre&gt;&lt;div class="line" id="LC1"&gt;1 times:&lt;/div&gt;&lt;div class="line" id="LC2"&gt;  about("_why") print&lt;/div&gt;&lt;div class="line" id="LC3"&gt;  about("stage fright) print&lt;/div&gt;&lt;div class="line" id="LC4"&gt;.&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;/div&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com/"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/playing-with-potion"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8152602516149818974?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ErDdnUYhIcM:pXfmsB45ClU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ErDdnUYhIcM:pXfmsB45ClU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ErDdnUYhIcM:pXfmsB45ClU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=ErDdnUYhIcM:pXfmsB45ClU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/ErDdnUYhIcM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8152602516149818974/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/12/playing-with-potion_19.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8152602516149818974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8152602516149818974?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/ErDdnUYhIcM/playing-with-potion_19.html" title="Playing with potion" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/12/playing-with-potion_19.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQn08eSp7ImA9WxNbEUs.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8638549116906178480</id><published>2009-11-13T17:33:00.001-08:00</published><updated>2009-11-13T17:33:23.371-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T17:33:23.371-08:00</app:edited><title>jQuery live events can only bind once</title><content type="html">
&lt;div style="font-family: Trebuchet MS, Verdana, Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px;"&gt;&lt;div&gt;I&amp;#39;ve been doing some more javascript on the side as of late, and I ran into a snag with jQuery.  It was an odd case of live events that didn&amp;#39;t seem to be taking hold.  In addition, it only looked like it was happening on Chrome.  As always, it helps to read the docs.&lt;/div&gt; &lt;div&gt; &lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"&gt; Unlike .bind(), only a single event can be bound in each call to the .live() method.&lt;/blockquote&gt;&lt;div&gt;&lt;a href="http://docs.jquery.com/Events/live#typefn"&gt;http://docs.jquery.com/Events/live#typefn&lt;/a&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt; That means that my overlapping live binding were getting overwritten, and that Firefox and Chrome were merely adding the events in different orders.  If it&amp;#39;s not apparently in the docs, start looking in the code.  As an aside, I&amp;#39;ve heard that the JQuery code is a good example of great javascript code.  I don&amp;#39;t understand a lot of what I saw.  Well, tip.  Been working on some other things on the side, and will reveal them in due time.&lt;/div&gt; &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/jquery-live-events-can-only-bind-once"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8638549116906178480?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=aZZl17MnaBU:Vz8xIG9PD_8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=aZZl17MnaBU:Vz8xIG9PD_8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=aZZl17MnaBU:Vz8xIG9PD_8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=aZZl17MnaBU:Vz8xIG9PD_8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/aZZl17MnaBU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8638549116906178480/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/11/jquery-live-events-can-only-bind-once.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8638549116906178480?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8638549116906178480?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/aZZl17MnaBU/jquery-live-events-can-only-bind-once.html" title="jQuery live events can only bind once" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/11/jquery-live-events-can-only-bind-once.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMRH08eip7ImA9WxNUE0g.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-4405495521877132495</id><published>2009-11-04T08:04:00.001-08:00</published><updated>2009-11-04T08:04:45.372-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-04T08:04:45.372-08:00</app:edited><title>Tarsnap docs as an example of confusing typography</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt; &lt;blockquote&gt;&lt;div&gt;  &lt;p&gt;  	Because in 1960, the Bureau International des Poids et Mesures  	decided that the SI prefix G- meant 10^9.  &lt;/p&gt;  &lt;h4&gt;But it means 2^30, really!&lt;/h4&gt;  &lt;p&gt;  	No it doesn't.  Let's look at some examples:  &lt;/p&gt;  &lt;/div&gt;&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.tarsnap.com/GB-why.html"&gt;tarsnap.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;  Just a quick thought.  It's pretty basic, but this was the first time I had a front-row seat demonstration of basic design principles and why they're suggested.  &lt;/p&gt;  &lt;p&gt;You can't really see it in the quotes, but if you follow the link, you'll see that the headings and text are the same size.  Not only that, but the spacing between paragraphs is the same between headings and paragraphs.    &lt;/p&gt;  &lt;p&gt;That confused me and I had thought that the bolded statements was part of the text, and hence it was something the author was saying, rather than as intentioned, something we are readers would be saying as headings of different sections.  &lt;/p&gt;  &lt;p&gt;  We differentiate importance and grouping by weight, size, color, and spacing.  It takes a combination of these to discern what we're reading.  &lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/tarsnap-docs-as-an-example-of-confusing-typog"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-4405495521877132495?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=1jIZP2L4Xh0:djIlRhSjvY8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=1jIZP2L4Xh0:djIlRhSjvY8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=1jIZP2L4Xh0:djIlRhSjvY8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=1jIZP2L4Xh0:djIlRhSjvY8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/1jIZP2L4Xh0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/4405495521877132495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/11/tarsnap-docs-as-example-of-confusing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/4405495521877132495?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/4405495521877132495?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/1jIZP2L4Xh0/tarsnap-docs-as-example-of-confusing.html" title="Tarsnap docs as an example of confusing typography" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/11/tarsnap-docs-as-example-of-confusing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUENQHs7eip7ImA9WxNVGEs.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8743529731255411754</id><published>2009-10-29T18:54:00.001-07:00</published><updated>2009-10-29T18:54:51.502-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T18:54:51.502-07:00</app:edited><title>You probably don't need an OLAP</title><content type="html">
It&amp;#39;s a &amp;quot;well known&amp;quot; that relational databases are bad at multi-column &amp;quot;slice and dice&amp;quot; calculations.  So when you have data that you&amp;#39;d like to represent as an aggregated trend, it&amp;#39;s easy to reach for that OLAP.  Chances are, you don&amp;#39;t need it.  Here&amp;#39;s an example of something where you want a count of the number of comments from an author by day.&lt;p /&gt; &lt;blockquote class="posterous_short_quote"&gt;select DATE(created_at) as DateOnly, count(*) &lt;br /&gt;from comments &lt;br /&gt;where author_id = 877081418 &lt;br /&gt;group by DateOnly&lt;br /&gt; order by DateOnly&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;The trick here is the DATE() function provided by various database vendors.  This returns any datetime as simply a date that can be aggregated.  &lt;p /&gt; &lt;/div&gt;&lt;div&gt;To be honest, I looked into this way too late and didn&amp;#39;t contest the OLAP architectural decision until it was late.  We ended up having the legacy of dragging a big fat OLAP with all its trappings of complicating our architecture.  If you end up with a complex architecture, there&amp;#39;s probably a simpler way you&amp;#39;re not seeing.  The simpler your setup, the easier it will be for you to hold it all in your head and understand it when things go wrong.  &lt;/div&gt; &lt;p /&gt;&lt;div&gt;The only OLAPs we&amp;#39;ve found to be available was the open source Mondrian and Microsoft&amp;#39;s Analysis Services.  To be honest, I found both to be way harder to use than it should have been.  If someone else wants to write another OLAP that&amp;#39;s simpler to use without a lot of luggage to blow those two out of the water, the time is nigh.&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/you-probably-dont-need-an-olap"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8743529731255411754?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=7vIS_Wrqw6s:86rR9gt1L5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=7vIS_Wrqw6s:86rR9gt1L5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=7vIS_Wrqw6s:86rR9gt1L5w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=7vIS_Wrqw6s:86rR9gt1L5w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/7vIS_Wrqw6s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8743529731255411754/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/10/you-probably-don-need-olap.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8743529731255411754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8743529731255411754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/7vIS_Wrqw6s/you-probably-don-need-olap.html" title="You probably don&amp;#39;t need an OLAP" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/10/you-probably-don-need-olap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FQ3g4fSp7ImA9WxNWEEk.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-5973931079586415733</id><published>2009-10-08T16:35:00.001-07:00</published><updated>2009-10-08T16:35:12.635-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T16:35:12.635-07:00</app:edited><title>Scope in JavaScript is just from which door you entered</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt;  &lt;blockquote class="posterous_long_quote"&gt;Put simply, we &lt;em&gt;entered&lt;/em&gt; &lt;code&gt;BigComputer&lt;/code&gt; via &lt;code&gt;new&lt;/code&gt;, so &lt;code&gt;this&lt;/code&gt; meant &amp;ldquo;the new object.&amp;rdquo;  On the other hand, we &lt;em&gt;entered&lt;/em&gt; &lt;code&gt;the_question&lt;/code&gt; via &lt;code&gt;deep_thought&lt;/code&gt;, so while we&amp;rsquo;re executing that method, &lt;code&gt;this&lt;/code&gt; means &amp;ldquo;whatever &lt;code&gt;deep_thought&lt;/code&gt; refers to&amp;rdquo;.  &lt;code&gt;this&lt;/code&gt; is not read from the scope chain as other variables are, but instead is &lt;em&gt;reset&lt;/em&gt; on a context by context basis.&lt;/blockquote&gt;  &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.digital-web.com/articles/scope_in_javascript/"&gt;digital-web.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;a href="http://www.digital-web.com/articles/scope_in_javascript/"&gt;Javascript's scoping&lt;/a&gt; has been one of most confusing things about it, just as Ruby's metaclass and object model is the most confusing things about it.  If you're looking to expand the horizon of what you understand about programming languages, it's worth it to figure out javascript scoping.&lt;/p&gt;  &lt;p&gt;The paragraph gave a good way to think about it:&amp;nbsp; &lt;em&gt;this&lt;/em&gt; changes based on the object that calls the method.&amp;nbsp; It only gets confusing when you start passing around functions and using callbacks, which is most of the power of functional programming.&lt;/p&gt;  &lt;p&gt;As an example, here, I was using an anonymous function as a callback in the request() method.&amp;nbsp; But it doesn't work!&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/205509.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;So that's just one way to solve it.&amp;nbsp; If you're using &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, you can also try using the &lt;a href="http://www.prototypejs.org/api/function/bind"&gt;bind() method&lt;/a&gt;.&amp;nbsp; jQuery doesn't have an equivalent bind method, as hard as I looked for it at one time.&amp;nbsp; I was just about to write it myself (as it's not too hard), but according to the a list apart article on &lt;a href="http://www.alistapart.com/articles/getoutbindingsituations/"&gt;Getting out of binding situations in javascript&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;  &lt;p&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; does not provide such a binding facility. The library&amp;rsquo;s philosophy favors closures over binding and forces users to jump through hoops (that is, manually combine lexical closures and &lt;code&gt;apply&lt;/code&gt; or &lt;code&gt;call&lt;/code&gt;, much as other libraries do internally) when they actually need to pass along a piece of code referring to &amp;ldquo;instance members.&amp;rdquo;&lt;/p&gt;  &lt;/blockquote&gt;  &lt;p&gt;So while I use closures extensively in Ruby, I haven't had to explicitly think about the scope until I was using &lt;a href="http://www.jibbering.com/faq/faq_notes/closures.html"&gt;closures in Javascript&lt;/a&gt;.&amp;nbsp; Huzzah.&amp;nbsp; Hopefully, it'll prompt you to take a deeper look at Javascript.&lt;/p&gt;  &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/scope-in-javascript"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-5973931079586415733?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=yiGGowjE128:asn5z4hdXfI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=yiGGowjE128:asn5z4hdXfI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=yiGGowjE128:asn5z4hdXfI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=yiGGowjE128:asn5z4hdXfI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/yiGGowjE128" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/5973931079586415733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/10/scope-in-javascript-is-just-from-which.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5973931079586415733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5973931079586415733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/yiGGowjE128/scope-in-javascript-is-just-from-which.html" title="Scope in JavaScript is just from which door you entered" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/10/scope-in-javascript-is-just-from-which.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8NQHw4eip7ImA9WxNXGU4.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-7499235652340532991</id><published>2009-10-07T08:54:00.001-07:00</published><updated>2009-10-07T08:54:51.232-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-07T08:54:51.232-07:00</app:edited><title>Concurrency and integrity with validates_uniqueness_of</title><content type="html">
Here&amp;#39;s another tidbit that I hadn&amp;#39;t noticed in the rails docs before.  I was looking at &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002167"&gt;validations for uniqueness&lt;/a&gt; and I saw this:&lt;p /&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"&gt; Using this validation method in conjunction with &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002329"&gt;ActiveRecord::Base#save&lt;/a&gt; does not guarantee the absence of duplicate record insertions, because uniqueness checks on the application level are inherently prone to race conditions.&lt;/blockquote&gt;&lt;p /&gt;&lt;div&gt;And the docs also offer some solutions:&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;blockquote class="posterous_short_quote"&gt; This could even happen if you use transactions with the ‘serializable’ isolation level. There are several ways to get around this problem:  &lt;/blockquote&gt;&lt;blockquote class="posterous_short_quote"&gt;  &lt;/blockquote&gt;&lt;blockquote class="posterous_short_quote"&gt; By locking the database table before validating, and unlocking it after saving. However, table locking is very expensive, and thus not recommended.   &lt;/blockquote&gt;&lt;blockquote class="posterous_short_quote"&gt;  &lt;/blockquote&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"&gt; By locking a lock file before validating, and unlocking it after saving. This does not work if you‘ve scaled your &lt;a href="http://api.rubyonrails.org/classes/Rails.html"&gt;Rails&lt;/a&gt; application across multiple web servers (because they cannot share lock files, or cannot do that efficiently), and thus not recommended. &lt;/blockquote&gt;&lt;blockquote class="posterous_short_quote"&gt;  &lt;/blockquote&gt;&lt;blockquote class="posterous_medium_quote"&gt; Creating a unique index on the field, by using ActiveRecord::ConnectionAdapters::SchemaStatements#add_index. In the rare case that a race condition occurs, the database will guarantee the field‘s uniqueness.&lt;/blockquote&gt;&lt;p /&gt;&lt;div&gt;This typically isn&amp;#39;t something you&amp;#39;d need to worry about until you get to some traffic of scale and size.  So don&amp;#39;t worry about it too much until you get there, but be aware of the problem.  Read the docs for more details and information.  tip! &lt;/div&gt; &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/concurrency-and-integrity-with-validatesuniqu"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-7499235652340532991?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=T9xAb58fRe0:x0KjivYzewY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=T9xAb58fRe0:x0KjivYzewY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=T9xAb58fRe0:x0KjivYzewY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=T9xAb58fRe0:x0KjivYzewY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/T9xAb58fRe0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/7499235652340532991/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/10/concurrency-and-integrity-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7499235652340532991?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7499235652340532991?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/T9xAb58fRe0/concurrency-and-integrity-with.html" title="Concurrency and integrity with validates_uniqueness_of" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/10/concurrency-and-integrity-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEBQX06cCp7ImA9WxNXGEg.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-4870715572289015947</id><published>2009-10-06T12:50:00.001-07:00</published><updated>2009-10-06T12:50:50.318-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-06T12:50:50.318-07:00</app:edited><title>Amazon S3 and Paperclip plugin</title><content type="html">
Even after reading all the documentation, &lt;a href="http://github.com/thoughtbot/paperclip"&gt;paperclip&lt;/a&gt; still has its quirks.  I&amp;#39;ve been pretty busy, but here&amp;#39;s a short tip to tide you over.  When using paperclip with &lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt;, make sure that you &lt;a href="http://github.com/thoughtbot/paperclip/issues/labels/s3#issue/13"&gt;have the :path option set&lt;/a&gt; when using has_attached_file.  &lt;p /&gt;&lt;div&gt;It didn&amp;#39;t take too long to figure out, but just in case, make sure bucket option is set either in the has_attached_file declaration or your s3 config file pointed to by :s3_credentials option.  Otherwise, you&amp;#39;ll get a mysterious &lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&amp;quot;&lt;span style=""&gt;MethodNotAllowed: The specified method is not allowed against this resource.&amp;quot; Error.&lt;/span&gt;&lt;/blockquote&gt; &lt;span style=""&gt;&lt;/span&gt;&lt;p /&gt;&lt;div&gt;So head on over to &lt;a href="http://scottmotte.com/archives/181.html"&gt;Scott Mottes and learn it step by step&lt;/a&gt;.  tip.&lt;/div&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/amazon-s3-and-paperclip-plugin"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-4870715572289015947?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ILModYWcI3g:vtvWy5rtgDQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ILModYWcI3g:vtvWy5rtgDQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ILModYWcI3g:vtvWy5rtgDQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=ILModYWcI3g:vtvWy5rtgDQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/ILModYWcI3g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/4870715572289015947/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/10/amazon-s3-and-paperclip-plugin.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/4870715572289015947?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/4870715572289015947?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/ILModYWcI3g/amazon-s3-and-paperclip-plugin.html" title="Amazon S3 and Paperclip plugin" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/10/amazon-s3-and-paperclip-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4ESH88fSp7ImA9WxNQFk8.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-5622035031480359591</id><published>2009-09-22T06:41:00.001-07:00</published><updated>2009-09-22T06:41:49.175-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T06:41:49.175-07:00</app:edited><title>If only</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt;  &lt;blockquote&gt;  &lt;div&gt;  &lt;p&gt;&lt;strong&gt;"If only I had ____ I would succeed."&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt; &lt;/strong&gt;These simple words will kill your dreams faster than anything else you could say or think. There are so many self-defeating thoughts that an entrepreneur can have, and they often take this very simple form.&lt;/p&gt;  &lt;div&gt;  &lt;div&gt;&lt;span&gt;Posted &lt;a href="http://garry.posterous.com/build-it-9"&gt; 3 hours ago&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;  &lt;/div&gt;  &lt;a name="comment"&gt;&lt;/a&gt;&lt;/div&gt;  &lt;/blockquote&gt;  &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://garry.posterous.com/build-it-9"&gt;garry.posterous.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;While Garry takes it in the direction of getting your hands dirty and building, and the &lt;a href="http://news.ycombinator.com/item?id=834717"&gt;recent HN discussion&lt;/a&gt; talking about whether one should sell or not, reading these compels me to take it in a different direction this morning before work--I'd like to speak a little about mental blocks.&lt;/p&gt;  &lt;p&gt;There were many reasons why you'd want to sell your company.&amp;nbsp; Your business deals with fads and the market will go away.&amp;nbsp; You're done with this thing and want to move on.&amp;nbsp; But there is a bad reason I want to focus on:&amp;nbsp; "it'll give me freedom to do what I want".&amp;nbsp; I think when people say this, they mean two different things: 1) if I have lots of money to take care of life's annoyances like bills and college tuition, then my mind will be free to work on anything 2) if I have lots of money, I can fund whatever I want to work on.&amp;nbsp; The latter, I find to be an unconvincing reason.&lt;/p&gt;  &lt;p&gt;My dad is retired. He talks about starting a foundation to help education in Taiwan, and seems rather passionate about it.&amp;nbsp; He spends a lot of time watching and reading Taiwanese news.&amp;nbsp; Given a chance, he'll talk your ear off about it.&amp;nbsp; However, he says, "if only I had a million dollars", he could start his foundation.&amp;nbsp; And the way he usually thinks of getting the million dollars is through the lotto.&amp;nbsp; Now, my dad is no fool.&amp;nbsp; He knows the odds.&amp;nbsp; And I don't know if it's a generation gap in the way jokes are told, but if he's serious, it's a mental block that I see in some friends also.&amp;nbsp; It's an excuse to do nothing because of the preceived notion that the external world hasn't given you permission.&lt;/p&gt;  &lt;p&gt;By contrast, a couple years back Oprah had some special on TV about a new school she was building in South Africa.&amp;nbsp; Though she put in a hefty sum, I was surprised to find out that she didn't put in all the money herself.&amp;nbsp; She had other people help her with donations.&amp;nbsp; That's why she had Nelson Mendela, Maria Carey, and others visit the school--to help donate.&amp;nbsp; Even when she could pay for it all herself, she enlisted other people to help. In a more recent example, &lt;a href="http://breadpig.com/blog/2009/09/08/xkcd-book-tour-announced/"&gt;Breadpig and xkcd joined forces to put a school in Laos&lt;/a&gt;.&amp;nbsp; They're putting in the work, yes, but as far as I can tell, it's none of their personal money.&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Just because something takes a million dollars to do, doesn't mean it has to be your million.&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Perhaps this is obvious to some of you, but I was a little bit surprised when I realized this.&amp;nbsp; Growing up, I never thought about it too much, because in movies like Batman, Bruce Wayne funded his own crazy toys.&amp;nbsp; So I naturally assumed that if you want to do huge things, you do it all with your own money. As a kid, I thought:&amp;nbsp; If I wanted to build a Mechwarrior, I'd have to do it with my own money.&amp;nbsp; If I wanted to build a loop-de-loop highway, I'd have to do it with my own money.&amp;nbsp; If I wanted to build a giant chicken slingshot, I'd have to do with with my own money.&lt;/p&gt;  &lt;p&gt;Of course, this comes with some amount of responsibility and constraint.&amp;nbsp; Pissing away other peoples' millions is a sure way to get your legs broken, especially with money from a loan shark (or its million dollar equivalent).&amp;nbsp; But I believe constraint in business and philantropy, as constraint in design, is a good thing to focus your efforts.&amp;nbsp; Sometimes, personal money projects fail because they're not as readily subjected to market forces.&amp;nbsp; A bad idea is kept afloat because there's a huge chunk of personal money that keeps getting dumped into it.&lt;/p&gt;  &lt;p&gt;In the end, I just want to say, you have a choice.&amp;nbsp; Don't let a little thing like not having a couple million stop you from doing what you want to do, as there's always more than one way to skin a cat.&amp;nbsp; But if you want to build a pyramid for your burial site, then yes, please do that with your own money.&lt;/p&gt;  &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/build-it-garrys-posterous-0"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-5622035031480359591?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=zZkintp7c6M:PAZtp6fI9iI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=zZkintp7c6M:PAZtp6fI9iI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=zZkintp7c6M:PAZtp6fI9iI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=zZkintp7c6M:PAZtp6fI9iI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/zZkintp7c6M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/5622035031480359591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/if-only.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5622035031480359591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5622035031480359591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/zZkintp7c6M/if-only.html" title="If only" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/if-only.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08MQ3Y5eCp7ImA9WxNRGEg.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-1340409780685719122</id><published>2009-09-13T07:24:00.001-07:00</published><updated>2009-09-13T07:24:42.820-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-13T07:24:42.820-07:00</app:edited><title>rake task with arguments - Ruby Forum</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt; &lt;blockquote class="posterous_long_quote"&gt;Of course csh is evil!  That's nothing new.  &lt;a href="http://ooblick.com/text/CshProgrammingConsideredHarmful.html" rel="nofollow"&gt;http://ooblick.com/text/CshProgrammingConsideredHarmful.html&lt;/a&gt;    This works just fine with bash:  &lt;pre&gt;rab://tmp $ cat Rakefile  namespace :foo do  desc 'lol'  task :bar, :num do |t, args|  puts "num = #{args.num}"  end  end  rab://tmp $ rake foo:bar[123]  (in /private/tmp)  num = 123  &lt;/pre&gt;  &lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.ruby-forum.com/topic/143930"&gt;ruby-forum.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;  Hey look.  Arguments in Rake.  I've been looking for this for a while now.  No more using env variables.  &lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/rake-task-with-arguments-ruby-forum"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-1340409780685719122?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=q0yH9Eh7V9U:ommeE2Xwork:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=q0yH9Eh7V9U:ommeE2Xwork:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=q0yH9Eh7V9U:ommeE2Xwork:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=q0yH9Eh7V9U:ommeE2Xwork:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/q0yH9Eh7V9U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/1340409780685719122/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/rake-task-with-arguments-ruby-forum.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/1340409780685719122?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/1340409780685719122?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/q0yH9Eh7V9U/rake-task-with-arguments-ruby-forum.html" title="rake task with arguments - Ruby Forum" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/rake-task-with-arguments-ruby-forum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MSH4zfip7ImA9WxNRF0s.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-3719541829480369645</id><published>2009-09-12T07:33:00.001-07:00</published><updated>2009-09-12T07:33:09.086-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-12T07:33:09.086-07:00</app:edited><title>Another bad data visualization</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt;  &lt;blockquote class="posterous_long_quote"&gt;  &lt;p style="text-align: center;"&gt;(click image to enlarge)&lt;/p&gt;  &lt;p style="text-align: center;"&gt;&lt;a href="http://www.permuto.com/blog/wp-content/uploads/2009/09/PER-GOOGLE2.png" rel="lightbox[118]"&gt;&lt;img title="PER-GOOGLE" class="size-full wp-image-117 aligncenter" src="http://www.permuto.com/blog/wp-content/uploads/2009/09/PER-GOOGLE.png" height="598" alt="PER-GOOGLE" width="499" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;/blockquote&gt;  &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.permuto.com/blog/2009/09/10/who-is-lining-googles-pockets-today/"&gt;permuto.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;This is one of the worst data visualizations I've seen.&amp;nbsp; Problem is it looks pretty, so people send it around, but it's not very informational.&amp;nbsp; Nor does it allow easy comparison of the data.&amp;nbsp; First, it's not apparent that the light green and the dark green sections are the same thing until you realize it's an "O" from "Google", and actually adds no information.&amp;nbsp;&amp;nbsp;Second, what do the size of the circles represent?&amp;nbsp; Is it combined daily spending or average daily spending per advertiser?&amp;nbsp; It takes a while to find the circumferencial text, which you'd guess that it represents the amount of revenue from top N advertisers.&amp;nbsp; Then the chart also mixes terminology.&amp;nbsp; While spending by advertiser and revenue by google are the same thing, you need to do extra work to figure that out.&amp;nbsp; Then, what the heck, the list of logos on the side is distracting.&amp;nbsp; It's suppose to be the advertisers in the blue circle--the top 10 advertisers--but it sits firmly in the red section, which is the long tail of advertisers.&amp;nbsp; Even more confusing, the $59,184,783 is red, but points to the blue list of logos.&amp;nbsp; Lastly, the average daily spending is colored with the same position and weight as the combined daily spending, but it doesn't represent the size of the circles, which adds even more confusion.&lt;/p&gt;  &lt;p&gt;The only thing they did right was to match the size of the circles with the amount of combined daily spending.&amp;nbsp; Often times, people will draw these sorts of graphs using the diameter as the basis for comparison, which is misleading.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/permuto-blog-who-is-lining-googles-pockets-to"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-3719541829480369645?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=m6Rupt_16Ms:U2pDiGJFoIs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=m6Rupt_16Ms:U2pDiGJFoIs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=m6Rupt_16Ms:U2pDiGJFoIs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=m6Rupt_16Ms:U2pDiGJFoIs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/m6Rupt_16Ms" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/3719541829480369645/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/another-bad-data-visualization.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3719541829480369645?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3719541829480369645?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/m6Rupt_16Ms/another-bad-data-visualization.html" title="Another bad data visualization" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/another-bad-data-visualization.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEMR3o_eip7ImA9WxNRFEg.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-7213251527170133797</id><published>2009-09-08T17:38:00.001-07:00</published><updated>2009-09-08T17:38:06.442-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T17:38:06.442-07:00</app:edited><title>Using HTML attributes as a mini-DSL for AJAX</title><content type="html">
&lt;p&gt;At first, I thought being able to return json as responses from the server was pretty neat, with rjs (now js.erb) files using render :update call in Rails. &amp;nbsp;However, this often lead to some messy code by me and my colleagues. &amp;nbsp;I would see lots of client side code in the application controller like:&lt;/p&gt;  &lt;p /&gt;  &lt;div&gt;&lt;script src="http://gist.github.com/182052.js"&gt;&lt;/script&gt;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;Sometimes, this is ok, but when html elements change, the controller methods break, and the effect cascades from the views through the controllers. &amp;nbsp;That's a code smell that our code is tightly coupled. &amp;nbsp;Of course, we can refactor it to a separate .rjs template file, and justify it to ourselves that it's the same as having an .html.erb file. &amp;nbsp;However, because .rjs files are often so short, the cognitive shift to find that other file is often distracting, and it still doesn't solve the problem of code coupling.&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;Consider the following: &amp;nbsp;You want to have a link that makes an AJAX GET request to get a list of comments for the post when clicked. &amp;nbsp;It gets the response as HTML and then dumps it in the target DOM. &amp;nbsp;You also want to fade in an&amp;nbsp;indicator feedback when the ajax is loading and fade it out when it's finished loading. &amp;nbsp;Lastly, there's to be a slidedown effect on the target comments DOM element. &amp;nbsp;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;For the situation above, if we were to do it with render :update or with rjs files, you'd have code that is coupled with DOM elements as I said earlier. &amp;nbsp;What if we can contain it all on the client side, and leave the server side for business logic?&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;One way is to use all the options that link_to_remote provides. &amp;nbsp;This way, all the UI effects are contained on the client side when you have an AJAX GET request. &amp;nbsp;We can now keep all our UI effects code in the views. &amp;nbsp;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;  &lt;div&gt;&lt;script src="http://gist.github.com/182100.js"&gt;&lt;/script&gt;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;However, what if we can declare this effect in HTML? &amp;nbsp;Would that work? &amp;nbsp;What are the advantages and disadvantages?&lt;/div&gt;  &lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;I went to the local Ruby meetup, and remembered that &lt;a href="http://www.binarylogic.com/"&gt;Ben Johnson&lt;/a&gt;&amp;nbsp;of &lt;a href="http://github.com/binarylogic/authlogic/tree/master"&gt;Authlogic&lt;/a&gt; was mentioning something about "data-" attributes in HTML5 and its relation to the problem I described above. &amp;nbsp;I wasn't entirely sure what he was talking about, until I looked around for the "data- attribute" and found&lt;a href="http://ejohn.org/blog/html-5-data-attributes/"&gt; good ole Resig blogging about it&lt;/a&gt; (last year, no less). &amp;nbsp;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;What this allows us to do is basically insert data into our HTML elements. &amp;nbsp;And because jQuery events let us separate the "how" in javascript from the "what" in html, we can declaratively use it as a mini-DSL of sorts. &amp;nbsp;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;&lt;script src="http://gist.github.com/182109.js"&gt;&lt;/script&gt;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;The basics are pretty easy to implement. &amp;nbsp;I didn't do the data-indicator and the data-effect because I'm lazy and it's left to the reader "as an exercise".&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;&lt;script src="http://gist.github.com/182128.js"&gt;&lt;/script&gt;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;Note that I'm proposing it to be a mini-DSL, so that very common AJAX idioms are covered, and you can simply declare things in HTML and not have to go into the javascript often, if at all. &amp;nbsp;That way, you keep working in the same file, working on the same level of abstraction.&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;There are some advantages to doing it this way. &amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;ol&gt;  &lt;li&gt;Server response can be faster, since we wouldn't have to rely on the server to generate the proper html link. &amp;nbsp;The UI effects and behavior can be all done on the client side, where it should be.&lt;/li&gt;  &lt;li&gt;I think it's a bit cleaner to be able to say things declaratively, more aligned with how html is declarative.&lt;/li&gt;  &lt;li&gt;The DOM elements wouldn't couple the controller and the view. &amp;nbsp;Everything that refers to DOM elements would be in the view and be easier to change without cascading effects.&lt;/li&gt;  &lt;li&gt;You can work in the same level of abstraction while in the HTML views and won't have to jump between layers of abstraction.&lt;/li&gt;  &lt;/ol&gt;&lt;/div&gt;  &lt;div&gt;There are few disadvantages I can see right now, other than not having the correct DSL, or having a method call that uses too many attributes, making the HTML hard to read. &amp;nbsp;(If you have others, comment below)&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;Pretty neat. &amp;nbsp;So why use the class attribute as the method "call"? &amp;nbsp;Perhaps it's better to find some other attribute. &amp;nbsp;I've seen &lt;a href="http://famspam.com/facebox"&gt;facebox&lt;/a&gt; use the &lt;a href="http://microformats.org/wiki/rel-faq#How_is_rel_used"&gt;rel attribute&lt;/a&gt; instead. &amp;nbsp;That lead me wonder if other people have thought to do this before. &amp;nbsp;And of course, there's something similar called &lt;a href="http://microformats.org/wiki/rest/ahah"&gt;AHAH microformat&lt;/a&gt;, based on JAH from 2005, which is &lt;a href="http://homepage.mac.com/kevinmarks/staticjah.html"&gt;demoed here&lt;/a&gt;. &amp;nbsp;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;JAH does something notable, in that it uses the form:&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;&lt;script src="http://gist.github.com/182156.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;to order to execute the javascript, instead of binding an event to the DOM. &amp;nbsp;This removes the extraneous href="#" in the other way I showed you above (more succinct), but it breaks the declarative nature, and cannot be unbound and binded with something else easily--one would have to change all instances it's called, instead of re-adjusting the DOM selector element (as rare as that may be). &amp;nbsp;I personally don't think it's as easy to read, especially when the method call has parameters, but the implementation would be shorter.&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;These techniques seem to be by no means widespread at the moment, but one of the contributors is DHH of the Rails fame&lt;span style="text-decoration: line-through;"&gt;, so I expect to see it in Rails soon. &amp;nbsp;So be on the lookout for something similar in the future Rails.&lt;/span&gt;&amp;nbsp; It seems like the technique was talked about back in 2005, but never fully incorporated or used.&amp;nbsp; I have no idea why.&amp;nbsp; In the mean time, I intend to incorporate it into new code I write.&lt;/div&gt;  &lt;p /&gt;  &lt;div&gt;(Apologies if there are typos above. &amp;nbsp;It's late, and I haven't had my ramen)&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/using-html-attributes-as-a-mini-dsl-for-ajax"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-7213251527170133797?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=hAQYagxF_Ig:1xYBZISrrGI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=hAQYagxF_Ig:1xYBZISrrGI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=hAQYagxF_Ig:1xYBZISrrGI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=hAQYagxF_Ig:1xYBZISrrGI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/hAQYagxF_Ig" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/7213251527170133797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/using-html-attributes-as-mini-dsl-for_08.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7213251527170133797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7213251527170133797?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/hAQYagxF_Ig/using-html-attributes-as-mini-dsl-for_08.html" title="Using HTML attributes as a mini-DSL for AJAX" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/using-html-attributes-as-mini-dsl-for_08.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8FSXY4eip7ImA9WxNRE0U.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8759947054618998014</id><published>2009-09-07T20:33:00.001-07:00</published><updated>2009-09-07T20:33:38.832-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-07T20:33:38.832-07:00</app:edited><title>Getting all attributes of a DOM element in Javascript/jQuery</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt;  &lt;p&gt;Sometimes, you need to iterate over a number of jQuery elements.  You pull something like this:&lt;/p&gt;  &lt;pre&gt;$.each($(".hello"), function() {&lt;br /&gt;  alert(this);&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;  In this context, the "this" variable is actually not the jQuery objects.  According to the docs:  &lt;blockquote class="posterous_short_quote"&gt;Whenever you use jQuery's each-method, the context of your callback is set to a DOM element. That is also the case for event handlers.&lt;/blockquote&gt;  &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://docs.jquery.com/Types#Element"&gt;docs.jquery.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;This is helpful when you want all the attributes of a particular DOM element.  You can call attributes property on the "this" variable (this.attributes) inside of the each() method to get all attributes of each element with the class hello.&lt;/p&gt;  &lt;p&gt;Lastly, if you have a jQuery element, you can get all attributes by:&lt;/p&gt;  &lt;pre&gt;$("#some_dom")[0].attributes&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/getting-all-attributes-of-a-dom-element-in-ja"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8759947054618998014?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=WvkvJPM1nNA:R9rorxvT4k4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=WvkvJPM1nNA:R9rorxvT4k4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=WvkvJPM1nNA:R9rorxvT4k4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=WvkvJPM1nNA:R9rorxvT4k4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/WvkvJPM1nNA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8759947054618998014/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/getting-all-attributes-of-dom-element_07.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8759947054618998014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8759947054618998014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/WvkvJPM1nNA/getting-all-attributes-of-dom-element_07.html" title="Getting all attributes of a DOM element in Javascript/jQuery" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/getting-all-attributes-of-dom-element_07.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcNRHk4eyp7ImA9WxNREEw.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8424747638231070337</id><published>2009-09-03T14:41:00.001-07:00</published><updated>2009-09-03T14:41:35.733-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-03T14:41:35.733-07:00</app:edited><title>Testing Named Routes in the Rails Console</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt; &lt;blockquote&gt;&lt;div&gt;  &lt;p&gt;I finally found out how to do this, from the &lt;a href="http://www.informit.com/store/product.aspx?isbn=0321509242"&gt;Rails Routing&lt;/a&gt; shortcut by David Black.  In the Rails console, do this:&lt;/p&gt;  &lt;pre&gt;include ActionController::UrlWriter  default_url_options[:host] = 'whatever'  &lt;/pre&gt;  &lt;p&gt;Then you can call your named route methods directly from the console.&lt;/p&gt;    				&lt;p&gt;  					&lt;small&gt;  This entry was posted on Tuesday, January 8th, 2008  at 1:58 pm and is filed under &lt;a href="http://stuartsierra.com/category/programming" title="View all posts in Programming" rel="category tag"&gt;Programming&lt;/a&gt;,  &lt;a href="http://stuartsierra.com/category/programming/ruby" title="View all posts in Ruby" rel="category tag"&gt;Ruby&lt;/a&gt;.You can follow any responses to this entry through the &lt;a href="http://stuartsierra.com/2008/01/08/testing-named-routes-in-the-rails-console/feed"&gt;RSS 2.0&lt;/a&gt; feed. You can &lt;a href="#respond"&gt;leave a response&lt;/a&gt;, or &lt;a href="http://stuartsierra.com/2008/01/08/testing-named-routes-in-the-rails-console/trackback" rel="trackback"&gt;trackback&lt;/a&gt; from your own site.   					&lt;/small&gt;  				&lt;/p&gt;  			&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://stuartsierra.com/2008/01/08/testing-named-routes-in-the-rails-console"&gt;stuartsierra.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;  I've always just worked around this by trying it out in the templates.  Should keep looking things up on google.  I learn much more that way.  Anyway, thought the rest of you should know also.  &lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/testing-named-routes-in-the-rails-console"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8424747638231070337?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_TdS_5CpXHU:jhLGOz3qmMI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_TdS_5CpXHU:jhLGOz3qmMI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_TdS_5CpXHU:jhLGOz3qmMI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=_TdS_5CpXHU:jhLGOz3qmMI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/_TdS_5CpXHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8424747638231070337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/testing-named-routes-in-rails-console.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8424747638231070337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8424747638231070337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/_TdS_5CpXHU/testing-named-routes-in-rails-console.html" title="Testing Named Routes in the Rails Console" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/testing-named-routes-in-rails-console.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYCSX86fSp7ImA9WxNSGUU.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-2600251753580046807</id><published>2009-09-03T05:16:00.001-07:00</published><updated>2009-09-03T05:16:08.115-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-03T05:16:08.115-07:00</app:edited><title>A tiny empty shortcut</title><content type="html">
I think I&amp;#39;ve written about this before, by monkeypatching an empty method on the Array class that takes a block and executes it only if the array is empty.  But anyway, for some of you, you might see something like this taking place often:&lt;p /&gt;&lt;div&gt;&lt;script src="http://gist.github.com/180264.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;To clean it up a little, you can do:&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;script src="http://gist.github.com/180267.js"&gt;&lt;/script&gt;&lt;/div&gt; &lt;p /&gt;&lt;div&gt;Or else if each of your items is a partial, use the :collection method.&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/a-tiny-empty-shortcut"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-2600251753580046807?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=4NL-nGzOT3c:ZsxGNcM8EVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=4NL-nGzOT3c:ZsxGNcM8EVA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=4NL-nGzOT3c:ZsxGNcM8EVA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=4NL-nGzOT3c:ZsxGNcM8EVA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/4NL-nGzOT3c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/2600251753580046807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/tiny-empty-shortcut.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2600251753580046807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2600251753580046807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/4NL-nGzOT3c/tiny-empty-shortcut.html" title="A tiny empty shortcut" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/tiny-empty-shortcut.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAGQXg9fCp7ImA9WxNSGU8.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-43896442474486002</id><published>2009-09-02T14:25:00.001-07:00</published><updated>2009-09-02T14:25:20.664-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-02T14:25:20.664-07:00</app:edited><title>Expected delayed_job.rb to define DelayedJob</title><content type="html">
Recently, I needed to do some background processing.  I just needed something simple, and looking at all various options, I decided to go with &lt;a href="http://github.com/sevenwire/bj-plugin/tree/master"&gt;Bj&lt;/a&gt;.  It was fairly simple to understand, and best of all, didn&amp;#39;t require another daemon to be running by hand--it started one itself if you didn&amp;#39;t configure it.  &lt;p /&gt;&lt;div&gt;However, it&amp;#39;s incompatible with SQLServer.  I&amp;#39;m guessing no one&amp;#39;s every used it with SQLServer before, since I didn&amp;#39;t read anything about it in my research.  Bj uses a column called &amp;quot;key&amp;quot; which SQLServer reserves as a future keyword, and thus, automatically changes the name of the column to &amp;quot;[key]&amp;quot;  So consider yourself forewarned.&lt;br /&gt; &lt;p /&gt;&lt;div&gt;Thus, I decided to switch to something similarly simple, and I started using &lt;a href="http://github.com/tobi/delayed_job/tree/master"&gt;Delayed Jobs&lt;/a&gt;.  It&amp;#39;s all fine, except in some instances, I ran into the following error:&lt;/div&gt; &lt;p /&gt;&lt;blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;&lt;div&gt;LoadError: Expected /[RAILS_ROOT]/vendor/plugins/delayed_job/lib/delayed_job.rb to define DelayedJob&lt;/div&gt; &lt;p /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;After reading around on the web for a while, it seemed like any number of things could cause this error.  I finally found way down in &lt;a href="http://dev.rubyonrails.org/ticket/7452"&gt;this rails ticket&lt;/a&gt; from a while back, had the lines that explained it.&lt;/div&gt; &lt;p /&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"&gt; The critical comment at that link is: &amp;quot;Prior to this revision, Rails would happily load files from Ruby’s standard lib via const_missing; you will now need to explicitly require such files.&amp;quot;&lt;/blockquote&gt;&lt;p /&gt;&lt;div&gt;The rest of the comments also talked about various causes.  It&amp;#39;s the case of different problems having the same symptom, and here, the backtrace isn&amp;#39;t pointing to where the problem is.  &lt;/div&gt; &lt;p /&gt;&lt;div&gt;In the case of Delayed Job, Rails expects delayed_job.rb to define a module or class named DelayedJob.  However, that plugin doesn&amp;#39;t have any such class or module.  It defined Delayed::Job instead.  So when loading up dependencies, It&amp;#39;s looking for DelayedJob module or class when there is none.  &lt;/div&gt; &lt;p /&gt;&lt;div&gt;A workaround is to simply define an empty DelayedJob module in your config/environment.rb file, or feel free to put it in a file under config/initializers if you don&amp;#39;t want to pollute your environments file.  Hopefully, that saves you some pain.  tip.&lt;/div&gt; &lt;p /&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://iamwil.posterous.com/expected-delayedjobrb-to-define-delayedjob"&gt;The Web and all that Jazz&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-43896442474486002?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nGmYo7cfzpU:o-TtT-ZsYOI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nGmYo7cfzpU:o-TtT-ZsYOI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nGmYo7cfzpU:o-TtT-ZsYOI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=nGmYo7cfzpU:o-TtT-ZsYOI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/nGmYo7cfzpU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/43896442474486002/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/09/expected-delayedjobrb-to-define.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/43896442474486002?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/43896442474486002?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/nGmYo7cfzpU/expected-delayedjobrb-to-define.html" title="Expected delayed_job.rb to define DelayedJob" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/09/expected-delayedjobrb-to-define.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQBQX46eCp7ImA9WxNTF00.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-542685186313234584</id><published>2009-08-19T11:56:00.000-07:00</published><updated>2009-08-19T11:59:10.010-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-19T11:59:10.010-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>Sending HTML emails with attachments in Rails</title><content type="html">&lt;p&gt;Here's something you might have missed in Rails.&lt;/p&gt;&lt;div&gt;From ActionMailer's Documentation:&lt;/div&gt;&lt;br /&gt;&lt;blockquote class="gmail_quote"  style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left- border-left-style: solid; padding-left: 1ex;color:#cccccc;"&gt;Implicit template rendering is not performed if any attachments or parts have been added to the email. This means that you‘ll have to manually add each part to the email and set the content type of the email to &lt;tt&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;multipart/alternative&lt;/span&gt;&lt;/tt&gt;. &lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;If you want to have pretty html templates and have an attached file, you can't just set the content_type to "text/html" and call attachment.  You need to do it separately, like so:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/170564.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;There, now you can have html and your attachments too.  Reference: &lt;a href="http://am.rubyonrails.org/classes/ActionMailer/PartContainer.html#M000006"&gt;http://am.rubyonrails.org/classes/ActionMailer/PartContainer.html#M000006&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-542685186313234584?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=TcAlO9yUIW0:2YCm8VSmEDQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=TcAlO9yUIW0:2YCm8VSmEDQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=TcAlO9yUIW0:2YCm8VSmEDQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=TcAlO9yUIW0:2YCm8VSmEDQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/TcAlO9yUIW0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/542685186313234584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/08/sending-html-emails-with-attachments-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/542685186313234584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/542685186313234584?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/TcAlO9yUIW0/sending-html-emails-with-attachments-in.html" title="Sending HTML emails with attachments in Rails" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/08/sending-html-emails-with-attachments-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHRX0zfSp7ImA9WxJUEkQ.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-2353658004992011943</id><published>2009-07-10T23:27:00.001-07:00</published><updated>2009-07-10T23:27:14.385-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-10T23:27:14.385-07:00</app:edited><title>Building a culture of teaching and learning by Dr. Tae!</title><content type="html">
&lt;div class="posterous_bookmarklet_entry"&gt; &lt;object type="application/x-shockwave-flash" height="281" width="500" data="http://vimeo.com/moogaloop.swf?clip_id=5513063&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF"&gt;  	&lt;param name="quality" value="best" /&gt;  	&lt;param name="allowfullscreen" value="true" /&gt;  	&lt;param name="scale" value="showAll" /&gt;  	&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5513063&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF" /&gt;  &lt;/param&gt;&lt;/param&gt;&lt;/param&gt;&lt;/param&gt;&lt;/object&gt;    &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://vimeo.com/5513063"&gt;vimeo.com&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/building-a-culture-of-teaching-and-learning-b"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-2353658004992011943?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=X8Bt_-28VZ4:Ziyf_VAYS0k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=X8Bt_-28VZ4:Ziyf_VAYS0k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=X8Bt_-28VZ4:Ziyf_VAYS0k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=X8Bt_-28VZ4:Ziyf_VAYS0k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/X8Bt_-28VZ4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/2353658004992011943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/07/building-culture-of-teaching-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2353658004992011943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/2353658004992011943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/X8Bt_-28VZ4/building-culture-of-teaching-and.html" title="Building a culture of teaching and learning by Dr. Tae!" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/07/building-culture-of-teaching-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHSXY9cCp7ImA9WxJUEEg.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-7345305289894800941</id><published>2009-07-08T05:27:00.001-07:00</published><updated>2009-07-08T05:30:38.868-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-08T05:30:38.868-07:00</app:edited><title>Regular Expression Matching and Postfix notation</title><content type="html">&lt;div class="posterous_bookmarklet_entry"&gt; &lt;blockquote class="posterous_long_quote"&gt;As the compiler scans the postfix expression, it maintains  a stack of computed NFA fragments.  Literals push new NFA fragments onto the stack, while  operators pop fragments off the stack and then  push a new fragment.  For example,   after compiling the  &lt;code&gt;abb&lt;/code&gt; in &lt;code&gt;abb.+.a.&lt;/code&gt;,  the stack contains NFA fragments for  &lt;code&gt;a&lt;/code&gt;,  &lt;code&gt;b&lt;/code&gt;,  and  &lt;code&gt;b&lt;/code&gt;.  The compilation of the  &lt;code&gt;.&lt;/code&gt;  that follows pops the two  &lt;code&gt;b&lt;/code&gt;  NFA fragment from the stack and pushes an NFA fragment for the  concatenation  &lt;code&gt;bb.&lt;/code&gt;.  Each NFA fragment is defined by its start state and its  outgoing arrows:  &lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://swtch.com/%7Ersc/regexp/regexp1.html"&gt;swtch.com&lt;/a&gt;&lt;/div&gt;    The snippet doesn't make much sense unless you read the article, but this part, I thought was rather neat.  Usually, when I wrote my crappy, one-off parsers, I just used regexes to pull out the tokens that I needed.  Never thought too much about how it was implemented.  But what's detailed here makes sense.  Regexes are just state machines where you track whether the string you're matching against lets you traverse all the way through the state machine.  And to do that, it pushes each fragment of the regex onto a stack until it reaches an operator, which then pops it off and works on it.  While I've usually left post-fix notation is ass-backwards from a user perspective, I can see the elegance of the implementation.  I suspect Forth and Factor are similar in this regard. &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/regular-expression-matching-can-be-simple-and"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-7345305289894800941?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=9RsQY3Kp7KY:KVcqG0Qs7Dc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=9RsQY3Kp7KY:KVcqG0Qs7Dc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=9RsQY3Kp7KY:KVcqG0Qs7Dc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=9RsQY3Kp7KY:KVcqG0Qs7Dc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/9RsQY3Kp7KY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/7345305289894800941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/07/regular-expression-matching-can-be.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7345305289894800941?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/7345305289894800941?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/9RsQY3Kp7KY/regular-expression-matching-can-be.html" title="Regular Expression Matching and Postfix notation" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/07/regular-expression-matching-can-be.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQNQ3Y9fyp7ImA9WxJVEkU.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-833154867578827954</id><published>2009-06-29T08:13:00.001-07:00</published><updated>2009-06-29T08:13:12.867-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T08:13:12.867-07:00</app:edited><title>Nerd time issue 16</title><content type="html">
I use to work at a research lab and while it was cutting edge in some ways, it seemed unaware of things going on in software and web.  I&amp;#39;ve since left the research lab, and Nerd Time started as a mailing list to tell my friends still at the lab about things that they might be able to use in their own projects.  &lt;br /&gt;  &lt;div&gt;                  &lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;Hey all,&lt;br /&gt;&lt;br /&gt;It&amp;#39;s that time again.  I never get feedback about whether you guys read this or not.  But apparently, some of you do, since my last trip back to MD.  This is just a collection of things I found interesting since the last nerd time.  Obviously, there are other trends I&amp;#39;m missing.&lt;br /&gt;    &lt;br /&gt;If you want off, just lemme know.  &lt;br /&gt;&lt;br /&gt;This is rather long since it&amp;#39;s been a good 6 months since the last nerd time.  Work has kept me busy, and I don&amp;#39;t read as much as I use to.  Since there&amp;#39;s no theme, but lots of trends, they&amp;#39;re in no particular order this time.  Skim through it and see if there&amp;#39;s anything that catches your eye.  &lt;br /&gt;    &lt;br /&gt;If you have questions about stuff, feel free to ask me (don&amp;#39;t reply all!)&lt;br /&gt;                &lt;br /&gt;First, some stuff I did on the side:&lt;br /&gt;&lt;b&gt;Senate Majroity vs National Debt&lt;/b&gt;&lt;br /&gt;I was talking with Ian about graphing public data, and this was what he wanted to know.  This sort of thing should be so much easier.  If you find the process of getting this data to graph, lemme know.  I imagine it goes in line with a lot of the net-centric buzzwording that does on in DoD projects.&lt;br /&gt;                    &lt;a href="http://iamwil.posterous.com/senate-majority-vs-national-debt-getting-at-p" target="_blank"&gt;http://iamwil.posterous.com/senate-majority-vs-national-debt-getting-at-p&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Frock, a chicken flocking simulator&lt;/b&gt;&lt;br /&gt;                  I wanted to get to know the Lua programming language, so I chose this as a project.  I&amp;#39;m getting it to support more chickens still.&lt;br /&gt;  &lt;a href="http://webjazz.blogspot.com/2009/02/introducing-frock-flocking-chicken.html" target="_blank"&gt;http://webjazz.blogspot.com/2009/02/introducing-frock-flocking-chicken.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And now, the other stuff.&lt;br /&gt;&lt;br /&gt;                  &lt;b&gt;Twitter&lt;/b&gt;&lt;br /&gt;  So I&amp;#39;m sure most of you by now have heard of twitter.  Considering that Oprah did a show on it, it&amp;#39;s crossed over to mainstream.  A lot of you might not think of it as anything to pay attention to.  However, it&amp;#39;s one of those things where its value depends on whom you follow.  Beyond the hype, it&amp;#39;s mainly a messaging multicast system that has a dead-simple API, so that other people can build things on top of it.  People have made things that twitter, such as plants that tell you when you need to water it, when bridges go up and down, when a meteor almost hits the earth, etc.  &lt;br /&gt;                    &lt;a href="http://www.twitter.com" target="_blank"&gt;http://www.twitter.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twollars.com/" target="_blank"&gt;http://twollars.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.botanicalls.com/kits/" target="_blank"&gt;http://www.botanicalls.com/kits/&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://twitter.com/riverthames" target="_blank"&gt;http://twitter.com/riverthames&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wolfram Alpha and Google Squared and YQL&lt;/b&gt;&lt;br /&gt;  Wolfram Alpha and Google Squared had both been announced in the last  month or so.  Both are looking towards being able to query large  amounts of structured data.  However, wolfram curates this data with  experts, and google squared attempts to make structured data from  indexing tables of data on the web.  In addition, Yahoo released YQL,  which is a query you can use to scrap the web and treat it as just  another database.&lt;br /&gt;&lt;a href="http://www.wolframalpha.com/" target="_blank"&gt;http://www.wolframalpha.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/squared/" target="_blank"&gt;http://www.google.com/squared/&lt;/a&gt;&lt;br /&gt;        &lt;a href="http://tables.googlelabs.com/Home?pli=1" target="_blank"&gt;http://tables.googlelabs.com/Home?pli=1&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://developer.yahoo.com/yql/" target="_blank"&gt;http://developer.yahoo.com/yql/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real-time search&lt;/b&gt;&lt;br /&gt;  Real-time search seems to be the wrestling ground for the next  generation of search right now.  There are a number of competitors in  this field, including giants and startups.  It&amp;#39;s evident with the death  of Michael Jackson that news doesn&amp;#39;t just travel through the old  channels anymore.&lt;br /&gt;  &lt;a href="http://venturebeat.com/2009/06/20/who-rules-real-time-search-a-look-at-9-contenders/" target="_blank"&gt;http://venturebeat.com/2009/06/20/who-rules-real-time-search-a-look-at-9-contenders/&lt;/a&gt;&lt;br /&gt;        &lt;a href="http://search.twitter.com/" target="_blank"&gt;http://search.twitter.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scoopler.com/" target="_blank"&gt;http://www.scoopler.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Google Wave&lt;/b&gt;&lt;br /&gt;If you haven&amp;#39;t heard, google released a new communication tool called google wave.  It&amp;#39;s what email would be like if it was reinvented today.  It&amp;#39;s basically combining different aspects of our communication tools and merging them all together.  It&amp;#39;s best if you watch the video and play with the demo.  If you want to play with wave yourself, you don&amp;#39;t have to wait for an invite, but can sign up with a wave server that someone set up themselves.  I recommend watching the video, as it breaks your presumptions of what&amp;#39;s possible with HTML5 and the web.&lt;br /&gt;    &lt;a href="http://wave.google.com/" target="_blank"&gt;http://wave.google.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wavety.com/pygo-wave-server/" target="_blank"&gt;http://wavety.com/pygo-wave-server/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Git and github&lt;/b&gt;&lt;br /&gt;To me, this is really old news, but just in case you&amp;#39;re still using SVN, you should checkout Git instead for your source control.  It&amp;#39;s ass-kicking good, though it has a slight learning curve.  I won&amp;#39;t say too much more about it, but you should really look into it.  It&amp;#39;ll expand your mind.&lt;br /&gt;    &lt;a href="http://git-scm.com/" target="_blank"&gt;http://git-scm.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/" target="_blank"&gt;http://github.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Key-value stores&lt;/b&gt;&lt;br /&gt;Lately, there&amp;#39;s been a flurry of attention on key-value stores.  I&amp;#39;ve mentioned one of them before, CouchDb.  There are a bunch of others.  Tokyo Cabinet (link #2) is used at &lt;a href="http://Mixx.jp.co" target="_blank"&gt;Mixx.jp.co&lt;/a&gt;, a social network in Japan.  Cassandra (link #3) is used at facebook.  Amazon has SimpleDB and Dynamo.  I&amp;#39;ve only played with tokyo cabinet and couchdb, so I can&amp;#39;t really do a compare and contrast between them all.  But to me, TC, couchdb, and redis seem to be the most interesting.  This marks a shift away from relational dbs as the default data store.  Not that they&amp;#39;ll replace relational db, but we&amp;#39;re finding there are a different class of constraints for the web not necessarily taken care of by relational dbs.  In addition, they have properties not avail to relational dbs, such as being schema-less, an http server built in, replication, distributed, etc.&lt;br /&gt;                    &lt;a href="http://couchdb.apache.org/" target="_blank"&gt;http://couchdb.apache.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tokyocabinet.sourceforge.net/index.html" target="_blank"&gt;http://tokyocabinet.sourceforge.net/index.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cwiki.apache.org/confluence/display/CSDR/Index" target="_blank"&gt;http://incubator.apache.org/cassandra/&lt;/a&gt;&lt;br /&gt;                    &lt;a href="http://code.google.com/p/redis/" target="_blank"&gt;http://code.google.com/p/redis/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://memcachedb.org/" target="_blank"&gt;http://memcachedb.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/cliffmoon/dynomite/tree/master" target="_blank"&gt;http://github.com/cliffmoon/dynomite/tree/master&lt;/a&gt;&lt;br /&gt;                    &lt;a href="http://opensource.plurk.com/LightCloud/" target="_blank"&gt;http://opensource.plurk.com/LightCloud/&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://www.oracle.com/technology/products/berkeley-db/index.html" target="_blank"&gt;http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/berkeley-db/index.html" target="_blank"&gt;http://www.oracle.com/technology/products/berkeley-db/index.html&lt;/a&gt;&lt;br /&gt;                    &lt;a href="http://code.google.com/p/thrudb/" target="_blank"&gt;http://code.google.com/p/thrudb/&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://code.google.com/p/scalaris/" target="_blank"&gt;http://code.google.com/p/scalaris/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The internet of things&lt;/b&gt;&lt;br /&gt;It&amp;#39;s something further out, but these first two talks from TED got me thinking about where the web was heading.  I don&amp;#39;t think that the semantic web, as we imagine it will come to fruition.  However, having the things we own talk to each other over the internet is not unfathomable.  They&amp;#39;ll be able to negotiate with each other to perform a task, or they&amp;#39;ll be able to keep a history of what they&amp;#39;re doing or how you&amp;#39;re interacting with them.  &lt;br /&gt;                      &lt;a href="http://www.ted.com/index.php/talks/kevin_kelly_on_the_next_5_000_days_of_the_web.html" target="_blank"&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talks/embed/KevinKelly_2007P-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/KevinKelly-2007P.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=319" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/KevinKelly_2007P-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/KevinKelly-2007P.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=319"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ted.com/index.php/talks/tim_berners_lee_on_the_next_web.html" target="_blank"&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talks/embed/TimBerners-Lee_2009-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TimBerners-Lee-2009.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=484" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/TimBerners-Lee_2009-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TimBerners-Lee-2009.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=484"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/a&gt;&lt;br /&gt;                        &lt;a href="http://siftables.com/" target="_blank"&gt;http://siftables.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.readwriteweb.com/archives/5_companies_building_the_internet_of_things.php" target="_blank"&gt;http://www.readwriteweb.com/archives/5_companies_building_the_internet_of_things.php&lt;/a&gt;&lt;br /&gt;                    &lt;a href="http://www.makerbot.com" target="_blank"&gt;www.makerbot.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://siftables.com/" target="_blank"&gt;http://siftables.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cheap hardware boards&lt;/b&gt;&lt;br /&gt;Hardware is already cheap, but building hardware yourself has still been somewhat of a pain.  I remember having to use Rabbit boards before.  There are better ones now.  I&amp;#39;ve mentioned arduino before.  Beagle board is a full board that you can run Ubuntu on.  Teensy is a small USB microcontroller.&lt;br /&gt;                    &lt;a href="http://www.arduino.cc/" target="_blank"&gt;http://www.arduino.cc/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://beagleboard.org/" target="_blank"&gt;http://beagleboard.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pjrc.com/teensy/?not_a_duplicate" target="_blank"&gt;http://www.pjrc.com/teensy/?not_a_duplicate&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;Quake online&lt;/b&gt;&lt;br /&gt;Gaming often is looked on as child&amp;#39;s play, when in fact, it&amp;#39;s some of the hardest programming around, and often drives innovation and progress in graphical techniques, AI, and hardware.  Carmack, the guy that wrote Quake, wants to put Quake on the browser.  For the longest time, people derided the web, saying it&amp;#39;ll never match the performance of desktop apps, and never give the same user experience.  If Carmack can run quake on a native browser, then I believe desktop will lose.  If he&amp;#39;s delivering quake as a video stream, then that&amp;#39;s another matter altogether.&lt;br /&gt;    &lt;a href="http://www.gamasutra.com/view/feature/3946/building_quake_live_carmack_speaks.php?print=1" target="_blank"&gt;http://www.gamasutra.com/view/feature/3946/building_quake_live_carmack_speaks.php?print=1&lt;/a&gt;&lt;br /&gt;                    &lt;br /&gt;&lt;b&gt;Reverse HTTP&lt;/b&gt;&lt;br /&gt;HTTP is by design a pull model, where the client requests resources from a server.  If you wanted to push data to a browser client, you had to rely on a bit of javascript finangling called Comet (cousin to AJAX), where you open an http connection to the client, and leave it open until you want to push stuff to the client.  This certainly puts a load on servers because you have to keep connections open.  Alternatively, you can have the client keep polling the server.  That sucks too.  Reverse HTTP doesn&amp;#39;t need to keep the connection open.  It basically takes advantage of the upgrade field in the HTTP header normally used to find a more appropriate protocol, and instead to turn the connection around from the server to the client.  It&amp;#39;s still experimental, but it makes a lot more things simple instead of messing with javascript on clients to push data to browsers.&lt;br /&gt;    &lt;a href="http://www.reversehttp.net/" target="_blank"&gt;http://www.reversehttp.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.secondlife.com/wiki/Reverse_HTTP" target="_blank"&gt;http://wiki.secondlife.com/wiki/Reverse_HTTP&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ietf.org/internet-drafts/draft-lentczner-rhttp-00.txt" target="_blank"&gt;http://www.ietf.org/internet-drafts/draft-lentczner-rhttp-00.txt&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;Whiteboarding in real time&lt;/b&gt;&lt;br /&gt;Many collaboration tools have come out.  We&amp;#39;ve discovered that the web is essentially a communications medium.  Anyway, this set of collaboration tools lets you whiteboard, compose text, and revise docs in real time as other people are editing them.  The last link shows you a re-play of paul graham writing one of his essays.  This allows people to see how they edit their text over time, and shows others how other people think as they write.  It&amp;#39;d be useful as an educational tool.&lt;br /&gt;    &lt;a href="http://www.twiddla.com/" target="_blank"&gt;http://www.twiddla.com/&lt;/a&gt;&lt;br /&gt;                &lt;a href="http://www.etherpad.com/" target="_blank"&gt;http://www.etherpad.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.wikirage.com/" target="_blank"&gt;http://www.wikirage.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.revizr.com/" target="_blank"&gt;http://www.revizr.com/&lt;/a&gt;&lt;br /&gt;            &lt;a href="http://etherpad.com/ep/pad/slider/13sentences" target="_blank"&gt;http://etherpad.com/ep/pad/slider/13sentences&lt;/a&gt;&lt;br /&gt;  &lt;b&gt;&lt;br /&gt;Facebook&amp;#39;s walled garden&lt;/b&gt;&lt;br /&gt;Facebook is the AOL of today.  It&amp;#39;s basically a walled garden of data, where users live.  There&amp;#39;s a bunch of effort to break them open.  Facebook also wants to open itself out as a fast follower to twitter.  I won&amp;#39;t say much more here, but there&amp;#39;s an ongoing battle about where data gets to go on this front.&lt;br /&gt;    &lt;a href="http://www.wired.com/techbiz/it/magazine/17-07/ff_facebookwall?currentPage=all" target="_blank"&gt;http://www.wired.com/techbiz/it/magazine/17-07/ff_facebookwall?currentPage=all&lt;/a&gt;&lt;br /&gt;        &lt;a href="http://googledataapis.blogspot.com/2008/03/3-2-1-contact-api-has-landed.html" target="_blank"&gt;http://googledataapis.blogspot.com/2008/03/3-2-1-contact-api-has-landed.html&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.complang.org/dsnp/" target="_blank"&gt;http://www.complang.org/dsnp/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Data.gov and the sunlight foundation&lt;/b&gt;&lt;br /&gt;Since Obama took office, there&amp;#39;s been a big push and initiative to open up the government to its citizens in the name of transparency.  One of the things they&amp;#39;re doing is &lt;a href="http://data.gov" target="_blank"&gt;data.gov&lt;/a&gt; and opening raw public data up to developers or anyone that wants to use it.  The sunlight foundation is doing the same for legistator and voting data.  I expect that we&amp;#39;ll have more apps that will be able to take advantage of this data in the near future, not just to help the people govern their govenment, but also to lead more informed lives.&lt;br /&gt;    &lt;a href="http://services.sunlightlabs.com/api/" target="_blank"&gt;http://services.sunlightlabs.com/api/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.data.gov/catalog/raw/category/0/agency/0/filter//type//sort//page/1/count/10" target="_blank"&gt;http://www.data.gov/catalog/raw/category/0/agency/0/filter//type//sort//page/1/count/10&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;DNA engineering&lt;/b&gt;&lt;br /&gt;A front that I don&amp;#39;t know too much about, but is probably a bigger revolution than the information age and the internet are things that have to do with genetic and bio engineering.  23andme lets you submit cell samples of yourself, and they&amp;#39;ll do genetic testing to tell you if you have genetic diseases, among other things.  You can now submit gene sequences and get them built for a modest amount of money--not super expensive, but still out of reach for hobbists)  As the cost goes down, you&amp;#39;ll soon see designer pets and bacteria.  The last post is about a guy that theoretically hacks a more potent variant of swine flu.&lt;br /&gt;    &lt;a href="http://23andme.com" target="_blank"&gt;http://23andme.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mrgene.com/desktopdefault.aspx/tabid-2/" target="_blank"&gt;http://mrgene.com/desktopdefault.aspx/tabid-2/&lt;/a&gt;&lt;br /&gt;          &lt;a href="http://www.bunniestudios.com/blog/?p=353" target="_blank"&gt;http://www.bunniestudios.com/blog/?p=353&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;GWT, sproutcore, and Cappucino&lt;/b&gt;&lt;br /&gt;Javascript is the most widely used language in the world.  And while it has its merits as a functional language, people are trying to develop frameworks that compile to javascript.  Javascript is not bad when you&amp;#39;re using jQuery.  Scriptaculous 2 just got released also.  &lt;br /&gt;    &lt;a href="http://code.google.com/webtoolkit/" target="_blank"&gt;http://code.google.com/webtoolkit/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sproutcore.com/" target="_blank"&gt;http://www.sproutcore.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cappuccino.org/" target="_blank"&gt;http://cappuccino.org/&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://jquery.com" target="_blank"&gt;http://jquery.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://scripty2.com/" target="_blank"&gt;http://scripty2.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Chat on couchdb, standalone web apps, and taking your data with you&lt;/b&gt;&lt;br /&gt;  This was curious.  Couchdb is a key-value document orientated database with an http server as its frontend.  They were able to demonstrate that you can fit an entire web app just in the database.  Data is code, and code is data.  Not only that, you can use the database&amp;#39;s replication to port your data and sync it where-ever you go.  It&amp;#39;s an interesting head turn, even if it&amp;#39;s just a demo.&lt;br /&gt;    &lt;a href="http://damienkatz.net/2009/05/realtime_chat_on_couchdb.html" target="_blank"&gt;http://damienkatz.net/2009/05/realtime_chat_on_couchdb.html&lt;/a&gt;&lt;br /&gt;        &lt;a href="http://www.jasondavies.com/blog/2009/05/08/couchdb-on-wheels/" target="_blank"&gt;http://www.jasondavies.com/blog/2009/05/08/couchdb-on-wheels/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://devlindaley.com/2009/2/14/couchdb-bloom-filters" target="_blank"&gt;http://devlindaley.com/2009/2/14/couchdb-bloom-filters&lt;/a&gt;&lt;br /&gt;              &lt;br /&gt;&lt;b&gt;Mozilla Ubiquity again, but this time hooks into webapps&lt;/b&gt;&lt;br /&gt;I&amp;#39;ve mentioned ubiquity before, which is like a commandline interface for your browser.  I use it myself, but only in limited amounts.  What&amp;#39;s interesting about the direction is that they leverage web services to complete tasks it can&amp;#39;t complete for itself.  I think that high level languages will eventually adopt the idea of being able to easily hook into web services as a natural part of the language, without extra libraries.&lt;br /&gt;    &lt;a href="http://www.readwriteweb.com/archives/firefoxs_ubiqity_starts_thinking_for_itself.php" target="_blank"&gt;http://www.readwriteweb.com/archives/firefoxs_ubiqity_starts_thinking_for_itself.php&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Mozilla Jetpack lets you write Firefox addons with the web&lt;/b&gt;&lt;br /&gt;Traditionally, web developers have stayed out of the realm of desktop developers.  This is one of the many indications I have that a lot of programming--especially those with user interfaces or a social aspect--will move towards web programming constructs.  &lt;a href="https://jetpack.mozillalabs.com/" target="_blank"&gt;https://jetpack.mozillalabs.com/&lt;/a&gt;&lt;br /&gt;    &lt;b&gt;&lt;br /&gt;Clojure, Scala, Haskell, Erlang&lt;/b&gt;&lt;br /&gt;    I&amp;#39;m not going to say too much about these programming languages, since I&amp;#39;ve mentioned them before, but just as a reminder, there&amp;#39;s more than Java out there.  These four to me, represent the edge of programming languages that have potential in the future.  With the advent of multicores, it&amp;#39;s likely that functional programming will lead the way in giving us adequate programming constructs to deal with multicores.  If you&amp;#39;re a programmer, it&amp;#39;d probably serve you well to learn at least one of these in the coming 4 years.&lt;br /&gt;    &lt;a href="http://clojure.org/" target="_blank"&gt;http://clojure.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/" target="_blank"&gt;http://www.scala-lang.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.haskell.org/" target="_blank"&gt;http://www.haskell.org/&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://erlang.org/" target="_blank"&gt;http://erlang.org/&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;b&gt;ParrotVM and mod_parrot&lt;/b&gt;&lt;br /&gt;Admittedly, I don&amp;#39;t know much about Parrot.  But the claims it makes is big.  With the rise and popularity of dynamic programming languages like Python and Ruby, we&amp;#39;re struggling for a fast virtual machine.  And to have to build a new virtual machine every time we have a new language is a pain.  ParrotVM is suppose to take care of easing that pain.  If that&amp;#39;s the case, it might be easier to make languages catered to our problem domain.&lt;br /&gt;      &lt;a href="http://www.linux-mag.com/cache/7373/1.html" target="_blank"&gt;http://www.linux-mag.com/cache/7373/1.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.smashing.org/talks/mod_parrot.ppt" target="_blank"&gt;http://www.smashing.org/talks/mod_parrot.ppt&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;Augmented reality and zombies&lt;/b&gt;&lt;br /&gt;We&amp;#39;ve moved closer to having augmented reality.  This is a far cry from the geeky headcam helmets and laptop backpacks that dorky MIT profs wore a decade ago.  It still relies on a 2D barcode, and has limited uses, but now with the iPhone3GS out (it has a compass), we might see more augmented reality apps (as well as on android phones)&lt;br /&gt;      &lt;a href="http://singularityhub.com/2009/06/19/augmented-reality-is-full-of-zombies/" target="_blank"&gt;http://singularityhub.com/2009/06/19/augmented-reality-is-full-of-zombies/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.thinkartificial.org/machine-interfaces/augmented-reality-iphone/" target="_blank"&gt;http://www.thinkartificial.org/machine-interfaces/augmented-reality-iphone/&lt;/a&gt;&lt;br /&gt;              &lt;a href="http://news.cnet.com/8301-17938_105-10266380-1.html" target="_blank"&gt;http://news.cnet.com/8301-17938_105-10266380-1.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sysadmin tips&lt;/b&gt;&lt;br /&gt;Here are some good sysadmin tips.  I&amp;#39;d like to think I know my way around linux, when in fact, I&amp;#39;ve just started.&lt;br /&gt;    &lt;a href="http://www.ibm.com/developerworks/linux/library/l-10sysadtips/" target="_blank"&gt;http://www.ibm.com/developerworks/linux/library/l-10sysadtips/&lt;/a&gt;&lt;br /&gt;          &lt;a href="http://blog.transmit.net/2008/10/my-best-unix-tricks.html" target="_blank"&gt;http://blog.transmit.net/2008/10/my-best-unix-tricks.html&lt;/a&gt;&lt;br /&gt;                    &lt;br /&gt;&lt;b&gt;Probabilistic chips&lt;/b&gt;&lt;br /&gt;I don&amp;#39;t know anymore than what&amp;#39;s written in the article.  So read about it.&lt;br /&gt;  &lt;a href="http://www.chron.com/disp/story.mpl/metropolitan/6252697.html" target="_blank"&gt;http://www.chron.com/disp/story.mpl/metropolitan/6252697.html&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Google Moderator&lt;/b&gt;&lt;br /&gt;  Voting on websites is old hat since about 2005 with the advent of  Digg.com and &lt;a href="http://reddit.com" target="_blank"&gt;reddit.com&lt;/a&gt;.  I found it curious that google has a  moderator app, to help facilitate the asking of questions.  If you want  your own, you can create a white label voting site at slinkset.&lt;br /&gt;&lt;a href="http://moderator.appspot.com/" target="_blank"&gt;http://moderator.appspot.com/&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.slinkset.com" target="_blank"&gt;http://www.slinkset.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The rest of these are related to software, but not about code.  If you can only watch/read one, I&amp;#39;d recommend the poisonous people one.  That applies to more than open source projects.  In it, SVN core devs talk about how someone came in and told them they were all wrong.  I have a feeling that was Linus Torvalds, as he rails on the SVN guys in his talk.&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;The Business and Politics of Software&lt;/b&gt;&lt;br /&gt;&lt;a href="http://blog.cusec.net/2009/01/05/zed-shaw-the-acl-is-dead-cusec-2008/" target="_blank"&gt;http://blog.cusec.net/2009/01/05/zed-shaw-the-acl-is-dead-cusec-2008/&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;          &lt;b&gt;Pivoting, or knowing when to stop.&lt;/b&gt;&lt;br /&gt;&lt;a href="http://startuplessonslearned.blogspot.com/2009/06/pivot-dont-jump-to-new-vision.html" target="_blank"&gt;http://startuplessonslearned.blogspot.com/2009/06/pivot-dont-jump-to-new-vision.html&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;How open source projects survive poisonous people.&lt;/b&gt;&lt;br /&gt;              &lt;object height="417" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZSFDm3UYkeE&amp;rel=1&amp;ap=%2526fmt%3D18" /&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZSFDm3UYkeE&amp;rel=1&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" height="417" wmode="transparent" width="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linus Torvalds on Git&lt;/b&gt;&lt;br /&gt;&lt;object height="417" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4XpnKHJAok8&amp;rel=1&amp;ap=%2526fmt%3D18" /&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/4XpnKHJAok8&amp;rel=1&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" height="417" wmode="transparent" width="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;    &lt;br /&gt;&lt;b&gt;Build or buy?&lt;/b&gt;&lt;br /&gt;&lt;a href="http://sitecanary.com/blog/5" target="_blank"&gt;http://sitecanary.com/blog/5&lt;/a&gt;&lt;br /&gt;      &lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/nerd-time-issue-16"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-833154867578827954?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ySJuNkj8QG4:nWPMU2fRFsI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ySJuNkj8QG4:nWPMU2fRFsI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=ySJuNkj8QG4:nWPMU2fRFsI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=ySJuNkj8QG4:nWPMU2fRFsI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/ySJuNkj8QG4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/833154867578827954/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/06/nerd-time-issue-16.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/833154867578827954?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/833154867578827954?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/ySJuNkj8QG4/nerd-time-issue-16.html" title="Nerd time issue 16" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/06/nerd-time-issue-16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MBQng4fip7ImA9WxJVEEs.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-5239626308017830244</id><published>2009-06-26T17:10:00.001-07:00</published><updated>2009-06-26T17:10:53.636-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-26T17:10:53.636-07:00</app:edited><title>Netflix Prize barrier of 10% has been broken</title><content type="html">
&lt;div&gt; &lt;a href="http://www.netflixprize.com/leaderboard?att"&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/iamwil/zuklCuyrCDDhImmICkDFFeinvcAjtgpxhFIqFameasIlugucwbEcbDijfhfk/media_httpwwwnetflixprizecomassetsheaderprizejpg_swbCtqmbGJDmDwy.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/iamwil/zuklCuyrCDDhImmICkDFFeinvcAjtgpxhFIqFameasIlugucwbEcbDijfhfk/media_httpwwwnetflixprizecomassetsheaderprizejpg_swbCtqmbGJDmDwy.jpg.scaled500.jpg" width="500" height="52"/&gt;&lt;/a&gt; &lt;/a&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.netflixprize.com/leaderboard?att"&gt;netflixprize.com&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;  Well, looks like they did it.  A bunch of teams came together and put their solutions together to do 10%.  Congrats. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/netflix-prize-barrier-of-10-has-been-broken"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-5239626308017830244?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=v3Z6fNVZtrk:ooC9H7az0KA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=v3Z6fNVZtrk:ooC9H7az0KA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=v3Z6fNVZtrk:ooC9H7az0KA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=v3Z6fNVZtrk:ooC9H7az0KA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/v3Z6fNVZtrk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/5239626308017830244/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/06/netflix-prize-barrier-of-10-has-been.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5239626308017830244?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/5239626308017830244?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/v3Z6fNVZtrk/netflix-prize-barrier-of-10-has-been.html" title="Netflix Prize barrier of 10% has been broken" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/06/netflix-prize-barrier-of-10-has-been.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBQ3kzfSp7ImA9WxJWGEk.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-3178475611064379183</id><published>2009-06-24T06:14:00.001-07:00</published><updated>2009-06-24T06:14:12.785-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-24T06:14:12.785-07:00</app:edited><title>Army Exoskeleton Suit Gives Man Superhuman Strength | Singularity Hub</title><content type="html">
&lt;div&gt; &lt;object type="application/x-shockwave-flash" height="344" width="425" data="http://www.youtube.com/v/sJ4J69EEpu4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="src" value="http://www.youtube.com/v/sJ4J69EEpu4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;/param&gt;&lt;/param&gt;&lt;/param&gt;&lt;/param&gt;&lt;/object&gt;    &lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://singularityhub.com/2009/06/11/army-exoskeleton-suit-gives-man-superhuman-strength/"&gt;singularityhub.com&lt;/a&gt;&lt;/div&gt; &lt;p&gt;"it is impressive enough to hear somebody say that they gave up on lifting a 200-pound weight after 500 repetitions not because they were tired but because they were bored." &lt;/p&gt;&lt;p&gt;I've always wanted one of these.  I wonder if having mechs is too far off.  Perhaps there's no tactical advantage to having a large humanoid robot.   &lt;/p&gt;&lt;p&gt;In any case, this makes me wonder what other things DARPA funds.&lt;/p&gt;&lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/army-exoskeleton-suit-gives-man-superhuman-st"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-3178475611064379183?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nLfuBAF2T3A:IH_xvAcg2zw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nLfuBAF2T3A:IH_xvAcg2zw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=nLfuBAF2T3A:IH_xvAcg2zw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=nLfuBAF2T3A:IH_xvAcg2zw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/nLfuBAF2T3A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/3178475611064379183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/06/army-exoskeleton-suit-gives-man.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3178475611064379183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3178475611064379183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/nLfuBAF2T3A/army-exoskeleton-suit-gives-man.html" title="Army Exoskeleton Suit Gives Man Superhuman Strength | Singularity Hub" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/06/army-exoskeleton-suit-gives-man.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAGRX8yfSp7ImA9WxJQF0w.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-8287678198384030275</id><published>2009-05-30T10:43:00.000-07:00</published><updated>2009-05-30T13:18:44.195-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-30T13:18:44.195-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="couchdb" /><title>Returning the keys of all documents in CouchDb</title><content type="html">There's a bit of a learning curve when trying to use CouchDb's mapreduce.  One of the harder parts is to write the reduce function, which can have two separate cases:  called from the map functions, and called again from reduce functions.&lt;br /&gt;&lt;br /&gt;When you emit data from map, the examples show you emitting the document, but you can emit any data structure you care to dream up in the key and value portion of the emit.  I needed a mapreduce view that returned all the keys that were present in the all the documents.  So if I had documents in the db in the form:&lt;br /&gt;&lt;pre class="javascript"&gt;{"year": 2008, "birth_rate": 20.0 }&lt;br /&gt;{"year": 2009, "birth_rate": 21.0 }&lt;br /&gt;{"year": 2008, "death_rate": 20.0 }&lt;br /&gt;{"year": 2009, "death_rate": 20.0 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I wanted something that returned: ["year", "birth_rate", "death_rate"]&lt;br /&gt;&lt;br /&gt;Here's one way to do it:&lt;br /&gt;&lt;script src="http://gist.github.com/120523.js"&gt;&lt;/script&gt;&lt;br /&gt;Tip!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-8287678198384030275?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=bK963VnGBI0:k1u8PqZo_vQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=bK963VnGBI0:k1u8PqZo_vQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=bK963VnGBI0:k1u8PqZo_vQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=bK963VnGBI0:k1u8PqZo_vQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/bK963VnGBI0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/8287678198384030275/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/05/returning-keys-of-all-documents-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8287678198384030275?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/8287678198384030275?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/bK963VnGBI0/returning-keys-of-all-documents-in.html" title="Returning the keys of all documents in CouchDb" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/05/returning-keys-of-all-documents-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UARXk7eSp7ImA9WxJQFE4.&quot;"><id>tag:blogger.com,1999:blog-16002962.post-3156527664310854235</id><published>2009-05-27T08:43:00.001-07:00</published><updated>2009-05-27T08:47:24.701-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-27T08:47:24.701-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>How to add helpers, controllers, models, and views of your plugin into the Rails loadpath</title><content type="html">&lt;div&gt;&lt;br /&gt;&lt;p&gt;Sometimes, when you're writing a plugin, you end up writing models,&lt;br /&gt; helpers, and controllers that the main app can use. &amp;nbsp;However, you&lt;br /&gt; don't want to copy it into the main app all the time. &amp;nbsp;You'd like to&lt;br /&gt; keep things separate between the plugin, but you'd like to be able to&lt;br /&gt; include it in the path of the main app.&lt;br /&gt; &lt;br /&gt; To do this, put the following in your &lt;b&gt;init.rb&lt;/b&gt; file in the root&lt;br /&gt; of your plugin. &amp;nbsp;To add a new view path in your plugin that's at&lt;br /&gt; PLUGIN_ROOT/lib/views (where PLUGIN_ROOT is the root directory of your&lt;br /&gt; plugin):&lt;br /&gt; &lt;br /&gt; &lt;pre name="code" class="ruby"&gt;&lt;br /&gt;   ActionController::Base.append_view_path(File.join(PLUGIN_ROOT, "lib", "views"))&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; Any template files (like html.erb) that you put in that path will be&lt;br /&gt; seen in your app.&lt;br /&gt; &lt;br /&gt; To add new helper, model, or controller directories in the rails load path:&lt;br /&gt; &lt;br /&gt; &lt;pre name="code" class="ruby"&gt;&lt;br /&gt; %w{ helpers model controller }.each do |dir|&lt;br /&gt;   path = File.join(PLUGIN_ROOT, 'lib', dir)&lt;br /&gt;   $LOAD_PATH &lt;&lt; path&lt;br /&gt;   Dependencies.load_paths &lt;&lt; path&lt;br /&gt;   Dependencies.load_once_paths.delete(path)&lt;br /&gt; end&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; And now, any models you put in lib/model, lib/controller, and&lt;br /&gt; lib/helpers will be in the rails load path.&lt;br /&gt; &lt;br /&gt; Of course, this might all be moot with the reintroduction of Rails&lt;br /&gt; engines in 2.3. &amp;nbsp;I haven't gotten around to using them or figuring it&lt;br /&gt; out yet, but for now, this is how you do it with plugins. &amp;nbsp;tip!&lt;/div&gt;&lt;p style="font-size: 10px;"&gt;  &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://iamwil.posterous.com/how-to-add-helpers-controllers-models-and-vie"&gt;The Web and all that Jazz&lt;/a&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16002962-3156527664310854235?l=webjazz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_h8iF51XOIA:Lwl0I_YdZCA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_h8iF51XOIA:Lwl0I_YdZCA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?a=_h8iF51XOIA:Lwl0I_YdZCA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheWebAndAllThatJazz?i=_h8iF51XOIA:Lwl0I_YdZCA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheWebAndAllThatJazz/~4/_h8iF51XOIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://webjazz.blogspot.com/feeds/3156527664310854235/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://webjazz.blogspot.com/2009/05/how-to-add-helpers-controllers-models.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3156527664310854235?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16002962/posts/default/3156527664310854235?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheWebAndAllThatJazz/~3/_h8iF51XOIA/how-to-add-helpers-controllers-models.html" title="How to add helpers, controllers, models, and views of your plugin into the Rails loadpath" /><author><name>Wilhelm</name><uri>http://www.blogger.com/profile/03696320260631888445</uri><email>wil@3cglabs.com</email><gd:extendedProperty name="OpenSocialUserId" value="03115708320816698972" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://webjazz.blogspot.com/2009/05/how-to-add-helpers-controllers-models.html</feedburner:origLink></entry></feed>
