<?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/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-3545886534042322597</id><updated>2009-11-09T22:48:56.663-08:00</updated><title type="text">Just In Time</title><subtitle type="html">Web Dev and Other Ramblings by Justin Pease</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://jit.nuance9.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://jit.nuance9.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default?start-index=26&amp;max-results=25" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>31.817344</geo:lat><geo:long>-102.423151</geo:long><link rel="self" href="http://feeds.feedburner.com/nuance9/jit" type="application/atom+xml" /><feedburner:emailServiceId>nuance9/jit</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-6686588122428817495</id><published>2009-11-02T17:58:00.000-08:00</published><updated>2009-11-02T18:43:49.091-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="haproxy" /><title type="text">HAProxy: Routing by domain name</title><content type="html">Without too much effort I was able to find multiple search results that said &lt;a href="http://haproxy.1wt.eu/"&gt;HAProxy&lt;/a&gt; could direct traffic according to domain name.  Unfortunately I was hard pressed to find any example configurations demonstrating that functionality.  Turns out it is in section 7.7 of the &lt;a href="http://haproxy.1wt.eu/download/1.3/doc/configuration.txt"&gt;documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If we wanted to direct traffic for foo.com and bar.com to different servers we could do so as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;frontend http_proxy&lt;br /&gt;  bind 192.168.0.1:80&lt;br /&gt;  acl is_foo hdr_dom(host) -i foo&lt;br /&gt;  acl is_bar hdr_dom(host) -i bar&lt;br /&gt;  use_backend cluster1 if is_foo&lt;br /&gt;  use backend cluster2 if is_bar&lt;br /&gt;&lt;br /&gt;backend cluster1&lt;br /&gt;  server server1 192.168.0.2:80&lt;br /&gt;  server server2 192.168.0.3:80&lt;br /&gt;&lt;br /&gt;backend cluster2&lt;br /&gt;  server server3 192.168.0.4:80&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So first we create a frontend called http_proxy that will listen on port 80 of 192.168.0.1.  The next lines are the key parts.  &lt;br /&gt;&lt;br /&gt;We create an acl called is_foo which checks the Host portion of the HTTP header for the provided value, in this case 'foo' in one and 'bar' in the second acl.  The '-i' flag in both examples sets the match to be case insensitive.&lt;br /&gt;&lt;br /&gt;The last part of the frontend configuration is to tell it to use a backend named cluster1 or cluster2 depending on if the is_foo or is_bar acl matches.&lt;br /&gt;&lt;br /&gt;Finally we define the backends cluster1 and cluster2.  The backend cluster1 has 2 servers, backend cluster2 only has 1.&lt;br /&gt;&lt;br /&gt;So in this case if we sent a request for http://foo.com to 192.168.0.1:80 the acl that checks for the value 'foo' in the host should pass, and our request should be proxied to port 80 of either 192.168.0.2 or 192.168.0.3.&lt;br /&gt;&lt;br /&gt;The practical example shown in the HAProxy documention is that you could use this to direct traffic for assets.foo.com to a server for static content, and www.foo.com over to your application server.  However, if you found this article through a search, I'm sure you already have in mind how you want to use this.&lt;br /&gt;&lt;br /&gt;In addition to the hdr_dom shown in this example, there are many other hdr_* matchers, as well as many other configuration options with HAProxy.  For full details and options see the &lt;a href="http://haproxy.1wt.eu/download/1.3/doc/configuration.txt"&gt;official HAProxy documentation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-6686588122428817495?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0S4yaeSt2BY:Mg6W9ro7w9o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0S4yaeSt2BY:Mg6W9ro7w9o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0S4yaeSt2BY:Mg6W9ro7w9o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0S4yaeSt2BY:Mg6W9ro7w9o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0S4yaeSt2BY:Mg6W9ro7w9o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0S4yaeSt2BY:Mg6W9ro7w9o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0S4yaeSt2BY:Mg6W9ro7w9o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/6686588122428817495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=6686588122428817495" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6686588122428817495" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6686588122428817495" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/0S4yaeSt2BY/haproxy-routing-by-domain-name.html" title="HAProxy: Routing by domain name" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2009/11/haproxy-routing-by-domain-name.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-3733095788221675649</id><published>2009-10-26T19:50:00.000-07:00</published><updated>2009-10-26T20:41:17.040-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title type="text">Tiny email sending service with Amazon SQS</title><content type="html">I found the "&lt;a href="http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf"&gt;Dynamo Paper&lt;/a&gt;" by Amazon to be interesting.  In particular I liked the idea of small services.  Nothing new, but I liked the concept and wanted to play with it.  &lt;br /&gt;&lt;br /&gt;The result was the 71 line &lt;a href="http://github.com/jpease/sqs-mailer"&gt;SQS Mailer&lt;/a&gt;, available on Github.&lt;br /&gt;&lt;br /&gt;For this experiment the code polls an &lt;a href="http://aws.amazon.com/sqs/"&gt;Amazon SQS&lt;/a&gt; queue.  If there are messages in that queue, it retrieves them, parses them, and sends them out as emails via SMTP.  If there are no messages waiting, it just sleeps for 5 seconds and tries again.  So if you ran multiple applications that all needed to send email, they could send it out through this single service by sending a message to the queue. Which SMTP server account the message would go out through is controlled by a combination of a potentially application-specific identifier in the message you send to the queue, and a service-side lookup in accounts.yml.&lt;br /&gt;&lt;br /&gt;Will this be useful?  Not sure.  But it was fun to put together!&lt;br /&gt;&lt;br /&gt;Basically I sketched this out onto some notepaper one night, and then later filled in the functionality for each method when I had time:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/219264.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;At the current &lt;a href="http://aws.amazon.com/sqs/#pricing"&gt;Amazon SQS pricing&lt;/a&gt; of $0.01 per 10,000 requests,  leaving this idling would incur a cost of about $6.50 per year from AWS.&lt;br /&gt;&lt;br /&gt;As the disclaimer in the README file states, this doesn't handle failure scenarios with any grace.  If I decide it is useful for anything, I will give that some attention.  Or you can fork the project and let me know what you come up with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-3733095788221675649?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=q6XwfRIaO4k:pwP0HlwsXvo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=q6XwfRIaO4k:pwP0HlwsXvo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=q6XwfRIaO4k:pwP0HlwsXvo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=q6XwfRIaO4k:pwP0HlwsXvo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=q6XwfRIaO4k:pwP0HlwsXvo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=q6XwfRIaO4k:pwP0HlwsXvo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=q6XwfRIaO4k:pwP0HlwsXvo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/3733095788221675649/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=3733095788221675649" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/3733095788221675649" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/3733095788221675649" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/q6XwfRIaO4k/tiny-email-sending-service-with-amazon.html" title="Tiny email sending service with Amazon SQS" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2009/10/tiny-email-sending-service-with-amazon.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-8921973914091102243</id><published>2009-09-06T18:58:00.000-07:00</published><updated>2009-09-06T19:14:47.218-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mercurial" /><category scheme="http://www.blogger.com/atom/ns#" term="mercurial libraries" /><category scheme="http://www.blogger.com/atom/ns#" term="snow leopard" /><category scheme="http://www.blogger.com/atom/ns#" term="hg" /><title type="text">Abort: couldn't find mercurial libraries</title><content type="html">&lt;span class="Apple-style-span" style="font-family: monospace, Geneva, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(102, 0, 0); "&gt;&lt;div&gt;I've been setting up my fresh Snow Leopard installation today.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I followed the guide from Hivelogic: &lt;a href="http://hivelogic.com/articles/compiling-mercurial-on-snow-leopard/"&gt;Compiling Mercurial on Snow Leopard&lt;/a&gt;.  The installation completed without issue and 'which hg' showed everything was in place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, when I tried to issue an 'hg' command the following error popped up:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"abort: couldn't find mercurial libraries"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Google came to the rescue, and revealed these tweets:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://wincent.com/twitter/155"&gt;https://wincent.com/twitter/155&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://wincent.com/twitter/156"&gt;https://wincent.com/twitter/156&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For Snow Leopard, I just needed:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;export PYTHONPATH=/usr/local/lib/python2.6/site-packages&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:monospace, Geneva, Arial, Verdana, sans-serif;font-size:100%;color:#660000;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:monospace, Geneva, Arial, Verdana, sans-serif;font-size:100%;color:#660000;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;If you hit the same, hope this works for you.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-8921973914091102243?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=ATQL77j3nO8:cDcze6_H3J4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=ATQL77j3nO8:cDcze6_H3J4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=ATQL77j3nO8:cDcze6_H3J4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=ATQL77j3nO8:cDcze6_H3J4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=ATQL77j3nO8:cDcze6_H3J4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=ATQL77j3nO8:cDcze6_H3J4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=ATQL77j3nO8:cDcze6_H3J4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/8921973914091102243/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=8921973914091102243" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8921973914091102243" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8921973914091102243" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/ATQL77j3nO8/abort-couldnt-find-mercurial-libraries.html" title="Abort: couldn't find mercurial libraries" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2009/09/abort-couldnt-find-mercurial-libraries.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7017096482896949694</id><published>2008-11-27T06:00:00.000-08:00</published><updated>2008-11-27T09:08:00.418-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="typing" /><category scheme="http://www.blogger.com/atom/ns#" term="knowledge investment" /><category scheme="http://www.blogger.com/atom/ns#" term="continued education" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Typing? I'm a programmer not a secretary.</title><content type="html">This last week has seen a few posts on the necessity, or lack thereof, for good touch typing skills.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001188.html"&gt;We Are Typists First, Programmers Second&lt;/a&gt; - Jeff Atwood&lt;/div&gt;&lt;div&gt;&lt;a href="http://ifacethoughts.net/2008/11/19/is-typing-a-necessity-for-programming/"&gt;Is Typing A Necessity For Programming?&lt;/a&gt; - Abhijit Nadgouda&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I originally was going to say something along the lines of "I think it depends on how you view programming."  I was then going to differentiate between whether you just view programming as a job (where you are looking to scrape by with minimum investment), or a skill/craft/art to be cultivated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But in the process of assembling my ideas, I thought back to how I learned to touch type.  I wanted a job that at the time seemed to pay pretty decent.  However, the job required a minimum typing speed of 40WPM.  I was a 2 finger typist up till that point, which wasn't going to cut it.  Since I wanted the job I put forth some effort.  In about 1 month, using some free typing tutor programs, I learned to touch type sufficiently to pass the test and get the job.  Once on the job further increases in speed and accuracy came.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The glorious job that prompted this investment of effort was data entry.  It was boring as could be.  Really.  If you have never done data entry yourself it would be hard to imagine the level of boredom involved.  There was no craft or art to it, just glossy eyes and sore wrists.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now programming is not "just typing".  It's not just entering characters into a buffer.  Believe me, I speak from experience, it is not just data entry.  So a 10x improvement in your typing speed will not equate to a 10x increase in your productivity.  Hopefully between all that typing, programming requires you to stop and think.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nevertheless, whether you use some auto-complete super-fancy intellisensical snippet-fu brain scanning IDE or a bare bones text editor, you most likely use a keyboard as your central physical tool to transfer your thoughts from your brain into the computer.  If that is the case, even if programming is just your "job", you owe it to yourself to put forth a little bit of effort and learn to touch type. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It really is worth the effort, and the initial awkwardness.  If you don't know how to touch type you won't understand until you do.  There is something, well, just "cool" about being able to see words appear on the screen as you think them without giving any conscious thought to directing the individual fingers and keystrokes.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are going to use a tool on a daily basis, I can't imagine any reasonable argument against taking the time to learn to use it well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7017096482896949694?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=FoLFpL68EmI:62XE9LqX8Oc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=FoLFpL68EmI:62XE9LqX8Oc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=FoLFpL68EmI:62XE9LqX8Oc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=FoLFpL68EmI:62XE9LqX8Oc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=FoLFpL68EmI:62XE9LqX8Oc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=FoLFpL68EmI:62XE9LqX8Oc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=FoLFpL68EmI:62XE9LqX8Oc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7017096482896949694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7017096482896949694" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7017096482896949694" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7017096482896949694" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/FoLFpL68EmI/typing-im-programmer-not-secretary.html" title="Typing? I'm a programmer not a secretary." /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/11/typing-im-programmer-not-secretary.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-3158473252870275718</id><published>2008-11-08T17:03:00.000-08:00</published><updated>2008-11-08T17:42:14.975-08:00</updated><title type="text">Knowing Your Languages</title><content type="html">&lt;div&gt;You may only speak one language, but how well do you know your tools?  There are likely many similarities between learning a language and learning the tools you use daily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Today I was thinking about the difference between someone who is just learning a spoken language and someone who knows it well, and how this may at times be seen by their knowledge of it's vocabulary.  For example, imagine someone explaining "I need a tool that you use to hit those little metal things that connect two pieces of wood together.  It has a wooden handle about 12" long and has a metal part on top.  You know?  The tool that people who build houses use."&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Do you know what tool they are talking about?  Probably.  When I was learning Spanish, this is the sort of description I would find myself having to use at times. (To all the patient people who put up with me, Thank you.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, a person who knew the language well could have conveyed the same thought more concisely and clearly: "I need a hammer."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This same idea goes beyond spoken language.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I use VIM on a daily basis.  Until recently my VIM vocabulary consisted of :wq, dd, i, /, :%s and esc&lt;esc&gt;.  Not a vary wide vocabulary at all for such a powerful tool.  I could get most anything done, but it was more like that first long-winded description of a hammer.  I am continuing to work on expanding my VIM vocabulary, and in doing so finding that what previously took many keystrokes can now be done nearly instantly with a single command.&lt;/esc&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the real value of a rich vocabulary is much more than simply the ability to be concise.  A rich vocabulary allows you multiple options to express your thoughts depending on the intended goal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead of simply stating that it was "humid", a story-teller may choose to describe the air as "thick with moisture, soaking one's clothes and sapping one's strength."  Not as concise, but perhaps adding important details.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The same is true with our programming language vocabulary.  The goal of a rich vocabulary in Ruby, Erlang, or (insert your favorite language here) &lt;insert&gt; is not always to write the least lines of code.  Our goal may be to increase maintainability, expose intentions, improve performance, etc.  By improving our vocabulary and grasp of the language, we are able to express our thoughts both efficiently and in the way that best fits the specific situation at hand.&lt;/insert&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How is your vocabulary with the tools that you use?  What are you doing to improve?&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-3158473252870275718?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=HUaydQnyRlQ:3AvSRmvyq2o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=HUaydQnyRlQ:3AvSRmvyq2o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=HUaydQnyRlQ:3AvSRmvyq2o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=HUaydQnyRlQ:3AvSRmvyq2o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=HUaydQnyRlQ:3AvSRmvyq2o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=HUaydQnyRlQ:3AvSRmvyq2o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=HUaydQnyRlQ:3AvSRmvyq2o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/3158473252870275718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=3158473252870275718" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/3158473252870275718" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/3158473252870275718" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/HUaydQnyRlQ/knowing-your-languages.html" title="Knowing Your Languages" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/11/knowing-your-languages.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-4665321812080413196</id><published>2008-09-27T07:49:00.001-07:00</published><updated>2008-09-27T07:55:22.286-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dm" /><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><category scheme="http://www.blogger.com/atom/ns#" term="gem" /><category scheme="http://www.blogger.com/atom/ns#" term="script" /><title type="text">Remove Gems By Prefix</title><content type="html">If you are working with Merb or DM you know that approximately a gazillion gems are involved.  When, for whatever reason, I want to remove them it is a pain to do by hand.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a simple script to help:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt;&lt;/div&gt;&lt;code&gt;&lt;div&gt;prefix=$1&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;code&gt;gem list --local | grep $prefix  | awk '{ print $1 }' | xargs sudo gem uninstall&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I saved mine as remove_gem_by_prefix, gave it executable permissions and placed it in my path.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I can issue the commands:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;$ remove_gem_by_prefix merb&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;or &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;$ remove_gem_by_prefix dm&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And they all get blasted.  You do need to be careful to make sure the prefix you provide is unique to the gems you wish to remove.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-4665321812080413196?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=AiFozCmr2S0:H-tztfiptL8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=AiFozCmr2S0:H-tztfiptL8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=AiFozCmr2S0:H-tztfiptL8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=AiFozCmr2S0:H-tztfiptL8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=AiFozCmr2S0:H-tztfiptL8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=AiFozCmr2S0:H-tztfiptL8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=AiFozCmr2S0:H-tztfiptL8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/4665321812080413196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=4665321812080413196" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/4665321812080413196" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/4665321812080413196" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/AiFozCmr2S0/remove-gems-by-prefix.html" title="Remove Gems By Prefix" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/09/remove-gems-by-prefix.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7295859931808804023</id><published>2008-09-15T21:12:00.000-07:00</published><updated>2008-09-15T21:29:49.651-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="script" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title type="text">Git-O-Mator</title><content type="html">Inspired by Rein Henrichs &lt;a href="http://reinh.com/blog/2008/08/27/hack-and-and-ship.html"&gt;Hack &amp;amp;&amp;amp; Ship&lt;/a&gt;, I have created Git-O-Mator.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Git-O-Mator is more name than these 2 simple scripts deserve, but what fun is naming small?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/jpease/git-o-mator"&gt;Git-O-Mator can be found on GitHub&lt;/a&gt;, and contains the scripts new_repo and hack.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;New_repo&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;New_repo was originally mentioned in the last blog post "&lt;a href="http://jit.nuance9.com/2008/09/quick-remote-git-repository-creation.html"&gt;Quick Remote Git Repository Creation Script&lt;/a&gt;", and has the syntax of:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;new_repo foo&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which will create a Git repository locally and on a remote host account that you configure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Hack&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Hack is very similar to Hack &amp;amp;&amp;amp; Ship.  Syntax is:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack on&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will automatically switch to the default branch which you can easily configure. Alternatively you can use:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack on foo&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Where "foo" is the name of the specific branch you wish to use.  If the branch does not exist, it is created.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To rebase with the master, you have:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack sync&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To merge and push to your remote repository:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack push&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It also supports Rein's ssp (Simple Software Process) with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack ssp&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is equivalent to hack sync &amp;amp;&amp;amp; hack push.  If you prefer hack sync &amp;amp;&amp;amp; rake &amp;amp;&amp;amp; hack push, then you may use the -t flag for testing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;hack ssp -t&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Silly little experiment.  If you see room for improvement, feel free to fork and improve!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7295859931808804023?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=Bu31koXKxmk:bAcefcJIkM4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=Bu31koXKxmk:bAcefcJIkM4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=Bu31koXKxmk:bAcefcJIkM4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=Bu31koXKxmk:bAcefcJIkM4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=Bu31koXKxmk:bAcefcJIkM4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=Bu31koXKxmk:bAcefcJIkM4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=Bu31koXKxmk:bAcefcJIkM4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7295859931808804023/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7295859931808804023" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7295859931808804023" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7295859931808804023" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/Bu31koXKxmk/git-o-mator.html" title="Git-O-Mator" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/09/git-o-mator.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-8656493293512869240</id><published>2008-09-13T14:04:00.001-07:00</published><updated>2008-09-14T16:36:34.336-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scm" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="script" /><title type="text">Quick Remote Git Repository Creation Script</title><content type="html">If you are using &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; for your source code management, &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt; is an awesome tool.  It especially shines for public projects where you freely allow others to fork your code and possibly pull patches back in.&lt;br /&gt;&lt;br /&gt;Sometimes I'm just working on a project that I would prefer to keep in a private repository.  GitHub provides paying accounts with such an option.  However, I already have hosting accounts that are terribly underused.  Here is a little script I use to create a remote git repository on one of my VPS accounts that I can then pull from and push to.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Prerequisites&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;A hosting account  which you can ssh / scp into.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;The Script&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$ vim new_repo&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#! /bin/sh&lt;br /&gt;PWD=`pwd`&lt;br /&gt;&lt;br /&gt;# You must adjust these variables for your specifc hosting account.&lt;br /&gt;# Remote user you will connect as.&lt;br /&gt;REMOTE_USER="admin"&lt;br /&gt;# The IP address you will SSH / SCP to.&lt;br /&gt;REMOTE_HOST="123.456.123.456"&lt;br /&gt;# The remote path you wish to store your .git repositories in.&lt;br /&gt;REMOTE_REPO_PATH="/home/admin/repos/"&lt;br /&gt;&lt;br /&gt;if [ -d $1 ]; then&lt;br /&gt;  echo "EXITING: Local directory '$1' already exists."&lt;br /&gt;  exit 0&lt;br /&gt;else&lt;br /&gt;  mkdir $1&lt;br /&gt;  cd $1&lt;br /&gt;  git init-db&lt;br /&gt;  touch README&lt;br /&gt;  git add .&lt;br /&gt;  git commit -m "Initial Repository Creation"&lt;br /&gt;  cd ..&lt;br /&gt;  git clone --bare $1/.git $1.git&lt;br /&gt;  echo "** Copying new repository $1.git to $REMOTE_HOST:$REMOTE_REPO_PATH"&lt;br /&gt;  scp -r $1.git $REMOTE_USER@$REMOTE_HOST:$REMOTE_REPO_PATH&lt;br /&gt;  rm -rf $1.git&lt;br /&gt;  rm -rf $1&lt;br /&gt;  echo "** Cloning locally at $PWD/$1"&lt;br /&gt;  git clone $REMOTE_USER@$REMOTE_HOST:$REMOTE_REPO_PATH$1.git&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Or get it from GitHub&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/jpease/git-o-mator"&gt;http://github.com/jpease/git-o-mator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Configuration&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Of course, you will need to REMOTE_USER="admin" with an actual user on your hosting account, adjust REMOTE_HOST="123.456.123.456" to point to your accounts IP address, and edit REMOTE_REPO_PATH="/home/admin/repos/" with whatever path you wish to contain your Git repositories.&lt;br /&gt;&lt;br /&gt;Once that is done, provide executable permissions.&lt;br /&gt;&lt;br /&gt;$ chmod +x new_repo&lt;br /&gt;&lt;br /&gt;That's it.  Now if you execute:&lt;br /&gt;&lt;br /&gt;$ ./new_repo testing&lt;br /&gt;&lt;br /&gt;You will end up with /home/user/repos/testing.git on your remote host, and ./testing locally.  From ./testing you can git push  to send commits to the remote repository, and git pull to retrieve from the remote repository.&lt;br /&gt;&lt;br /&gt;If you see room for improvement, I'm sure there is some, please leave a comment with your revision!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-8656493293512869240?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=BHgwM69IOkw:ti7uVHdXqHk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=BHgwM69IOkw:ti7uVHdXqHk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=BHgwM69IOkw:ti7uVHdXqHk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=BHgwM69IOkw:ti7uVHdXqHk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=BHgwM69IOkw:ti7uVHdXqHk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=BHgwM69IOkw:ti7uVHdXqHk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=BHgwM69IOkw:ti7uVHdXqHk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/8656493293512869240/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=8656493293512869240" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8656493293512869240" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8656493293512869240" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/BHgwM69IOkw/quick-remote-git-repository-creation.html" title="Quick Remote Git Repository Creation Script" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/09/quick-remote-git-repository-creation.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7986871017989018432</id><published>2008-08-30T19:43:00.000-07:00</published><updated>2008-08-31T09:37:35.972-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="install" /><category scheme="http://www.blogger.com/atom/ns#" term="nginx" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><category scheme="http://www.blogger.com/atom/ns#" term="leopard" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><title type="text">Compiling Nginx on OS X Leopard in 5 minutes</title><content type="html">I went to compile Nginx on my laptop this evening, and couldn't find a how-to for Leopard.  Well at least not on the first page or 2 of search results.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Danger Weary Traveller!&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;I happen to be running OS X version 10.5.4 build 9E17.  &lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are running something different, these directions may fail.  In fact, for all I know your computer may actually blow-up.  Yes, as in burst into flames and melt into a smoldering heap of plastic mush.  Compiling stuff really is that scary.  Hide the children.  Don eye protection.&lt;br /&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;False Advertising Disclaimer&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Whether it will really take &lt;span class="Apple-style-span" style="font-style: italic; "&gt;you&lt;/span&gt; 5 minutes or not probably depends on your processor and whether or not your copy &amp;amp; paste skills are up to par.  But seriously, it took me longer to write this post than to do the actual install.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Related Sites&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://nginx.net/"&gt;Official Nginx Site&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.codemongers.com/"&gt;Nginx Wiki&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pcre.org/"&gt;Official PCRE Site&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Satisfy PCRE Dependency&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Nginx requires PCRE to be installed.  PCRE stands for Prank Calling Really is Evil, or something like that.  But whatever it is, Nginx thinks it just can't live without it.&lt;br /&gt;&lt;br /&gt;$ sudo mkdir -p /usr/local/src&lt;br /&gt;$ cd /usr/local/src&lt;br /&gt;$ curl -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz&lt;br /&gt;$ tar xvfz pcre-7.7.tar.gz&lt;br /&gt;$ cd pcre-7.7&lt;br /&gt;$ ./configure --prefix=/usr/local&lt;br /&gt;$ make&lt;br /&gt;$ sudo make install&lt;br /&gt;$ cd ..&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Install Nginx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;$ curl -O http://sysoev.ru/nginx/nginx-0.6.32.tar.gz&lt;br /&gt;$ tar xvfz nginx-0.6.32.tar.gz&lt;br /&gt;$ cd nginx-0.6.32&lt;br /&gt;$ ./configure --prefix=/usr/local --with-http_ssl_module&lt;br /&gt;$ make&lt;br /&gt;$ sudo make install&lt;br /&gt;&lt;br /&gt;Now if you ask:&lt;br /&gt;&lt;br /&gt;$ which nginx&lt;br /&gt;&lt;br /&gt;You should receive the answer /usr/local/sbin/nginx&lt;br /&gt;&lt;br /&gt;If not, you probably need to add /usr/local to your PATH.&lt;br /&gt;&lt;br /&gt;Nginx will setup a default index.html file in /usr/local/html.  The default nginx.conf file will be in /usr/local/conf and will be set to serve this index.html file.  To start Nginx:&lt;br /&gt;&lt;br /&gt;$ sudo nginx&lt;br /&gt;&lt;br /&gt;And finally, to see the fruits of your labors open your favorite browser and navigate to http://localhost&lt;br /&gt;&lt;br /&gt;Next you get to configure Nginx to serve up whatever it is you want to serve.  But that search query will already provide you with many, many results...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7986871017989018432?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=4CvH7qho9D0:d-cqUlQ9SJA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=4CvH7qho9D0:d-cqUlQ9SJA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=4CvH7qho9D0:d-cqUlQ9SJA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=4CvH7qho9D0:d-cqUlQ9SJA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=4CvH7qho9D0:d-cqUlQ9SJA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=4CvH7qho9D0:d-cqUlQ9SJA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=4CvH7qho9D0:d-cqUlQ9SJA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7986871017989018432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7986871017989018432" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7986871017989018432" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7986871017989018432" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/4CvH7qho9D0/compiling-nginx-on-os-x-leopard-in-5.html" title="Compiling Nginx on OS X Leopard in 5 minutes" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/08/compiling-nginx-on-os-x-leopard-in-5.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7539126679171872384</id><published>2008-07-16T08:45:00.000-07:00</published><updated>2008-07-16T08:49:08.968-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="education" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title type="text">The Real Goal of Education</title><content type="html">Is education about memorizing facts?  No, it's about learning to learn.  It's about learning how to think.&lt;br /&gt;&lt;br /&gt;"...developers today code in something called Python, but when I was in school C was all the rage.&lt;span style="font-weight:bold;"&gt; The need for reasoning, though, remains constant&lt;/span&gt;..." - &lt;a href="http://feeds.feedburner.com/~r/blogspot/MKuf/~3/336599275/our-googley-advice-to-students-major-in.html"&gt;Our Googley advice to students: Major in learning &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7539126679171872384?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=marhISnfV4M:gAWWsCFxJSQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=marhISnfV4M:gAWWsCFxJSQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=marhISnfV4M:gAWWsCFxJSQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=marhISnfV4M:gAWWsCFxJSQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=marhISnfV4M:gAWWsCFxJSQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=marhISnfV4M:gAWWsCFxJSQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=marhISnfV4M:gAWWsCFxJSQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7539126679171872384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7539126679171872384" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7539126679171872384" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7539126679171872384" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/marhISnfV4M/real-goal-of-education.html" title="The Real Goal of Education" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/07/real-goal-of-education.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7296234539895008025</id><published>2008-06-23T18:55:00.001-07:00</published><updated>2008-06-23T19:11:46.405-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="datamapper" /><title type="text">DataMapper: Many-to-many</title><content type="html">You can define many-to-many associations using this syntax:&lt;br /&gt;&lt;br /&gt;#item.rb&lt;br /&gt;has n, :things, :through =&gt; Resource&lt;br /&gt;&lt;br /&gt;#thing.rb&lt;br /&gt;has n, :items, :through =&gt; Resource&lt;br /&gt;&lt;br /&gt;In this case it will create a table items_things to manage the assignments.  Easy enough.  Depending on the relationship you are mapping out, it may make more sense to use the :through =&gt; :model syntax.&lt;br /&gt;&lt;br /&gt;Now if you create an instance of an Item, you will get a method "things=".  At first I thought this would be how you would assign a new Thing to your Item.  Such as:&lt;br /&gt;&lt;br /&gt;@item = Item.get(1)&lt;br /&gt;@thing = Thing.get(1)&lt;br /&gt;@item.things = @thing&lt;br /&gt;&lt;br /&gt;FAIL!  If you try adding a single Thing to your Item with this method you will receive a failure that the class you sent did not have a map method defined.  Ah, ok.   That makes sense, things= is obviously plural and will want an array of things.  So how do you assign just one thing?&lt;br /&gt;&lt;br /&gt;If you are unsure, a handy tool is to remember the "methods" method.  So in this case you can try out:&lt;br /&gt;&lt;br /&gt;@item.methods&lt;br /&gt;&lt;br /&gt;You will see that you have not only a "things=" method, but also a plain old "things" method.  If you try:&lt;br /&gt;&lt;br /&gt;@item.things.methods&lt;br /&gt;&lt;br /&gt;You will see that you have a &lt;&lt; method, as should be expected.  So to add our single Thing to our Item we do:&lt;br /&gt;&lt;br /&gt;@item.things &lt;&lt; @thing&lt;br /&gt;&lt;br /&gt;That's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7296234539895008025?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=nMBo7jta6_o:-KwDCcQBZC4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=nMBo7jta6_o:-KwDCcQBZC4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=nMBo7jta6_o:-KwDCcQBZC4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=nMBo7jta6_o:-KwDCcQBZC4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=nMBo7jta6_o:-KwDCcQBZC4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=nMBo7jta6_o:-KwDCcQBZC4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=nMBo7jta6_o:-KwDCcQBZC4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7296234539895008025/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7296234539895008025" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7296234539895008025" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7296234539895008025" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/nMBo7jta6_o/datamapper-many-to-many.html" title="DataMapper: Many-to-many" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/06/datamapper-many-to-many.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-2071619242030888669</id><published>2008-06-06T20:08:00.000-07:00</published><updated>2008-06-06T20:15:33.052-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="orm" /><category scheme="http://www.blogger.com/atom/ns#" term="datamapper" /><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title type="text">DataMapper: Parent / Child Relationship</title><content type="html">I couldn't find an example at datamapper.org /docs for a parent child relationship.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a little searching, I found the answer in the &lt;a href="http://github.com/sam/dm-core/tree/master/spec/integration/association_spec.rb"&gt;integration tests&lt;/a&gt;.  Here is the example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; class Node&lt;br /&gt;   include DataMapper::Resource&lt;br /&gt;&lt;br /&gt;   def self.default_repository_name&lt;br /&gt;     ADAPTER&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   property :id, Integer, :serial =&gt; true&lt;br /&gt;   property :name, String&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;     has n, :children, :class_name =&gt; 'Node', :child_key =&gt; [ :parent_id ]&lt;br /&gt;   belongs_to :parent, :class_name =&gt; 'Node', :child_key =&gt; [ :parent_id ]&lt;/span&gt;&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Hope that helps someone else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-2071619242030888669?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=yOEzmhxQUFg:jPg3op2EC08:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=yOEzmhxQUFg:jPg3op2EC08:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=yOEzmhxQUFg:jPg3op2EC08:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=yOEzmhxQUFg:jPg3op2EC08:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=yOEzmhxQUFg:jPg3op2EC08:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=yOEzmhxQUFg:jPg3op2EC08:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=yOEzmhxQUFg:jPg3op2EC08:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/2071619242030888669/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=2071619242030888669" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2071619242030888669" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2071619242030888669" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/yOEzmhxQUFg/datamapper-parent-child-relationship.html" title="DataMapper: Parent / Child Relationship" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/06/datamapper-parent-child-relationship.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-2169472109761623914</id><published>2008-03-13T15:33:00.000-07:00</published><updated>2008-03-13T15:43:41.307-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><title type="text">Marshal data too short</title><content type="html">If you marshal data and then store it in a DB, make sure to either base64 encode it or store it in a binary data type (such as BLOB), otherwise it will probably cause errors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-2169472109761623914?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=fAO2WhHwn3w:GVUdoC5I5CY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=fAO2WhHwn3w:GVUdoC5I5CY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=fAO2WhHwn3w:GVUdoC5I5CY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=fAO2WhHwn3w:GVUdoC5I5CY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=fAO2WhHwn3w:GVUdoC5I5CY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=fAO2WhHwn3w:GVUdoC5I5CY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=fAO2WhHwn3w:GVUdoC5I5CY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/2169472109761623914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=2169472109761623914" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2169472109761623914" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2169472109761623914" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/fAO2WhHwn3w/marshal-data-too-short.html" title="Marshal data too short" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/03/marshal-data-too-short.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-8888189073701350254</id><published>2008-03-03T10:00:00.000-08:00</published><updated>2008-02-29T13:06:16.957-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Merb Monday: Vacation Edition</title><content type="html">I'm on vacation visiting family (with limited Internet access).  Back to semi-normal next week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-8888189073701350254?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=z7TqS7vTdLA:ZfiU6sKbYm0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=z7TqS7vTdLA:ZfiU6sKbYm0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=z7TqS7vTdLA:ZfiU6sKbYm0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=z7TqS7vTdLA:ZfiU6sKbYm0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=z7TqS7vTdLA:ZfiU6sKbYm0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=z7TqS7vTdLA:ZfiU6sKbYm0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=z7TqS7vTdLA:ZfiU6sKbYm0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/8888189073701350254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=8888189073701350254" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8888189073701350254" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/8888189073701350254" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/z7TqS7vTdLA/merb-monday-vacation-edition.html" title="Merb Monday: Vacation Edition" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/03/merb-monday-vacation-edition.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7804365641224006792</id><published>2008-02-25T13:27:00.000-08:00</published><updated>2008-02-25T13:47:44.062-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Merb Monday: The Leap Year Edition</title><content type="html">&lt;span style="font-weight: bold;font-size:130%;" &gt;News&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.merbivore.com/documentation.html"&gt;Official documentation&lt;/a&gt; has been updated to include 0.9.  Still a little light, but coming along.  If you would like to help, &lt;a href="http://gweezlebur.com/2008/2/1/so-you-want-to-contribute-to-merb-core-part-1"&gt;create your own git branch&lt;/a&gt; and have at it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gweezlebur.com/2008/2/19/michael-has_baby-true"&gt;Ivey had a baby&lt;/a&gt;.  Congratulations!&lt;br /&gt;&lt;br /&gt;Expect 0.9.1 (developer release) today (or soon).&lt;br /&gt;&lt;br /&gt;You get an "extra" day this week.  Use it wisely.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Teaser&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Code name: &lt;a href="http://github.com/wvl/merb_demos/tree/master"&gt;Merblets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q&amp;amp;A&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q: &lt;/span&gt;What!?  No RJS?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A:&lt;/span&gt; You can do anything rjs can do with *.js.erb templates (&lt;span style="font-style: italic;"&gt;Answer by ezmobius&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; I read that Merb is template agnostic. What templates languages do I have available?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; erb out of the box (erubis), haml (merb_haml as a dependency in init.rb), markaby (&lt;span style="font-style: italic;"&gt;Answer by sqred&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; What does a named route in Merb look like?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; r.match("/login").to(:controller =&gt; "Sessions", :action =&gt; "new").name(:login)&lt;br /&gt;(&lt;span style="font-style: italic;"&gt;Answer by jodo&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Does Merb have a debugger tool?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A:&lt;/span&gt; You can use ruby-debug.  Start Merb with the -D option to enable ruby-debug support.&lt;br /&gt;Enter "debugger" somewhere in your code as a breakpoint.  (&lt;span style="font-style: italic;"&gt;Answer by jdempsey&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q: &lt;/span&gt;How do I find out what version of Merb I'm using?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; merb -v (&lt;span style="font-style: italic;"&gt;Answer by ezmobius&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; How can I see the current routes?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; merb -i&lt;br /&gt;      merb.show_routes&lt;br /&gt;      (&lt;span style="font-style: italic;"&gt;Answer by ezmobius&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Can the cookie session be used for large production apps?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; As long as you don't store really sensitive info in the session then cookie sessions are fine (&lt;span style="font-style: italic;"&gt;Answer by ezmobius&lt;/span&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7804365641224006792?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=dN3SfP5OqRA:pMaoRsdb3ns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=dN3SfP5OqRA:pMaoRsdb3ns:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=dN3SfP5OqRA:pMaoRsdb3ns:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=dN3SfP5OqRA:pMaoRsdb3ns:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=dN3SfP5OqRA:pMaoRsdb3ns:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=dN3SfP5OqRA:pMaoRsdb3ns:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=dN3SfP5OqRA:pMaoRsdb3ns:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7804365641224006792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7804365641224006792" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7804365641224006792" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7804365641224006792" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/dN3SfP5OqRA/merb-monday-leap-year-edition.html" title="Merb Monday: The Leap Year Edition" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/02/merb-monday-leap-year-edition.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-1059409778585858816</id><published>2008-02-18T14:47:00.000-08:00</published><updated>2008-02-18T15:15:59.433-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Merb Monday: State of flux</title><content type="html">This week's edition is a little short.  Certainly not for lack of activity in #merb, but due to the continued disturbance in the force caused by the 0.9 transition.&lt;br /&gt;&lt;br /&gt;0.5 to 0.9 is a big jump (no wonder they skipped 0.6, 0.7 and 0.8!)  Most of the discussion this week continued to be related to the transition to 0.9 and trouble ticket type "stuff".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;News&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gweezlebur.com/2008/2/14/merb-0-9-0-released-kinda"&gt;0.9 was released (kinda)&lt;/a&gt;, however this is a "developer" release and still has some wrinkles to be ironed out before a general public release will be pushed to RubyForge.  If you are anxious to give it a spin, check &lt;a href="http://merbivore.com/get_merb.html#stable"&gt;Merbivore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It looks like there will likely be a 0.9.1 "developer" release in the near future.  Once we get to a 0.9.x general public release things should settle down and this series should get back to normal.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rubyforge.org/projects/merbful-auth/"&gt;merbful_authentication&lt;/a&gt; should soon be updated to be compatible with 0.9.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Required Reading&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;0.9 introduces some really cool changes.  One of those is Rack integration.  You should read Ezra's post "&lt;a href="http://brainspl.at/articles/2008/02/16/so-merb-core-is-built-on-rack-you-say-why-should-i-care"&gt;So merb-core is built on rack you say? Why should I care?&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; If I use ActiveRecord as the ORM, do I then use ActiveRecord's migrations (and its syntax) by default?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Yes.  You can use ActiveRecord with Merb as you would with Rails.  (&lt;span style="font-style: italic;"&gt;Answer by amoeba&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; How do you generate an app in Merb 0.9?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; ./script/generate is gone.  In it's place now lives merb-gen.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;merb-gen myapp # a normal merb app&lt;br /&gt;&lt;br /&gt;merb-gen myapp --flat # a flattened app&lt;br /&gt;&lt;br /&gt;merb-gen myapp --very-flat # a single-file app&lt;/code&gt;&lt;/blockquote&gt;(&lt;span style="font-style: italic;"&gt;Answer by ivey&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Answer Of The Week&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;And the answer to many of the questions this week which followed the format of:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; _____________________ in Merb 0.9?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; "It's not in -core anymore" (&lt;span style="font-style: italic;"&gt;Answer by ivey&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Audience Participation&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Assuming you are using ActiveRecord with Merb, how can you share models with a Rails application?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you leave your answer in the comments, I'll post it next week.  (&lt;a href="http://railspikes.com/2007/4/1/merb"&gt;hint&lt;/a&gt;) (&lt;span style="font-style: italic;"&gt;Question &amp;amp; link by seebg&lt;/span&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-1059409778585858816?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=GMlnzPj7LI0:4FcKhhMCKTQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=GMlnzPj7LI0:4FcKhhMCKTQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=GMlnzPj7LI0:4FcKhhMCKTQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=GMlnzPj7LI0:4FcKhhMCKTQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=GMlnzPj7LI0:4FcKhhMCKTQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=GMlnzPj7LI0:4FcKhhMCKTQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=GMlnzPj7LI0:4FcKhhMCKTQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/1059409778585858816/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=1059409778585858816" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1059409778585858816" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1059409778585858816" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/GMlnzPj7LI0/merb-monday-state-of-flux.html" title="Merb Monday: State of flux" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/02/merb-monday-state-of-flux.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-4471911985405373941</id><published>2008-02-11T06:37:00.000-08:00</published><updated>2008-02-11T11:38:56.433-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Merb Monday: "That's the spirit"</title><content type="html">Tidbits from #merb for the week of Feb 4 - Feb 10.&lt;br /&gt;&lt;br /&gt;A lot of the conversation this week revolved around the pre 0.9 release.  Many of the questions involved bugs or other issues that one can expect in a pre-release.  In general I didn't include them as they will quickly be outdated and likely be of little on going value.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; How do I install (freeze) gems within my application?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Navigate to the root of your Merb application.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;gem install foo -i gems&lt;/code&gt;&lt;/blockquote&gt;In your merb.yml file include a line:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;dependency "foo"&lt;/code&gt;&lt;/blockquote&gt;(&lt;span style="font-style: italic;"&gt;Answer by wycats&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q: &lt;/span&gt;How do I support a new MIME type?  Say for an Atom feed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; &lt;blockquote&gt;&lt;code&gt;Merb.add_mime_type(:atom,:to_atom,%w[application/x-atom])&lt;/code&gt;&lt;/blockquote&gt;Replace application/x-atom with whatever the correct header for atom is then make a template: foo.atom.erb&lt;br /&gt;&lt;br /&gt;In your controller, use:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;provides :atom&lt;/code&gt;&lt;/blockquote&gt;(&lt;span style="font-style: italic;"&gt;Answer by ezmobius&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Where could I define a constant which would then be accessible in different views, but should have a different value depending on the environment merb is running in?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; config/environment/*.rb where * represents the desired environment, for example development.rb.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; How do I find the current controller and action in the view?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A: &lt;/span&gt;&lt;/span&gt;In a helper you could create the two following methods.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;def controller_name&lt;br /&gt;controller.request.controller_name.split('_').first&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def action_name&lt;br /&gt;controller.request.action&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;(&lt;span style="font-style: italic;"&gt;Answer by slurry&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; What happened to MERB_ENV?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A:&lt;/span&gt; Merb's application constants have been re-factored as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;Old  constant        : New method&lt;br /&gt;&lt;br /&gt;MERB_FRAMEWORK_ROOT  :  Merb.framework_root&lt;br /&gt;MERB_ROOT                                          :  Merb.root&lt;br /&gt;MERB_VIEW_ROOT                      :  Merb.view_path&lt;br /&gt;MERB_SKELETON_DIR     :  Merb.skeleton_path&lt;br /&gt;MERB_LOGGER                                 :  Merb.logger&lt;br /&gt;MERB_PATHS                                      :  Merb.load_paths&lt;br /&gt;MERB_ENV                                              :  Merb.environment&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;(&lt;span style="font-style: italic;"&gt;Answer by slurry&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Is there a way to list all the generators available?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A: &lt;/span&gt;&lt;/span&gt;ruby ./script/generate&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Where is the source now?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; The Merb project has switched from using SVN to Git for source code management.  With that change the source is now at &lt;a href="http://www.github.com/"&gt;Github&lt;/a&gt;.  Specifically you will want to use wycats repo, which you can find at:  git://github.com/wycats/&lt;br /&gt;&lt;br /&gt;The source code is broken down into merb-core, merb-more, and merb-plugins.&lt;br /&gt;&lt;br /&gt;For more information on how to work with Git, see "&lt;a href="http://gweezlebur.com/2008/2/1/so-you-want-to-contribute-to-merb-core-part-1"&gt;So you want to contribute to Merb-core&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Once you have cloned the Git repos to your local system, you will then move into that directory and issue a "rake install" command to build the gem.&lt;br /&gt;(&lt;span style="font-style: italic;"&gt;Answer by ivey&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Where are bugs / tickets being tracked now?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Along with the move to Github, bugs and ticket tracking has been moved from DevJaVu over to Lighthouse, specifically at &lt;a href="http://merb.lighthouseapp.com/"&gt;merb.lighthouseapp.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Answer of the week&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is one little snippet of conversation that may provide the answer regardless of your specific problem:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Can I do _____________?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;hassox&lt;/u&gt;: I guess so&lt;br /&gt;&lt;u&gt;hassox&lt;/u&gt;: but I can't really help you on it...&lt;br /&gt;&lt;u&gt;grrt&lt;/u&gt;: :) I'll see how far I get&lt;br /&gt;&lt;u&gt;hassox&lt;/u&gt;: that's the spirit :)&lt;br /&gt;&lt;u&gt;grrt&lt;/u&gt;: it's great to just explore&lt;br /&gt;&lt;br /&gt;Sometimes it's best to just try something out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Audience Participation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Q:&lt;/span&gt; Merb-core has methods "render" and "display".  What's the difference?  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Leave your answer in the comments.  (&lt;a href="http://github.com/wycats/merb-core/tree/master/docs/new_render_api"&gt;Hint&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-4471911985405373941?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=MERv7uxWP0Y:M2tZHyWKy2k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=MERv7uxWP0Y:M2tZHyWKy2k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=MERv7uxWP0Y:M2tZHyWKy2k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=MERv7uxWP0Y:M2tZHyWKy2k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=MERv7uxWP0Y:M2tZHyWKy2k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=MERv7uxWP0Y:M2tZHyWKy2k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=MERv7uxWP0Y:M2tZHyWKy2k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/4471911985405373941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=4471911985405373941" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/4471911985405373941" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/4471911985405373941" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/MERv7uxWP0Y/merb-monday-thats-spirit.html" title="Merb Monday: &quot;That's the spirit&quot;" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/02/merb-monday-thats-spirit.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7470260885734899344</id><published>2008-02-04T11:00:00.000-08:00</published><updated>2008-02-04T09:52:18.069-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web worker" /><title type="text">Working Remotely: The "Get Real" List.</title><content type="html">Every once in a while a post shows up on Digg or elsewhere about how to work remotely.  Often it will be phrased like "How to work from the beach".&lt;br /&gt;&lt;br /&gt;After reading these lists, I can't help put wonder... "do any of these people have any idea what they are talking about?"&lt;br /&gt;&lt;br /&gt;Most of these articles are nothing more than recommendations for various online applications from flickr to mozy to zoho - which in my opinion have nothing to do with your ability to work remotely or not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;My Credentials&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I lived in Cerro Punta, Chiriqui, Panama for 14 months.  That's up in the mountains... in Central America... where most people don't have telephone service... or refrigerators.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;How To Really Work Remotely&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;(from the beach or wherever you want)&lt;br /&gt;The ability to do this has nothing to do with online applications.  Here are the seven requirements that I needed:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Laptop&lt;/span&gt;&lt;br /&gt;A laptop is the tool of choice for a number of reasons.  It is easy to transport to your destination.  If the power goes out, you still can work (and hopefully it will come back on before your battery dies).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Battery Back-Up / UPS / Surge Protector&lt;/span&gt;&lt;br /&gt;With a laptop, the battery back-up portion may not be as critical - but you definitely will want to have all of your hardware plugged in to quality surge protector.  Surges happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Data Back-Up&lt;/span&gt;&lt;br /&gt;Your business likely depends upon your data.  Get an external drive and make sure you are regularly backing up your data.  As a second step, an internet based back-up can't hurt.  But with a slower Internet connection (or even a fast one) this may be a slow way to recover your data in case of a catastrophe, and thus I wouldn't recommend it as your only back up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Internet&lt;/span&gt;&lt;br /&gt;The Internet itself, not the online applications, is your connection to the outside world.  Depending on your specific usage, the speed and reliability required will vary.  You may also wish to secure two means of connection, as the reliability may be less than you are used to.  I was able to secure a cellular based service (advertised at 256K, but more like 56-128k down/15k up), and also a wireless service (1MB up/down).  The cell service was slow, but cool that it basically worked country-wide (yes, even at the beach).  Between the two I was able to have very reliable service and even good enough quality for VoIP phone calls.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) Phone number&lt;/span&gt;&lt;br /&gt;You (likely) need a phone number that can follow you wherever you happen to be.  I used Packet8's VoIP service for my business line.  This meant I could simply plug my little VoIP box into my router in Panama, and all my incoming / outgoing calls went through my TX number.  Skype also worked pretty well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) A local relative / friend&lt;/span&gt;&lt;br /&gt;Mail still needed to be picked up from my PO Box.  Checks still needed to be deposited in my Bank account.  Having a trustworthy person that you are able to turn these simple, but important, tasks over to will be a huge help.  There are mail processing services available, but not in every city (or even state).  Having clients send mail to an address in a different state might make them uncomfortable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) A business / job that does not require your physical presence&lt;/span&gt;&lt;br /&gt;In the end this is the one that didn't work out.  My line of work lends itself to remote work extremely well.  Even when I am local, in person contact is very limited during the course of a project.  The problem that arose was the initial phase of acquiring new projects.  I would get leads, perform the initial interviews &amp;amp; evaluations, compile a proposal and even get the proposal accepted.  But then many clients would want to meet face to face to sign the contract.  Obviously this won't be true for every business, or geographical location, but for my principally Texas based clients this became a sticking point.&lt;br /&gt;&lt;br /&gt;So that's what worked for me.  For 14 months.  In a cloud forest in Central America.  And amazingly I didn't need any online applications to do it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7470260885734899344?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T44SurdaEmc:KMA7uuZrqO4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T44SurdaEmc:KMA7uuZrqO4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T44SurdaEmc:KMA7uuZrqO4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T44SurdaEmc:KMA7uuZrqO4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T44SurdaEmc:KMA7uuZrqO4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T44SurdaEmc:KMA7uuZrqO4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T44SurdaEmc:KMA7uuZrqO4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7470260885734899344/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7470260885734899344" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7470260885734899344" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7470260885734899344" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/T44SurdaEmc/working-remotely-get-real-list.html" title="Working Remotely: The &quot;Get Real&quot; List." /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/02/working-remotely-get-real-list.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-1050600569932261377</id><published>2008-02-04T09:00:00.000-08:00</published><updated>2008-02-04T07:27:36.526-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Merb Monday: Environment variables, partials, etc.</title><content type="html">I see a lot questions asked and answered in the #merb IRC room.&lt;br /&gt;&lt;br /&gt;Many of them are questions that later I wish I remembered the answer to!  So I'm going to try to keep track of questions I see asked and answered and record them here for the benefit of myself and others, and hopefully publish them here every Monday.&lt;br /&gt;&lt;br /&gt;I might re-phrase the questions and answers slightly, as the writing tends to be quite terse on IRC.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: &lt;span style="font-size:100%;"&gt;How do you check the current environment in Merb? I'm looking for the Merb equivalent to RAILS_ENV.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Merb.environment &lt;span style="font-style: italic;"&gt;(Answered by: Booster)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: How do you render partials?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; You use the &lt;a href="http://merb.rubyforge.org/classes/Merb/RenderMixin.html#M000128"&gt;partial&lt;/a&gt; method.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Scenario 1&lt;/u&gt;: You wish to render a partial template found in the same directory as your action's view template.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;partial :foo&lt;/code&gt;&lt;/blockquote&gt;This will look in the current directory for a file named _foo.html.erb&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Scenario 2&lt;/u&gt;: You wish to render a partial template found in a different directory than the action's view template.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;partial 'common/foo'&lt;/code&gt;&lt;/blockquote&gt;This will look for the file views/common/_foo.html.erb&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(Answered by: jp_n9)&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: I'm trying to run my db:migrate and I'm getting a "no such file to load -- spec/rake/spectask" error.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Make sure you have the rspec gem installed.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;sudo gem install rspec&lt;/code&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;(Answered by: octopod)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: How do I start merb in production mode?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Use the -e option.  For example,&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;merb -e production&lt;/code&gt;&lt;/blockquote&gt;For a complete list of parameters type:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;merb --help&lt;/code&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;(Answered by: Phoop)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: How do I get Merb to log data to the log file?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Make sure that you start Merb as a daemon with the -d directive, this will cause output to be logged to the log file located in the log/ directory (instead of being output to the console window).&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;merb -d&lt;/code&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;(Answered by: ezmobius)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: How can I use HAML for my templates?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A:&lt;/span&gt;&lt;/span&gt; Name your files with the .html.haml extension instead of the default .html.erb extension.&lt;br /&gt;&lt;br /&gt;Example: name.html.haml&lt;br /&gt;&lt;br /&gt;Second, you need to edit dependencies.rb to include the line:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;dependency "haml"&lt;/code&gt;&lt;/blockquote&gt;You will also need to have the haml gem installed on your system.  Restarting Merb will also likely be required. &lt;/span&gt;&lt;span style="font-style: italic;"&gt;(Answered by: QaDeS, bradly)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Q: Is there an easy way to get the current URL in a merb view?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A:&lt;/span&gt; I think it's request.uri&lt;/span&gt;&lt;span style="font-style: italic;"&gt; (Answered by: hassox)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;In my  testing the request variable does not appear to be directly available from a view template.  However if you need that information you can easily pass the entire request variable, or just request.uri, into your view from the controller.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-1050600569932261377?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=a-kBwgXx7Ds:fDdBlMDdYMU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=a-kBwgXx7Ds:fDdBlMDdYMU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=a-kBwgXx7Ds:fDdBlMDdYMU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=a-kBwgXx7Ds:fDdBlMDdYMU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=a-kBwgXx7Ds:fDdBlMDdYMU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=a-kBwgXx7Ds:fDdBlMDdYMU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=a-kBwgXx7Ds:fDdBlMDdYMU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/1050600569932261377/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=1050600569932261377" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1050600569932261377" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1050600569932261377" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/a-kBwgXx7Ds/merb-faqs-environment-variables.html" title="Merb Monday: Environment variables, partials, etc." /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/02/merb-faqs-environment-variables.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-1886330569905693811</id><published>2008-01-31T10:09:00.000-08:00</published><updated>2008-01-31T11:36:50.314-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="monit" /><category scheme="http://www.blogger.com/atom/ns#" term="mongrel" /><category scheme="http://www.blogger.com/atom/ns#" term="swiftiply" /><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><title type="text">Monitoring Swiftiply &amp; Merb with Monit</title><content type="html">&lt;a href="http://swiftiply.swiftcore.org/"&gt;Swiftiply&lt;/a&gt; combined with &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt; is a pretty nice way to serve up your application.  And while we hope that both are stable, it would be nice to know that just in case anything went wrong they would restart.  It would also be nice for the application to automatically start upon reboot.&lt;br /&gt;&lt;br /&gt;That is what we are going to attempt to setup using &lt;a href="http://www.tildeslash.com/monit/"&gt;Monit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Prerequisites:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;We assume you already have Swiftiply and Merb setup and functioning properly.  We are also assuming that you have Monit installed and functioning properly.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Versions:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ubuntu 7.10 (Gutsy)&lt;/li&gt;&lt;li&gt;Ruby: 1.8.6&lt;/li&gt;&lt;li&gt;Merb: 0.5.2&lt;/li&gt;&lt;li&gt;Swiftiply: 0.6.1.1&lt;/li&gt;&lt;li&gt;Monit 4.8.1&lt;/li&gt;&lt;li&gt;Assumes your Merb app is "frozen" (rake merb:freeze)&lt;/li&gt;&lt;/ul&gt;Those are the version I was using at the time of the article.  Different versions may lead to varying results.&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Setup Monit To Auto-Start&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/default/monit&lt;/code&gt;&lt;/blockquote&gt;This is a pre-existing file.  Edit as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;startup=1&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Create init script for Swiftiply&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The big problem with trying to monitor Swiftiply was that it does not write a pidfile for Monit to track.  Fortunately someone solved the problem, and Google found it.  Big credit for the script: &lt;a href="http://pastie.textmate.org/107044.txt"&gt;http://pastie.textmate.org/107044.txt&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/init.d/swiftiply&lt;/code&gt;&lt;/blockquote&gt;This will be a new blank file.  Edit as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;function generatepid(){&lt;br /&gt;  current_pid=`pgrep -f 'swiftiply -c /etc/swiftiply.conf'`&lt;br /&gt;  pidfile_pid=`cat /var/run/swiftiply.pid`&lt;br /&gt;&lt;br /&gt;  if [[ $current_pid = '' ]]; then&lt;br /&gt;    rm /var/run/swiftiply.pid&lt;br /&gt;  elif [[ $pidfile_pid != $current_pid ]]; then&lt;br /&gt;    echo $current_pid &gt; /var/run/swiftiply.pid&lt;br /&gt;  fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;&lt;br /&gt;  start)&lt;br /&gt;    echo -n "Starting swiftiply:"&lt;br /&gt;    swiftiply -c /etc/swiftiply.conf&lt;br /&gt;    generatepid&lt;br /&gt;    echo&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  stop)&lt;br /&gt;   echo -n "Stopping swiftiply:"&lt;br /&gt;   killall -9 swiftiply&lt;br /&gt;   generatepid&lt;br /&gt;   echo&lt;br /&gt;   ;;&lt;br /&gt;&lt;br /&gt;  restart)&lt;br /&gt;    $0 stop&lt;br /&gt;    $0 start&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  pid)&lt;br /&gt;    generatepid&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  *)&lt;br /&gt;  echo "usage: $0 [start|stop|restart|pid]"&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;/code&gt;&lt;/blockquote&gt;&lt;div&gt;This does assume that you Swiftiply configuration file is location at /etc/swiftiply.conf, if not change to the correct location.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Create init Script For Your Merb App&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I will use "app1" but you can replace that with whatever name you would like as an identifier for this specific Merb application.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/init.d/merb_app1&lt;/code&gt;&lt;/blockquote&gt;This will be a new blank file.  Edit as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;&lt;br /&gt;  start)&lt;br /&gt;    echo -n "Starting Merb for App1:"&lt;br /&gt;    export SWIFT=1&lt;br /&gt;    export HOME="/home/admin" #Assuming you have a user admin&lt;br /&gt;    cd /full/path/to/your/app/current/&lt;br /&gt;    sudo ./script/merb -d -h 127.0.0.1 -p 30000 -e production&lt;br /&gt;    echo&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  stop)&lt;br /&gt;    echo -n "Stopping Merb for App1:"&lt;br /&gt;    cd /full/path/to/your/app/current/&lt;br /&gt;    sudo ./script/stop_merb&lt;br /&gt;    echo&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  restart)&lt;br /&gt;    $0 stop&lt;br /&gt;    $0 start&lt;br /&gt;    ;;&lt;br /&gt;&lt;br /&gt;  *)&lt;br /&gt;  echo "usage: $0 [start|stop|restart]"&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;/code&gt;&lt;/blockquote&gt;The -p directive should point to the same port that you have configured Swiftiply to listen to for this specific app.  Also, this is assuming that you have Merb frozen.  If not, then you will need to change "./script/merb" and "./script/stop_merb" to their unfrozen counterparts.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Set Permissions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Without these permissions set to execute the init scripts will not work.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo chmod 755 /etc/init.d/swiftiply&lt;br /&gt;&gt; sudo chmod 755 /etc/init.d/merb_app1&lt;/code&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Configure Your Main Monit File&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/monit/monitrc&lt;/code&gt;&lt;/blockquote&gt;Add the following in to the pre-existing configuration:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;  check process swiftiply with pidfile /var/run/swiftiply.pid&lt;br /&gt;  group root&lt;br /&gt;  start program = "/etc/init.d/swiftiply start"&lt;br /&gt;  stop program = "/etc/init.d/swiftiply stop"&lt;br /&gt;  if 5 restarts within 5 cycles then timeout&lt;br /&gt;&lt;br /&gt;include /etc/monit/app1&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Configure App1 Monit File&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You could have just added the following in the main file, but I prefer to use the include statement and keep them in separate files.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/monit/app1&lt;/code&gt;&lt;/blockquote&gt;This will be a new blank file. Edit as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt; check process merb_app1  &lt;br /&gt;  with pidfile /full/path/to/your/app/current/log/merb.30000.pid  &lt;br /&gt;  start program = "/etc/init.d/merb_app1 start"&lt;br /&gt;  stop program = "/etc/init.d/merb_app1 stop"&lt;br /&gt;  if 5 restarts within 5 cycles then timeout&lt;br /&gt;depends on swiftiply&lt;/code&gt;&lt;/blockquote&gt;30000 should be replaced with the specific port that you have Swiftiply listening on for this application.  The "depends on swiftiply" will make sure that swiftiply is started first.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Does it work?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;It'd take a miracle...&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo monit -t&lt;br /&gt;&gt; sudo /etc/init.d/monit force-reload&lt;br /&gt;&gt; sudo monit validate&lt;br /&gt;&gt; sudo monit summary&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Caveats&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This setup only checks to make sure the processes are up and running.&lt;/div&gt;&lt;div&gt;Right now Merb overwrites log/merb.port#.&lt;port&gt;pid with the last mongrel process started.  &lt;/port&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;port&gt;Unfortunately that means if you start 5 mongrels, you will only have the pid of the last one, and thus will only be able to monitor that one process with Monit.&lt;/port&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the up side, it still means you can guarantee at least one process to be up and responding to requests - which is better than none.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Update&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Merb 0.9 is supposed to add the ability to specify a pidfile which will allow us to monitor multiple Merb processes even on the same port.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Useful?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;If so, why not &lt;a href="http://www.workingwithrails.com/recommendation/new/person/6666-justin-pease"&gt;recommend me on Working With Rails&lt;/a&gt;!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-1886330569905693811?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=J-d__ozd7Yc:c9eryXeaPE0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=J-d__ozd7Yc:c9eryXeaPE0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=J-d__ozd7Yc:c9eryXeaPE0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=J-d__ozd7Yc:c9eryXeaPE0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=J-d__ozd7Yc:c9eryXeaPE0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=J-d__ozd7Yc:c9eryXeaPE0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=J-d__ozd7Yc:c9eryXeaPE0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/1886330569905693811/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=1886330569905693811" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1886330569905693811" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/1886330569905693811" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/J-d__ozd7Yc/monitoring-swiftiply-merb-with-monit.html" title="Monitoring Swiftiply &amp; Merb with Monit" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/01/monitoring-swiftiply-merb-with-monit.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-7725331372171664127</id><published>2008-01-30T08:15:00.000-08:00</published><updated>2008-01-30T08:23:40.764-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><title type="text">Book Review: Programming Erlang</title><content type="html">&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_pGfdZQGFgvE/R6CjM3OC3VI/AAAAAAAAAEY/dOWfL6ABYV4/s320/eralng.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5161304614343204178" /&gt;&lt;div&gt;Author: Joe Armstrong&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Erlang really appears to be an interesting language, and the author's enthusiasm for the subject shows - which is good. It helped me to keep going, when at times the code was a little hard to follow. &lt;br /&gt;&lt;br /&gt;The book does a good job of introducing the language. In particular later chapters give emphasis to the topics of concurrency through multiple processes, multi-cores and distributed programs. All very timely subjects for a world that is connected to the Internet, and where even laptops have multi-core processors &lt;br /&gt;&lt;br /&gt;Unfortunately, I feel the author somewhat forgot his audience. &lt;br /&gt;&lt;br /&gt;On page 5 he starts out with a description that fit me almost perfectly, and probably many other readers: "Once upon a time a programmer came across a book describing a funny programming language. It had an unfamiliar syntax [...] it wasn't even object-oriented. The programs were, well, different....Not only were the programs different, but the whole approach to programming was different." &lt;br /&gt;&lt;br /&gt;After reading the book I don't feel like the "Erlang Master" that the road map described (pg 9). While the syntax is now familiar, I still look at the Erlang code and it feels foreign. I still have to "decipher" the code instead of read it. &lt;br /&gt;&lt;br /&gt;I would have liked the book to more fully address the items from the "Once upon a time" paragraphs. Being that "the whole approach to programming" is different than the OO that many readers are used to, I would have liked to have seen a chapter (or three) on how to best get into that mode of thinking. &lt;br /&gt;&lt;br /&gt;I do think the book is a good jumping off point. It gives you more than enough to get started. &lt;br /&gt;&lt;br /&gt;However, if you are unfamiliar with languages where functions accept functions which also accept functions as parameters and in turn returns another function as a result, you may end up feeling (as I did) that you only have half the puzzle.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-7725331372171664127?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=eMeJxPdBpX8:qV-iEe_XTq8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=eMeJxPdBpX8:qV-iEe_XTq8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=eMeJxPdBpX8:qV-iEe_XTq8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=eMeJxPdBpX8:qV-iEe_XTq8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=eMeJxPdBpX8:qV-iEe_XTq8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=eMeJxPdBpX8:qV-iEe_XTq8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=eMeJxPdBpX8:qV-iEe_XTq8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/7725331372171664127/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=7725331372171664127" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7725331372171664127" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/7725331372171664127" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/eMeJxPdBpX8/book-review-programming-erlang.html" title="Book Review: Programming Erlang" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_pGfdZQGFgvE/R6CjM3OC3VI/AAAAAAAAAEY/dOWfL6ABYV4/s72-c/eralng.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/01/book-review-programming-erlang.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-2215653771648873339</id><published>2008-01-27T11:35:00.000-08:00</published><updated>2008-01-28T16:40:20.078-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="server" /><category scheme="http://www.blogger.com/atom/ns#" term="nginx" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="slicehost" /><title type="text">Serving PHP5 with Nginx on Ubuntu 7.10 (Gutsy)</title><content type="html">There are lots of tutorials out there to setup &lt;a href="http://www.php.net/"&gt;PHP &lt;/a&gt;with &lt;a href="http://www.nginx.net/"&gt;Nginx&lt;/a&gt;.  I'm probably just retarded, but none of them got me to a working system.  A detail left out of one, a configuration file left out of another, etc.&lt;br /&gt;&lt;br /&gt;What follows is exactly what I did to get Nginx to serve PHP5 on a fresh Slicehost VPS slice running Ubuntu 7.10.  Hopefully it will help someone else.&lt;br /&gt;&lt;br /&gt;NOTE: The following commands assume that you have already setup a user account with sudo privileges and are executing the commands as that user, NOT as root.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Update your system and install basic tools required&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo aptitude update -y&lt;br /&gt;&gt; sudo  locale-gen en_GB.UTF-8&lt;br /&gt;&gt; sudo  /usr/sbin/update-locale LANG=en_GB.UTF-8&lt;br /&gt;&gt; sudo  aptitude safe-upgrade -y&lt;br /&gt;&gt; sudo  aptitude full-upgrade -y&lt;br /&gt;&gt; sudo aptitude install build-essential -y&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Install MySQL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo aptitude install mysql-server mysql-client libmysqlclient15-dev -y&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Install PHP5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo aptitude install php5-cli php5-cgi php5-mysql php5-xcache -y&lt;/code&gt;&lt;/blockquote&gt;Note: Xcache is installed at this point and available for you to setup, but by default is not turned on.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Install Nginx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo aptitude install nginx -y&lt;/code&gt;&lt;/blockquote&gt;Go to your IP address and you should now recieve the message "Welcome to nginx!"&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;FastCGI Parameter Configuration&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We will place all of our fastcgi parameters in a single file which we can include in as necessary.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/nginx/fastcgi_params&lt;/code&gt;&lt;/blockquote&gt;This will be a new empty file, add the following and save:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;fastcgi_param  QUERY_STRING       $query_string;&lt;br /&gt;fastcgi_param  REQUEST_METHOD     $request_method;&lt;br /&gt;fastcgi_param  CONTENT_TYPE       $content_type;&lt;br /&gt;fastcgi_param  CONTENT_LENGTH     $content_length;&lt;br /&gt;&lt;br /&gt;fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;&lt;br /&gt;fastcgi_param  REQUEST_URI        $request_uri;&lt;br /&gt;fastcgi_param  DOCUMENT_URI       $document_uri;&lt;br /&gt;fastcgi_param  DOCUMENT_ROOT      $document_root;&lt;br /&gt;fastcgi_param  SERVER_PROTOCOL    $server_protocol;&lt;br /&gt;&lt;br /&gt;fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;&lt;br /&gt;fastcgi_param  SERVER_SOFTWARE    nginx;&lt;br /&gt;&lt;br /&gt;fastcgi_param  REMOTE_ADDR        $remote_addr;&lt;br /&gt;fastcgi_param  REMOTE_PORT        $remote_port;&lt;br /&gt;fastcgi_param  SERVER_ADDR        $server_addr;&lt;br /&gt;fastcgi_param  SERVER_PORT        $server_port;&lt;br /&gt;fastcgi_param  SERVER_NAME        $server_name;&lt;br /&gt;&lt;br /&gt;# PHP only, required if PHP was built with --enable-force-cgi-redirect&lt;br /&gt;# fastcgi_param  REDIRECT_STATUS    200;&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Nginx Configuration&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /etc/nginx/sites-available/default&lt;/code&gt;&lt;/blockquote&gt;This is a pre-existing file.  Find the part that looks similar to the following and edit it as so and save:&lt;blockquote&gt;&lt;code&gt;location ~ \.php$ {&lt;br /&gt;  fastcgi_pass   127.0.0.1:9000;&lt;br /&gt;  fastcgi_index  index.php;&lt;br /&gt;  &lt;nobr&gt;fastcgi_param  SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;&lt;/nobr&gt;&lt;br /&gt;  include /etc/nginx/fastcgi_params;&lt;br /&gt;}&lt;/code&gt;&lt;/blockquote&gt;We need to remember to restart Nginx so that it picks up our configuration changes.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo /etc/init.d/nginx stop&lt;br /&gt;&gt; sudo /etc/init.d/nginx start&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Spawn-fcgi&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We still need a script to start our fast cgi processes.  We will extract one from Lighttpd.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; mkdir ~/sources&lt;br /&gt;&gt; cd ~/sources&lt;br /&gt;&gt; wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2&lt;br /&gt;&gt; tar -xvjf lighttpd-1.4.18.tar.bz2 &lt;br /&gt;&gt; cd lighttpd-1.4.18&lt;br /&gt;&gt; ./configure&lt;br /&gt;&gt; make&lt;br /&gt;&gt; sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Let's get automated!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo touch /usr/bin/php-fastcgi&lt;br /&gt;&gt; sudo vim /usr/bin/php-fastcgi&lt;/code&gt;&lt;/blockquote&gt;This is a new empty file, add the following and save:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;#!/bin/sh&lt;br /&gt;/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi&lt;/code&gt;&lt;/blockquote&gt;Next...&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo touch /etc/init.d/init-fastcgi&lt;br /&gt;&gt; sudo vim /etc/init.d/init-fastcgi&lt;/code&gt;&lt;/blockquote&gt;This is also a new empty file, add the following and save:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;PHP_SCRIPT=/usr/bin/php-fastcgi&lt;br /&gt;RETVAL=0&lt;br /&gt;case "$1" in&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;start)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$PHP_SCRIPT&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;RETVAL=$?&lt;br /&gt;;;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;stop)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;killall -9 php&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;RETVAL=$?&lt;br /&gt;;;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;restart)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;killall -9 php&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$PHP_SCRIPT&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;RETVAL=$?&lt;br /&gt;;;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;*)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;echo "Usage: php-fastcgi {start|stop|restart}"&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;exit $RETVAL&lt;/code&gt;&lt;/blockquote&gt;We need to change some permissions to make this all work.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo chmod 755 /usr/bin/php-fastcgi&lt;br /&gt;&gt; sudo chmod 755 /etc/init.d/init-fastcgi&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Create a Test File&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo vim /var/www/nginx-default/index.php&lt;/code&gt;&lt;/blockquote&gt;Let's just print out the information page for our PHP installation.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;?php echo phpinfo(); ?&amp;gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Start It Up&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&gt; /etc/init.d/init-fastcgi start&lt;/code&gt;&lt;/blockquote&gt;&lt;div&gt;Now go to your IP address/index.php and you should see the PHP info page displayed.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Set To Startup Automatically Upon Reboot&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo update-rc.d init-fastcgi defaults&lt;/code&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;You might want to test and make sure that it actually starts up upon reboot...&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;code&gt;&gt; sudo reboot&lt;/code&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Final Words&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If you think I have done anything stupid in the way this is setup, you may very well be right!  Please leave a comment with a suggestion on how to improve the setup.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You probably will want to look into configuring Nginx for VirtualHosts, which is not considered in this post.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Credits&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Much of this information was taken from the excellent post: &lt;a href="http://www.howtoforge.com/lemp_nginx_mysql_php_ubuntu_debian"&gt;How To Install A Complete LEMP (Linux - EnginxX (Nginx HTTP SERVER) - Mysql - PHP) Server (Not LAMP...) On Ubuntu/Debian&lt;/a&gt;, which got me about 90% there.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-2215653771648873339?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=2Eg-OBBiZXk:RXqh5XK_Rdo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=2Eg-OBBiZXk:RXqh5XK_Rdo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=2Eg-OBBiZXk:RXqh5XK_Rdo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=2Eg-OBBiZXk:RXqh5XK_Rdo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=2Eg-OBBiZXk:RXqh5XK_Rdo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=2Eg-OBBiZXk:RXqh5XK_Rdo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=2Eg-OBBiZXk:RXqh5XK_Rdo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/2215653771648873339/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=2215653771648873339" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2215653771648873339" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/2215653771648873339" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/2Eg-OBBiZXk/serving-php5-with-nginx-on-ubuntu-710.html" title="Serving PHP5 with Nginx on Ubuntu 7.10 (Gutsy)" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">21</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/01/serving-php5-with-nginx-on-ubuntu-710.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-6449767459235924911</id><published>2008-01-18T12:01:00.000-08:00</published><updated>2008-01-18T14:35:56.584-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=":bundle" /><category scheme="http://www.blogger.com/atom/ns#" term="merb" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title type="text">Merb: Multiple CSS files, one server request.</title><content type="html">In my previous post &lt;a href="http://jit.nuance9.com/2007/11/continued-education-performance-yahoo.html"&gt;Continued Education: Performance Yahoo&lt;/a&gt; I referred to Steve Souder' book "High Performance Web Sites".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule #1 is "Make fewer HTTP requests."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we already know that &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt; is "built for speed", but generally that is considered within the context of the server side of things.&lt;br /&gt;&lt;br /&gt;I was happy to see that Merb also allows us to follow Souder's #1 Rule for making the client side snappy too.  So how does Merb allow us to make fewer HTTP requests?  By dynamically combining multiple stylesheet or script files into one.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Let's see some code!&lt;/span&gt;&lt;br /&gt;It's this simple:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;# app/views/layout/application.html.erb&lt;br /&gt;&lt;% require_css :reset %&gt;&lt;br /&gt;&lt;% require_css :master %&gt;&lt;br /&gt;&lt;%= include_required_css :bundle =&gt; true %&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;We define the various CSS files we wish to be included using require_css (in this example reset.css and master.css), then by setting the :bundle =&gt; true paramenter everything will be served up in a single HTTP request in a file called  all.css!  Now that's pretty cool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;But wait there's more!&lt;/span&gt;&lt;br /&gt;The same technique works for Javascripts too.&lt;br /&gt;You can have the same functionality for your javascripts using this syntax:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;% require_js :foo $&gt;&lt;br /&gt;&lt;%= include_required_js :bundle =&gt; true %&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;But wait there's even more!&lt;/span&gt;&lt;br /&gt;Now what is really cool is that you don't have to place your require_css or require_js statements only in the layout.  You can place those in your views or even partials.  &lt;strike&gt;That means that for any given request, the bundled file will only include the files that are needed for that specific view.&lt;/strike&gt; Edit: It looks like you may need to manually define and uniquely name each possible combination of files.  It also appears that a CSS file required in a view will appear first in the generated combined CSS file and thus be over ridden by the (likely) more general file defined in the layout - which probably isn't the desired behavior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Getting it to work&lt;/span&gt;&lt;br /&gt;By default the bundling action should only occur when in production mode.  At the moment (Merb 0.5.2) it appears there is a bug and the bundling action doesn't realize when it is in production mode - so nothing happens.&lt;br /&gt;&lt;br /&gt;What you need to do is edit your config/merb.yml file and uncomment the line that reads:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;:bundle_assets: true&lt;/code&gt;&lt;/blockquote&gt;That's it!  Should work.  Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;One Gottcha&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;By forcing :bundle_assets to true in the merb.yml file, we are enabling this functionality for all environments instead of just for production.  This isn't really ideal&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Credits&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Thanks to dudleyf in #merb for helping me figure this out.  Thanks to &lt;a href="http://blog.codahale.com/"&gt;codahale&lt;/a&gt; for writing the code for :bundle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-6449767459235924911?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=7Dum0E_2B5U:IR_lKHndSV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=7Dum0E_2B5U:IR_lKHndSV4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=7Dum0E_2B5U:IR_lKHndSV4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=7Dum0E_2B5U:IR_lKHndSV4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=7Dum0E_2B5U:IR_lKHndSV4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=7Dum0E_2B5U:IR_lKHndSV4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=7Dum0E_2B5U:IR_lKHndSV4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/6449767459235924911/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=6449767459235924911" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6449767459235924911" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6449767459235924911" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/7Dum0E_2B5U/merb-multiple-css-file-one-server.html" title="Merb: Multiple CSS files, one server request." /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://jit.nuance9.com/2008/01/merb-multiple-css-file-one-server.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-6036740091863773186</id><published>2008-01-18T10:08:00.000-08:00</published><updated>2008-01-18T12:35:01.458-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="continued education" /><category scheme="http://www.blogger.com/atom/ns#" term="yahoo" /><category scheme="http://www.blogger.com/atom/ns#" term="web performance" /><title type="text">Continued Education: Performance Yahoo</title><content type="html">In this edition of "Continued Education" I'm linking up Steve Souders' (Chief Performance Yahoo!) Google Talk "&lt;a href="http://video.google.com/videoplay?docid=374343798097710096&amp;amp;q=user%3A%22Google+engEDU%22&amp;amp;total=584&amp;amp;start=0&amp;amp;num=10&amp;amp;so=1&amp;amp;type=search&amp;amp;plindex=0"&gt;High Performance Web Sites: 14 rules for faster pages&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;I've recently been reading  his book that covers the same topic, but sometimes it's nice to be able to just veg-out and watch.&lt;br /&gt;&lt;br /&gt;Good practical information that is fairly easy to implement and can greatly improve our users' experiences.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-6036740091863773186?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T6xzzgZQZiM:PyS0Ck2vsuk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T6xzzgZQZiM:PyS0Ck2vsuk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T6xzzgZQZiM:PyS0Ck2vsuk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T6xzzgZQZiM:PyS0Ck2vsuk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T6xzzgZQZiM:PyS0Ck2vsuk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=T6xzzgZQZiM:PyS0Ck2vsuk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=T6xzzgZQZiM:PyS0Ck2vsuk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/6036740091863773186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=6036740091863773186" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6036740091863773186" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6036740091863773186" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/T6xzzgZQZiM/continued-education-performance-yahoo.html" title="Continued Education: Performance Yahoo" /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://jit.nuance9.com/2007/11/continued-education-performance-yahoo.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-3545886534042322597.post-6280400553560132085</id><published>2007-12-14T07:35:00.000-08:00</published><updated>2007-12-14T09:00:37.291-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scm" /><category scheme="http://www.blogger.com/atom/ns#" term="linus torvalds" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="svn" /><title type="text">To Git, or not to Git.</title><content type="html">I just read Joe Moore's (Pivotal Labs) &lt;a href="http://pivots.pivotallabs.com/users/joe/blog/articles/160-thoughts-on-linus-torvalds-s-git-talk"&gt;thoughts on the Linus Torvalds' Git talk&lt;/a&gt; that was presented at Google.&lt;br /&gt;&lt;br /&gt;I had also watched &lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Linus' Google Talk video&lt;/a&gt; about a month ago, and had been hearing about &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; in the &lt;a href="http://www.merbivore.com/"&gt;Merb&lt;/a&gt; IRC room. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Git: A cruel piece of software?&lt;/span&gt;&lt;br /&gt;The chairman introducing Linus describes Git as "a revision control system which is expressly designed to make you feel less intelligent than you thought you were" and as "a software tool which only he [Linus] is smart enough to know how to use."  Was he joking or partly serious?  I wasn't entirely sure.&lt;br /&gt;&lt;br /&gt;With that preface, I had the impression that using Git was going to have a cliff like learning curve.  Nevertheless,  I decided to give it a try so I could at least know what others were talking about.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A collaboration of 1&lt;/span&gt;&lt;br /&gt;Unlike Pivotal Labs, I'm just a solitary developer using &lt;a href="http://en.wikipedia.org/wiki/Source_Code_Management"&gt;SCM&lt;/a&gt; to track changes on my own code.  So my needs are fairly limited.  I don't really have any "collaboration" needs.&lt;br /&gt;&lt;br /&gt;For someone with my limited SCM needs, probably any SCM would work just fine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Initial thoughts&lt;/span&gt;&lt;br /&gt;After using Git a bit, here are a my basic thoughts.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's actually not too difficult at all (at least at a basic user level).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is a command line tool.  That's fine for me, as I always have a terminal open anyways.&lt;/li&gt;&lt;li&gt;Basic commands are easy to remember: "git status", "git add", "git commit", "git push"&lt;/li&gt;&lt;li&gt;It's pretty easy to setup custom ignore files and setup a remote repo.&lt;/li&gt;&lt;li&gt;Committing locally is fast &amp;amp; independent of your internet connection.&lt;/li&gt;&lt;li&gt;Deployment via Capistrano (v2.1) supports Git.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It appears that branching and merging are very easy, but honestly I don't really do too much (ok, any) of either.  I will experiment with that in the future to see if it adds any value to my specific work flow.&lt;br /&gt;&lt;br /&gt;You won't find the same level of application support for Git as SVN at the moment.  For example, the other day I &lt;a href="http://ciaranwal.sh/2007/11/29/svnmate-update"&gt;read about the release of SVNmate&lt;/a&gt;, a bundle for Textmate which adds some SVN status icons to your files.  There currently is not a bundle offering the same for Git (although there is a bundle "work in progress").  Not necessarily deal-breakers, but things to be aware of.&lt;br /&gt;&lt;br /&gt;Personally, I'm going to continue using Git and become more familiar with it's capabilities. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTE:&lt;/span&gt; Git does have the gitk command which opens a GUI.  I haven't used it, other than a cursory glance, and thus am not familiar with it's features.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Related Resources:&lt;/span&gt;&lt;br /&gt;Git Cheat Sheet: &lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html&lt;/a&gt;&lt;br /&gt;Git Tutorial: &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/tutorial.html"&gt;http://www.kernel.org/pub/software/scm/git/docs/tutorial.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3545886534042322597-6280400553560132085?l=jit.nuance9.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0SsJgH-nKuw:PNSuWnnj56c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0SsJgH-nKuw:PNSuWnnj56c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0SsJgH-nKuw:PNSuWnnj56c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0SsJgH-nKuw:PNSuWnnj56c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0SsJgH-nKuw:PNSuWnnj56c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nuance9/jit?a=0SsJgH-nKuw:PNSuWnnj56c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nuance9/jit?i=0SsJgH-nKuw:PNSuWnnj56c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://jit.nuance9.com/feeds/6280400553560132085/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3545886534042322597&amp;postID=6280400553560132085" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6280400553560132085" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3545886534042322597/posts/default/6280400553560132085" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nuance9/jit/~3/0SsJgH-nKuw/to-git-or-not-to-git.html" title="To Git, or not to Git." /><author><name>Justin Pease</name><uri>http://www.blogger.com/profile/00062669138144919279</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09106793024147902363" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://jit.nuance9.com/2007/12/to-git-or-not-to-git.html</feedburner:origLink></entry></feed>
