<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 <title>In search of the next shiny thing</title>
 
 <updated>2012-02-08T13:29:55+00:00</updated>
 <id>http://minhajuddin.com/</id>
 <author>
   <name>Khaja Minhajuddin</name>
   <email>minhajuddin.k@gmail.com</email>
 </author>
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/shiny-stuff" /><feedburner:info uri="shiny-stuff" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <id>http://minhajuddin.com/2012/02/08/login-to-your-remote-server-using-cd-and-rvmrc</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/VNeGlmAGJq4/" />
   <title>login to your remote server using cd and rvmrc</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;Here is a fun trick which you can use, to simulate that a remote server is on one of your directories.&lt;/p&gt;

&lt;p&gt;Create a folder call ~/m/example.com and in that folder create a file called .rvmrc with the following command&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; ssh awesomeuser@example.com -p 2302 -i ~/.ssh/awesomekey_rsa
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='c'&gt;#or whatever ssh command you use&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now whenever you run &lt;code&gt;cd ~/m/example.com&lt;/code&gt; you will automagically be logged into your remote computer.&lt;/p&gt;

&lt;p&gt;Obviously, this is a fun trick. All this can be done in a much nicer way using the &lt;code&gt;~/.ssh/config&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Here are a few resources to make your ssh config more useful, allowing you to login to servers using a command like &lt;code&gt;ssh myserver&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://linux.die.net/man/5/ssh_config'&gt;http://linux.die.net/man/5/ssh_config&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.evilsoft.org/2009/10/23/stupid-ssh-config-tricks'&gt;http://www.evilsoft.org/2009/10/23/stupid-ssh-config-tricks&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.linuxjournal.com/article/6602'&gt;http://www.linuxjournal.com/article/6602&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.howtogeek.com/75007/stupid-geek-tricks-use-your-ssh-config-file-to-create-aliases-for-hosts/'&gt;http://www.howtogeek.com/75007/stupid-geek-tricks-use-your-ssh-config-file-to-create-aliases-for-hosts/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wonder what other stuff could be done using rvmrc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/VNeGlmAGJq4" height="1" width="1"/&gt;</content>
   <updated>2012-02-08T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2012/02/08/login-to-your-remote-server-using-cd-and-rvmrc/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/12/16/make-evil-monkey-nag-you-back-to-work</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/I9_QlkaqaZY/" />
   <title>make evil monkey nag you back to work</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;h3 id='update_fixed_the_cron_entry'&gt;Update: fixed the cron entry&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ve read a very interesting article about &lt;a href='http://swizec.com/blog/why-programmers-work-at-night/swizec/3198'&gt;&amp;#8220;Why programmers work at night&amp;#8221;&lt;/a&gt;. One of the points the author talks about is &amp;#8220;how we get engrossed in twitter/hacker news/reddit&amp;#8221;. I&amp;#8217;ve felt the same. I think one of the reasons why we(programmers/developers) spend a lot of our time on twitter/hacker news/reddit is, because, we don&amp;#8217;t have any idea of the time. Time just flies by. So, I created a small ruby script which nags you to get back to work :)&lt;/p&gt;

&lt;h2 id='scriptsnagger'&gt;~/.scripts/nagger&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c1'&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;time&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; 
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='nb'&gt;exit&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;exists?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/tmp/stop-nagging&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='c1'&gt;#see what I did here ;)&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='c1'&gt;#run the below command to find your display&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; &lt;span class='c1'&gt;#env | grep DISPLAY&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; &lt;span class='no'&gt;ENV&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;DISPLAY&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;:0.0&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='n'&gt;last_line&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='sb'&gt;`tail -2 ~/.gtimelog/timelog.txt`&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;lines&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;map&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;chomp&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reject&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;empty?&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reverse&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='n'&gt;minutes&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='no'&gt;Time&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;now&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='no'&gt;Time&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;parse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;last_line&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;11&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='mi'&gt;60&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;round&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='n'&gt;evil_monkey&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;expand_path&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;join&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;dirname&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='bp'&gt;__FILE__&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;evil-monkey.gif&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; 
&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;minutes&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;30&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt;   &lt;span class='sb'&gt;`notify-send -i &amp;#39;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;evil_monkey&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sb'&gt;&amp;#39; &amp;quot;It&amp;#39;s been &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;minutes&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sb'&gt; minutes since your last log&amp;quot;`&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='cron_entry'&gt;cron entry&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c &lt;span class='s1'&gt;&amp;#39;/home/minhajuddin/.scripts/nagger&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img alt='Evil monkey nagging me to get back to work' src='/images/evil-monkey-nagger.png' /&gt;&lt;/p&gt;

&lt;p&gt;Hope it helps you get back to work too :). By the way, I use the awesome &lt;a href='http://mg.pov.lt/gtimelog/'&gt;gtimelog&lt;/a&gt; app to log my time.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/I9_QlkaqaZY" height="1" width="1"/&gt;</content>
   <updated>2011-12-16T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/12/16/make-evil-monkey-nag-you-back-to-work/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/12/13/script-to-do-a-global-search-and-replace-in-a-git-repository</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/ja_p5SmC-GM/" />
   <title>script to do a global search and replace in a git repository</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;There are many instances where I had to replace some variable name in all my files. I use a small script to do this, Hope it helps you too.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c'&gt;#!/bin/bash&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='c'&gt;#~/.scripts/git-sub&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='c'&gt;#Author: Khaja Minhajuddin &amp;lt;minhajuddin@cosmicvent.com&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='c'&gt;#script which does a global search and replace in the git repository&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='c'&gt;#it takes two arguments&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; &lt;span class='c'&gt;#e.g. git sub OLD NEW&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 
&lt;span class='lineno'&gt; 8&lt;/span&gt; &lt;span class='nv'&gt;old&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nv'&gt;$1&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; &lt;span class='nv'&gt;new&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nv'&gt;$2&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='k'&gt;for &lt;/span&gt;file in &lt;span class='k'&gt;$(&lt;/span&gt;git grep &lt;span class='nv'&gt;$old&lt;/span&gt; | cut -d&lt;span class='s1'&gt;&amp;#39;:&amp;#39;&lt;/span&gt;  -f 1 | uniq&lt;span class='k'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='k'&gt;  &lt;/span&gt;&lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;replacing &amp;#39;$old&amp;#39; with &amp;#39;$new&amp;#39; in &amp;#39;$file&amp;#39;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt;   sed -i -e &lt;span class='s2'&gt;&amp;quot;s/$old/$new/g&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;$file&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='k'&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Just remember to add it to a directory which is in the &lt;code&gt;$PATH&lt;/code&gt;. I have it in my &lt;code&gt;~/.scripts&lt;/code&gt; directory which is included in the &lt;code&gt;$PATH&lt;/code&gt;. Name it &lt;code&gt;git-sub&lt;/code&gt; and give it executable permissions using &lt;code&gt;chmod +x ~/.scripts/git-sub&lt;/code&gt;. Now, you can just call &lt;code&gt;git sub old_var new_var&lt;/code&gt; on terminal and it will do a global search and replace of all the files in the repository.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/ja_p5SmC-GM" height="1" width="1"/&gt;</content>
   <updated>2011-12-13T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/12/13/script-to-do-a-global-search-and-replace-in-a-git-repository/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/12/12/elegance-of-functional-programming</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/M6FyW-UB5Nk/" />
   <title>elegance of functional programming</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;Functional programming allows you to write concise and elegant code. Mainstream languages like Ruby and C# support a lot of functional programming paradigms, and learning them makes you a better programmer. Below is a small example which demonstrates that:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c1'&gt;#6 lines of ugly code&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='n'&gt;tasks&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;list&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;tasks&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='k'&gt;while&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;tasks&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt;   &lt;span class='n'&gt;tasks&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;].&lt;/span&gt;&lt;span class='n'&gt;priority&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;should&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;=&lt;/span&gt; &lt;span class='n'&gt;tasks&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;].&lt;/span&gt;&lt;span class='n'&gt;priority&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt;   &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 
&lt;span class='lineno'&gt; 9&lt;/span&gt; 
&lt;span class='lineno'&gt;10&lt;/span&gt; &lt;span class='c1'&gt;#3 lines of elegant functional code&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='n'&gt;list&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;tasks&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each_cons&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;t1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;t2&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt;   &lt;span class='n'&gt;t1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;priority&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;should&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;=&lt;/span&gt; &lt;span class='n'&gt;t2&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;priority&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/M6FyW-UB5Nk" height="1" width="1"/&gt;</content>
   <updated>2011-12-12T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/12/12/elegance-of-functional-programming/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/12/09/gc-your-git-repositories-automatically-with-a-cron-task</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/32blAUdZ7-M/" />
   <title>gc your git repositories automatically with a cron task</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;I have a lot of git code repositories, and I usually &lt;a href='http://linux.die.net/man/1/git-gc'&gt;&lt;em&gt;gc&lt;/em&gt; (garbage collect)&lt;/a&gt; them manually by running the &lt;code&gt;git gc&lt;/code&gt; command every now and then. Tasks like these are prime candidates for automating with &lt;em&gt;cron&lt;/em&gt;. Below is a cron entry and the script which &lt;code&gt;gc&lt;/code&gt;s my repositories. Hope you guys find it useful.&lt;/p&gt;

&lt;h3 id='the_script'&gt;the script&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c'&gt;#!/bin/bash&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='c'&gt;#author: Khaja Minhajuddin&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='c'&gt;#email: minhajuddin.k@gmail.com&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='c'&gt;#path /home/minhajuddin/.cron/reboot.sh&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='c'&gt;#description: script which is executed everytime computer starts&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='c'&gt;#git gc repos&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; &lt;span class='nv'&gt;REPO_DIRS&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k'&gt;$(&lt;/span&gt;cat &lt;span class='s'&gt;&amp;lt;&amp;lt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; &lt;span class='s'&gt;$HOME/repos&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; &lt;span class='s'&gt;$HOME/repos/core&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='s'&gt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='k'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='k'&gt;for &lt;/span&gt;repo_dir in &lt;span class='nv'&gt;$REPO_DIRS&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='k'&gt;  &lt;/span&gt;&lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;checking for git repos in $repo_dir&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt;   &lt;span class='k'&gt;for &lt;/span&gt;repo in &lt;span class='k'&gt;$(&lt;/span&gt;ls &lt;span class='nv'&gt;$repo_dir&lt;/span&gt;&lt;span class='k'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt;   &lt;span class='k'&gt;do&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; &lt;span class='k'&gt;    &lt;/span&gt;&lt;span class='nb'&gt;cd&lt;/span&gt; &lt;span class='nv'&gt;$repo_dir&lt;/span&gt;/&lt;span class='nv'&gt;$repo&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt;     &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='o'&gt;[[&lt;/span&gt; -d .git &lt;span class='o'&gt;]]&lt;/span&gt;
&lt;span class='lineno'&gt;21&lt;/span&gt;     &lt;span class='k'&gt;then&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; &lt;span class='k'&gt;      &lt;/span&gt;&lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;garbage collecting $repo&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt;       git gc
&lt;span class='lineno'&gt;24&lt;/span&gt;     &lt;span class='k'&gt;fi&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='k'&gt;  done&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='k'&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='the_crontab_entry'&gt;the crontab entry&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='nv'&gt;$ &lt;/span&gt;crontab -e
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='c'&gt;#add the line below into the editor and save it&lt;/span&gt;
&lt;span class='lineno'&gt;3&lt;/span&gt; @reboot   &lt;span class='nv'&gt;$HOME&lt;/span&gt;/.cron/reboot.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Bonus tip: If you have a gitosis server, put the following script at &lt;code&gt;~git/.cron/reboot.sh&lt;/code&gt; and perform the above step for your &lt;em&gt;git user&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id='the_gitosis_git_user_script'&gt;the gitosis git user script&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='c'&gt;#!/bin/bash&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; 
&lt;span class='lineno'&gt;3&lt;/span&gt; &lt;span class='k'&gt;for &lt;/span&gt;repo in &lt;span class='k'&gt;$(&lt;/span&gt;ls ~/repositories&lt;span class='k'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;4&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
&lt;span class='lineno'&gt;5&lt;/span&gt; &lt;span class='k'&gt;  &lt;/span&gt;&lt;span class='nb'&gt;cd&lt;/span&gt; ~/repositories/&lt;span class='nv'&gt;$repo&lt;/span&gt;
&lt;span class='lineno'&gt;6&lt;/span&gt;   &lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;garbage collecting $repo&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;7&lt;/span&gt;   git gc
&lt;span class='lineno'&gt;8&lt;/span&gt; &lt;span class='k'&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/32blAUdZ7-M" height="1" width="1"/&gt;</content>
   <updated>2011-12-09T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/12/09/gc-your-git-repositories-automatically-with-a-cron-task/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/11/22/automatically-push-your-git-repo-to-a-server-on-shutdown</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/3oKD8dWCC7A/" />
   <title>automatically push your git repo to a server on shutdown</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;Sometimes, I forget to push my git commits to our git server at the end of the day. This causes inconvenience to others as they can&amp;#8217;t review my code or build upon it. So, today I wrote a small script which syncs all my git repositories with a remote server. Hope it helps you too :)&lt;/p&gt;

&lt;p&gt;The setup consists of three files:&lt;/p&gt;

&lt;h3 id='core_syncing_script_at_scriptssyncrepos'&gt;core syncing script at ~/.scripts/sync-repos&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c1'&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;yaml&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; 
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='c1'&gt;#replace google.com with your git servers domain&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; &lt;span class='sb'&gt;`ping -c 1 google.com`&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='vg'&gt;$?&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;exitstatus&lt;/span&gt; &lt;span class='o'&gt;!=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;UNABLE TO SYNC REPOS AS NW IS DOWN&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt;   &lt;span class='nb'&gt;exit&lt;/span&gt; &lt;span class='vg'&gt;$?&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;exitstatus&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;syncing repositories&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='vi'&gt;@repos&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;YAML&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;load_file&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;expand_path&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;~/.sync-repos&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; 
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='vi'&gt;@repos&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;repo&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt;   &lt;span class='n'&gt;path&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;expand_path&lt;/span&gt; &lt;span class='n'&gt;repo&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:path&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt;   &lt;span class='n'&gt;remotes&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;repo&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:remotes&lt;/span&gt;&lt;span class='o'&gt;].&lt;/span&gt;&lt;span class='n'&gt;is_a?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;String&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;repo&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:remotes&lt;/span&gt;&lt;span class='o'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;repo&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:remotes&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt;   &lt;span class='k'&gt;unless&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;exist?&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt;     &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;skipping &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; as directory not found&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;21&lt;/span&gt;     &lt;span class='k'&gt;next&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; 
&lt;span class='lineno'&gt;24&lt;/span&gt;   &lt;span class='n'&gt;remotes&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;remote&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt;     &lt;span class='n'&gt;cmd&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;cd &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; &amp;amp;&amp;amp; git push &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;remote&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt;     &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;executing: &amp;#39;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;cmd&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;#39;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt;     &lt;span class='nb'&gt;system&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;cmd&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;29&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; 
&lt;span class='lineno'&gt;31&lt;/span&gt; &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;done syncing repositories&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='config_file_pointing_to_all_the_repos_at_syncrepos'&gt;config file pointing to all the repos at ~/.sync-repos&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='yaml'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='nn'&gt;---&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='p-Indicator'&gt;-&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;:path&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;~/repos/search&lt;/span&gt;
&lt;span class='lineno'&gt;3&lt;/span&gt;   &lt;span class='l-Scalar-Plain'&gt;:remotes&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='lineno'&gt;4&lt;/span&gt;   &lt;span class='p-Indicator'&gt;-&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;origin&lt;/span&gt;
&lt;span class='lineno'&gt;5&lt;/span&gt; &lt;span class='p-Indicator'&gt;-&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;:path&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;~/repos/logbin&lt;/span&gt;
&lt;span class='lineno'&gt;6&lt;/span&gt;   &lt;span class='l-Scalar-Plain'&gt;:remotes&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='lineno'&gt;7&lt;/span&gt;   &lt;span class='p-Indicator'&gt;-&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;origin&lt;/span&gt;
&lt;span class='lineno'&gt;8&lt;/span&gt;   &lt;span class='p-Indicator'&gt;-&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='upstart_shutdown_trigger_script_at_etcinitsyncreposconf'&gt;upstart shutdown trigger script at /etc/init/syncrepos.conf&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; start on runlevel &lt;span class='o'&gt;[&lt;/span&gt;06&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; 
&lt;span class='lineno'&gt;3&lt;/span&gt; /bin/bash -l -c /home/minhajuddin/.scripts/sync-repos
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/3oKD8dWCC7A" height="1" width="1"/&gt;</content>
   <updated>2011-11-22T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/11/22/automatically-push-your-git-repo-to-a-server-on-shutdown/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/11/10/how-to-setup-solr-and-sunspot-on-a-rails-production-server</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/FXm7_9wTRvk/" />
   <title>how to setup solr and sunspot on a rails production server</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;Solr is an awesome app built on top of Lucene for fulltext search. However, setting it up can be a pain if you don&amp;#8217;t find the right guide, or if you miss some small detail. So, here is my attempt to document the process of setting up solr in development and production using a rails app as an example.&lt;/p&gt;

&lt;p&gt;Solr and Lucene are java apps, so you need java to get this stuff working, I installed sun-jdk just to play it safe, as far as I know it works well even with openjdk.&lt;/p&gt;

&lt;p&gt;Steps to setup solr on production&lt;/p&gt;

&lt;p&gt;1. Install Sun JDK:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='c'&gt;#install and setup sun jdk&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;deb http://archive.canonical.com/ $(lsb_release -cs) partner&amp;quot;&lt;/span&gt;| sudo tee -a /etc/apt/sources.list &amp;gt; /dev/null
&lt;span class='lineno'&gt;3&lt;/span&gt; sudo apt-get update
&lt;span class='lineno'&gt;4&lt;/span&gt; sudo apt-get install sun-java6-jre sun-java6-bin sun-java6-jdk -y
&lt;span class='lineno'&gt;5&lt;/span&gt; sudo update-alternatives --config java
&lt;span class='lineno'&gt;6&lt;/span&gt; &lt;span class='nb'&gt;echo&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;export JAVA_HOME=/usr/lib/jvm/java-6-sun/&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;2. Download and setup tomcat: you&amp;#8217;ll need to setup tomcat version 6.0 for your production server. Download the latest V6 tomcat files from &lt;a href='http://tomcat.apache.org/download-60.cgi'&gt;http://tomcat.apache.org/download-60.cgi&lt;/a&gt;. Now, extract them into &lt;code&gt;~/apps&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3. Download or build the solr war files and copy them to &lt;code&gt;/apps/solr&lt;/code&gt;. You can find the links at: &lt;a href='http://lucene.apache.org/solr/'&gt;http://lucene.apache.org/solr/&lt;/a&gt; or &lt;a href='http://www.apache.org/dyn/closer.cgi/lucene/solr/'&gt;http://www.apache.org/dyn/closer.cgi/lucene/solr/&lt;/a&gt;. The war file is usually in a folder called &lt;code&gt;dist&lt;/code&gt; and has a filename like &lt;code&gt;apache-solr-3.4.0.war&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4. Create a file ~/apps/tomcat/conf/Catalina/localhost/solr-appname.xml with the following content&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='c'&gt;&amp;lt;!-- I usually create this file in the rails app config/ directory and symlink&lt;/span&gt;
&lt;span class='lineno'&gt;3&lt;/span&gt; &lt;span class='c'&gt;it to the ~/tomcat/conf/Catalina/localhost/ directory--&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;4&lt;/span&gt; &lt;span class='c'&gt;&amp;lt;!-- the docBase path should point to your solr.war file --&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;5&lt;/span&gt; &lt;span class='nt'&gt;&amp;lt;Context&lt;/span&gt; &lt;span class='na'&gt;docBase=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/home/minhajuddin/apps/solr/solr.war&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;debug=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;crossContext=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;6&lt;/span&gt;   &lt;span class='c'&gt;&amp;lt;!-- the value string should point to your apps solr directory --&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;7&lt;/span&gt;   &lt;span class='nt'&gt;&amp;lt;Environment&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;solr/home&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;java.lang.String&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;value=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/home/minhajuddin/spikes/solr-blog/solr&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;override=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;8&lt;/span&gt;   &lt;span class='c'&gt;&amp;lt;!-- value= app-name/solr --&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;9&lt;/span&gt; &lt;span class='nt'&gt;&amp;lt;/Context&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Steps till this point are the same for any kind of solr installation, be it for a rails or any other app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;5. I use the sunspot_rails gem in my rails application, when using this, you can run &lt;code&gt;rails g sunspot_rails:install&lt;/code&gt; to create a &lt;code&gt;config/sunspot.yml&lt;/code&gt; file. Once you have the config file, change the production config values to point to the right port and path, e.g:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='yaml'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;..&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;production&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='lineno'&gt;3&lt;/span&gt;   &lt;span class='l-Scalar-Plain'&gt;solr&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='lineno'&gt;4&lt;/span&gt;     &lt;span class='l-Scalar-Plain'&gt;hostname&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;localhost&lt;/span&gt;
&lt;span class='lineno'&gt;5&lt;/span&gt;     &lt;span class='l-Scalar-Plain'&gt;port&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;8080&lt;/span&gt;
&lt;span class='lineno'&gt;6&lt;/span&gt;     &lt;span class='l-Scalar-Plain'&gt;path&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;/solr-odir/&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;6. Run the &lt;code&gt;bundle exec rake sunspot:solr:start&lt;/code&gt; command once, on the development machine, to generate the solr configuration files. And push this code to the production server.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s all. Setting solr is not very straightforward, but once you have it set up, it&amp;#8217;s very easy to setup additional apps with the same solr server.&lt;/p&gt;

&lt;p&gt;On a development machine, all you need to get solr working is: install java (check step 1) and setup sunspot (check step 5), and start the solr server with &lt;code&gt;bundle exec rake sunspot:solr:start&lt;/code&gt;&lt;/p&gt;

&lt;h3 id='resources'&gt;Resources&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='https://help.ubuntu.com/community/Java'&gt;https://help.ubuntu.com/community/Java&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://wiki.apache.org/solr/SolrInstall'&gt;http://wiki.apache.org/solr/SolrInstall&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.tc.umn.edu/~brams006/solr_ubuntu.html'&gt;http://www.tc.umn.edu/~brams006/solr_ubuntu.html&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://railscasts.com/episodes/278-search-with-sunspot'&gt;http://railscasts.com/episodes/278-search-with-sunspot&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/outoftime/sunspot'&gt;https://github.com/outoftime/sunspot&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/sunspot/sunspot/wiki'&gt;https://github.com/sunspot/sunspot/wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/FXm7_9wTRvk" height="1" width="1"/&gt;</content>
   <updated>2011-11-10T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/11/10/how-to-setup-solr-and-sunspot-on-a-rails-production-server/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/11/08/simple-log-management-and-viewing-for-your-servers</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/Rne-1kfni0c/" />
   <title>simple log management and viewing for your servers</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;As a guy who develops, deploys and maintains webapps, I had to login to my servers and &lt;em&gt;tail the logs to see issues&lt;/em&gt; too many times. It&amp;#8217;s a real pain, And anybody who maintains any servers knows this.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve recently found a bunch of very good apps, which make this job very pleasant: &lt;a href='https://papertrailapp.com/'&gt;PaperTrail&lt;/a&gt; is an awesome app which makes it very simple to setup a logging daemon and view all your logs (from all your servers) on their website, It&amp;#8217;s a very neat implementation. But, you might not want to send your logs to other apps as they usually have sensitive information. &lt;img alt='PaperTrail' src='http://i.imgur.com/2v721l.png' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://logstash.net/'&gt;logstash&lt;/a&gt; is another awesome open source implementation for log management. With logstash, you can setup a small central server which collects all your logs and allows you to access them through a &lt;a href='http://logstash.net/docs/1.0.17/'&gt;variety of interfaces&lt;/a&gt;. Another advantage of logstash is that the logs stay on &lt;em&gt;your&lt;/em&gt; server under &lt;em&gt;your&lt;/em&gt; control, plus it&amp;#8217;s open source. The only downside is the one time setup, which, is not that hard. It is very &lt;a href='http://logstash.net/docs/1.0.17/'&gt;versatile in ways it allows you access to your logs&lt;/a&gt;. &lt;img alt='LogStash' src='http://i.imgur.com/HklrW.png' /&gt;&lt;/p&gt;

&lt;p&gt;If none of them seem to be your thing, here is a small script which I use to tail remote log files. It runs &lt;code&gt;tail -f&lt;/code&gt; over an ssh connection. It&amp;#8217;s very simple to setup and use. Once you set it up, you can just &lt;code&gt;cd&lt;/code&gt; into your application directory and run &lt;code&gt;rt&lt;/code&gt; and it will start tailing your log files instantly. If you have any improvements you can &lt;a href='https://gist.github.com/1348074'&gt;fork this gist and update it&lt;/a&gt;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c1'&gt;#~/.scripts/rt&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='c1'&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;yaml&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;erb&amp;#39;&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='no'&gt;ConfigFilePath&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;expand_path&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;~/.remote-tail.yml&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 
&lt;span class='lineno'&gt; 9&lt;/span&gt; &lt;span class='c1'&gt;#will be written out to ConfigFilePath if not present&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; &lt;span class='no'&gt;SampleConfig&lt;/span&gt;&lt;span class='o'&gt;=&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class='no'&gt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='sh'&gt;---&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='sh'&gt;defaults: &amp;amp;defaults&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='sh'&gt;  host: c3&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='sh'&gt;foonginx:&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='sh'&gt;  file: /var/log/nginx/*.log&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='sh'&gt;barapp:&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='sh'&gt;  host: foo@bar.com&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; &lt;span class='sh'&gt;  file: /var/www/apps/railsfooapp/shared/log/*.log&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; &lt;span class='no'&gt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; 
&lt;span class='lineno'&gt;21&lt;/span&gt; &lt;span class='no'&gt;Usage&lt;/span&gt;&lt;span class='o'&gt;=&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class='no'&gt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; &lt;span class='sh'&gt;Usage:&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; &lt;span class='sh'&gt;  1. cd to into the directory whose name is the same as the name of the config and run&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='sh'&gt;     rt&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; 
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='sh'&gt;  2. rt &amp;lt;name of the app&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; 
&lt;span class='lineno'&gt;28&lt;/span&gt; &lt;span class='sh'&gt;  3. rt &amp;lt;host&amp;gt; &amp;lt;file&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;29&lt;/span&gt; &lt;span class='no'&gt;EOS&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; 
&lt;span class='lineno'&gt;31&lt;/span&gt; &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;tail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;opts&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;32&lt;/span&gt;   &lt;span class='n'&gt;cmd&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;ssh &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;opts&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;host&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; &amp;#39;tail -f &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;opts&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;file&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;#39;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;33&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;running: &amp;#39;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;cmd&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;#39;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;34&lt;/span&gt;   &lt;span class='nb'&gt;system&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;cmd&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;35&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;36&lt;/span&gt; 
&lt;span class='lineno'&gt;37&lt;/span&gt; &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;config&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;38&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;using app:&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;39&lt;/span&gt;   &lt;span class='n'&gt;config&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;YAML&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;load_file&lt;/span&gt; &lt;span class='no'&gt;ConfigFilePath&lt;/span&gt;
&lt;span class='lineno'&gt;40&lt;/span&gt;   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='lineno'&gt;41&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;app:&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; not found in &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;ConfigFilePath&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;42&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='no'&gt;Usage&lt;/span&gt;
&lt;span class='lineno'&gt;43&lt;/span&gt;   &lt;span class='nb'&gt;exit&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
&lt;span class='lineno'&gt;44&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;45&lt;/span&gt; 
&lt;span class='lineno'&gt;46&lt;/span&gt; &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;setup&lt;/span&gt;
&lt;span class='lineno'&gt;47&lt;/span&gt;   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;exist?&lt;/span&gt; &lt;span class='no'&gt;ConfigFilePath&lt;/span&gt;
&lt;span class='lineno'&gt;48&lt;/span&gt;   &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;creating a sample config at: &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;ConfigFilePath&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;49&lt;/span&gt;   &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;ConfigFilePath&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
&lt;span class='lineno'&gt;50&lt;/span&gt;     &lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;print&lt;/span&gt; &lt;span class='no'&gt;SampleConfig&lt;/span&gt;
&lt;span class='lineno'&gt;51&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;52&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;53&lt;/span&gt; 
&lt;span class='lineno'&gt;54&lt;/span&gt; &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;init&lt;/span&gt;
&lt;span class='lineno'&gt;55&lt;/span&gt;   &lt;span class='n'&gt;setup&lt;/span&gt;
&lt;span class='lineno'&gt;56&lt;/span&gt;   &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='no'&gt;ARGV&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt;
&lt;span class='lineno'&gt;57&lt;/span&gt;   &lt;span class='k'&gt;when&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
&lt;span class='lineno'&gt;58&lt;/span&gt;     &lt;span class='c1'&gt;#usage:&lt;/span&gt;
&lt;span class='lineno'&gt;59&lt;/span&gt;     &lt;span class='c1'&gt;#cd to the app root directory, usually this would be the name with which you&lt;/span&gt;
&lt;span class='lineno'&gt;60&lt;/span&gt;     &lt;span class='c1'&gt;#setup the configuration and run&lt;/span&gt;
&lt;span class='lineno'&gt;61&lt;/span&gt;     &lt;span class='c1'&gt;#$ rt&lt;/span&gt;
&lt;span class='lineno'&gt;62&lt;/span&gt;     &lt;span class='n'&gt;tail&lt;/span&gt; &lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;basename&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;Dir&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pwd&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;span class='lineno'&gt;63&lt;/span&gt;   &lt;span class='k'&gt;when&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='lineno'&gt;64&lt;/span&gt;     &lt;span class='c1'&gt;#usage:&lt;/span&gt;
&lt;span class='lineno'&gt;65&lt;/span&gt;     &lt;span class='c1'&gt;#from any directory&lt;/span&gt;
&lt;span class='lineno'&gt;66&lt;/span&gt;     &lt;span class='c1'&gt;#$ rt &amp;lt;name of the app&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;67&lt;/span&gt;     &lt;span class='n'&gt;tail&lt;/span&gt; &lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;ARGV&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;68&lt;/span&gt;   &lt;span class='k'&gt;when&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
&lt;span class='lineno'&gt;69&lt;/span&gt;     &lt;span class='c1'&gt;#usage:&lt;/span&gt;
&lt;span class='lineno'&gt;70&lt;/span&gt;     &lt;span class='c1'&gt;#from any directory&lt;/span&gt;
&lt;span class='lineno'&gt;71&lt;/span&gt;     &lt;span class='c1'&gt;#$ rt &amp;lt;host&amp;gt; &amp;lt;file&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;72&lt;/span&gt;     &lt;span class='n'&gt;tail&lt;/span&gt; &lt;span class='ss'&gt;:host&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;ARGV&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:file&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;ARGV&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;last&lt;/span&gt;
&lt;span class='lineno'&gt;73&lt;/span&gt;   &lt;span class='k'&gt;else&lt;/span&gt;
&lt;span class='lineno'&gt;74&lt;/span&gt;     &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Invalid number of arguments&amp;quot;&lt;/span&gt;
&lt;span class='lineno'&gt;75&lt;/span&gt;     &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='no'&gt;Usage&lt;/span&gt;
&lt;span class='lineno'&gt;76&lt;/span&gt;     &lt;span class='nb'&gt;exit&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='lineno'&gt;77&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;78&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;79&lt;/span&gt; 
&lt;span class='lineno'&gt;80&lt;/span&gt; &lt;span class='n'&gt;init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/Rne-1kfni0c" height="1" width="1"/&gt;</content>
   <updated>2011-11-08T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/11/08/simple-log-management-and-viewing-for-your-servers/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/HoNpSzjKPPo/" />
   <title>how to change the rails root url based on the current user or role</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;In my latest rails app, I needed the root url to be different based on the logged in user, i.e. if the user was logged in I wanted to show one page, if not I wanted to show a generic page. Rails 3 makes this very easy.&lt;/p&gt;

&lt;p&gt;While drawing routes, rails gives you ability to &lt;a href='http://edgeguides.rubyonrails.org/routing.html#advanced-constraints'&gt;&lt;em&gt;constrain&lt;/em&gt;&lt;/a&gt; the route based on &lt;em&gt;anything&lt;/em&gt; in the incoming request. As it happens, I was using &lt;a href='https://github.com/plataformatec/devise'&gt;devise&lt;/a&gt; for my authentication needs and devise uses &lt;a href='https://github.com/hassox/warden'&gt;warden&lt;/a&gt; which fills up the request&amp;#8217;s &lt;strong&gt;env&lt;/strong&gt; with the current user, Once I had the current user it was a simple conditional statement was all that was needed to get my routes working. Checkout the below implementation to see how it&amp;#8217;s done:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='c1'&gt;#lib/role_constraint.rb&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; 
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;RoleConstraint&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt;   &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;initialize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;roles&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt;     &lt;span class='vi'&gt;@roles&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;roles&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 
&lt;span class='lineno'&gt; 8&lt;/span&gt;   &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;matches?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt;     &lt;span class='vi'&gt;@roles&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;include?&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;env&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;warden&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;].&lt;/span&gt;&lt;span class='n'&gt;user&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;try&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:role&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt;   &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='c1'&gt;#config/routes.rb&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='n'&gt;root&lt;/span&gt; &lt;span class='ss'&gt;:to&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;admin#index&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:constraints&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;RoleConstraint&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:admin&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;#matches this route when the current user is an admin&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='n'&gt;root&lt;/span&gt; &lt;span class='ss'&gt;:to&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;sites#index&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:constraints&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;RoleConstraint&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:user&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;#matches this route when the current user is an user&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='n'&gt;root&lt;/span&gt; &lt;span class='ss'&gt;:to&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;home#index&amp;#39;&lt;/span&gt; &lt;span class='c1'&gt;#matches this route when the above two matches don&amp;#39;t pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/HoNpSzjKPPo" height="1" width="1"/&gt;</content>
   <updated>2011-10-24T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/</feedburner:origLink></entry>
 
 <entry>
   <id>http://minhajuddin.com/2011/10/03/mind-stack-a-stack-of-your-thoughts-and-tasks</id>
   <link href="http://feedproxy.google.com/~r/shiny-stuff/~3/ceEdxYmwRa4/" />
   <title>mind stack, a stack of your thoughts and tasks</title>
   <author>
     <name>Khaja Minhajuddin</name>
     <email>minhajuddin.k@gmail.com</email>
   </author>
   <content type="html">&lt;p&gt;As a developers, we are always bombarded with information/tasks/thoughts/ideas. And at times, it&amp;#8217;s very difficult to remember these things. On a lot of occasions, I start doing task X and in the middle of it, I remember that I need to &amp;#8220;fix something urgently&amp;#8221;, so I stop doing X and move to the Urgent task Y, when I am done with Y I have difficulty remembering what I was doing before that. This is just when I have two tasks, but the level of &lt;em&gt;nesting&lt;/em&gt; can sometimes go a lot &lt;em&gt;deeper&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s when I read a blog post(can&amp;#8217;t remember where), which talked about &lt;em&gt;saving&lt;/em&gt; your &lt;em&gt;state of mind&lt;/em&gt;(on post-it notes or notebooks or whatever). And, it has helped me a lot. I also created a little bash script which helps me &lt;em&gt;save my state of mind&lt;/em&gt;. I&amp;#8217;ve been using it for a long time and it has served me well. I am posting it on github hoping that others may find it useful. You can check it out at &lt;a href='https://github.com/minhajuddin/mindstack'&gt;Mind::Stack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also have the following line in my &lt;code&gt;.xmobarrc&lt;/code&gt; so that I can see the top 3 tasks in my status bar.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt;   , Run Com &lt;span class='s2'&gt;&amp;quot;/home/minhajuddin/.scripts/s&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;slotter&amp;quot;&lt;/span&gt; 600
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Screenshot of my xmobar&lt;/p&gt;

&lt;p&gt;&lt;img alt='Mindstack xmobar screenshot' src='/images/mindstack-screenshot.png' /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/shiny-stuff/~4/ceEdxYmwRa4" height="1" width="1"/&gt;</content>
   <updated>2011-10-03T00:00:00+00:00</updated>
 <feedburner:origLink>http://minhajuddin.com/2011/10/03/mind-stack-a-stack-of-your-thoughts-and-tasks/</feedburner:origLink></entry>
 
</feed>

