<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>capistrano &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/capistrano/</link>
	<description>Feed of posts on WordPress.com tagged "capistrano"</description>
	<pubDate>Sun, 29 Nov 2009 04:48:24 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Desplegando aplicaciones RoR: Capistrano + Mongrel (I)]]></title>
<link>http://yodesarrollo.wordpress.com/2009/11/16/desplegando-aplicaciones-ror-con-capistrano-mongrel-nginx-12/</link>
<pubDate>Mon, 16 Nov 2009 13:11:46 +0000</pubDate>
<dc:creator>Pablo</dc:creator>
<guid>http://yodesarrollo.wordpress.com/2009/11/16/desplegando-aplicaciones-ror-con-capistrano-mongrel-nginx-12/</guid>
<description><![CDATA[Estos días en el trabajo he estado desplegando una aplicación web hecha en Ruby On Rails, y hoy por ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Estos días en el trabajo he estado desplegando una aplicación web hecha en Ruby On Rails, y hoy por fin acabamos con ello. La verdad que el despliegue ha sido bastante sencillo, quitando aquellos típicos errores por no saber <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Hay varios tutoriales para desplegar usando <a href="http://www.capify.org/index.php/Capistrano">Capistrano</a>, <a href="http://mongrel.rubyforge.org/">Mongrel</a> y <a href="http://nginx.net/">Nginx</a>, pero yo voy a postear mi propia solución.</p>
<p>Para empezar,supongo que tienes un servidor funcionando con Ruby, las gemas de Rails, acceso ssh y Subversion.</p>
<p>Vayamos por partes, como diría Jack El Destripador: instalar Mongrel y Nginx en el servidor (en mi caso un flamante Debian Lenny):</p>
<pre class="brush: plain;">
# apt-get install nginx
# ### Mongrel lo instalo como una gema de Ruby
# gem install mongrel mongrel-cluster
</pre>
<p>Ahora podemos instalar Capistrano en el equipo de trabajo local</p>
<pre class="brush: plain;"># gem install capistrano</pre>
<p>¿Está? Ahora comenzamos el trabajo de verdad. La documentación de Capistrano (<a href="http://www.capify.org/index.php/Getting_Started">Getting Started</a> y <a href="http://www.capify.org/index.php/From_The_Beginning">From The Beiginning</a>) son más que suficentes para hacer funcionar Capistrano como Dios manda. Vayamos a la carpeta de la aplicación y ejecuta lo siguiente (si no está en el path, no queda otra que buscarlo):</p>
<pre class="brush: plain;"># capify .</pre>
<p>Esto genera dos ficheros, Capfile y deploy.rb. El contenido de deploy.rb tendrá la siguiente forma:</p>
<pre class="brush: ruby;">

set :application, &#34;Nombre de la aplicación&#34;
set :repository,  &#34;Ruta del repositorio al código. Como no especifico nada más, Capistrano asume que es Subversion&#34;
# Desplegar desde la rama trunk puede estar bien, pero a veces puede ser mejor crear una rama estable y desplegar de ahí, para curarse en salud

role :web, &#34;192.168.1.192&#34;                          # Mi servidor HTTP, Apache/etc
role :app, &#34;192.168.1.192&#34;                          # Mi servidor de aplicaciones
role :db,  &#34;192.168.1.192&#34;,:primary =&#62; true         # Servidor de base de datos. Le indico también que es la base de datos primaria

set :deploy_to, &#34;/home/deploy/apps/nombre-aplicacion/&#34; # El sitio donde se va a desplegar
set :user, 'deploy' # El usuario que desplegará todo

# namespace :deploy do
#   task :start {}
#   task :stop {}
#   task :restart, :roles =&#62; :app, :except =&#62; { :no_release =&#62; true } do
#     run &#34;#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}&#34;
#   end
# end
</pre>
<p>En el fichero Capfile no suele haber que tocar nada, pero puede que necesites especificar que usuario va a arrancar el servidor de aplicaciones. Para ello añade la siguiente línea al fichero Capfile:</p>
<pre class="brush: ruby;">set :runner, 'deploy'</pre>
<p>Con esto, un desplegado debería funcionar, como norma general. Para mas opciones, mira en los enlaces que mencioné antes.</p>
<p>Ahora, con Capistrano preparado para la marcha, y el servidor con las aplicaciones necesarias, desplegar es tan sencillo como hacer desde el equipo de trabajo:</p>
<pre class="brush: plain;">

cap deploy: setup
# =&#62; Con esto se prepara el servidor con la jerarquía de carpetas
# Después de esto es mejor mirar si las carpetas tienen el propietario y los permisos que deben.
cap deploy:check
# =&#62; Un chequeo de dependencias automático
cap deploy:update
# =&#62; Hace un checkout de la última versión del repositorio y lo organiza, estableciendo la ultima versión como &#34;current&#34;.</pre>
<p>Ahora damos respiro a este equipo, ya que tenemos que crear la base de datos. para ello nos conectamos a la base de datos de turno para la producción, creamos usuarios y todo lo necesario y desde el servidor mandamos hacer las migraciones:</p>
<pre class="brush: plain;">rake RAILS_ENV=production db:schema:load
# = &#62; Cualquier error aquí vendrá por que falta algo por hacer, o database.yml tiene algún dato incorrecto</pre>
<p>Con todo esto, ya debería funcionar la aplicación web. Podemos probarlo con &#8220;script/console production&#8221; o con WEBrick</p>
<p>Para que Capistrano pueda arrancar el servidor de aplicaciones, hay que crear un script en la carpeta script del proyecto. Lo llamamos spin, y para funcionar con Mongrel, ha de tener lo siguiente (cambiando por tus datos, claro ^_^):</p>
<pre class="brush: plain;">#!/bin/sh

/home/deploy/apps/mvweb4/current/script/process/spawner \
 mongrel \
 --environment=production \
 --instances=1 \
 --address=127.0.0.1 \
 --port=8000</pre>
<p>Si quisiera ejecutar más mongrels, en distintos puertos, solo tengo que repetir ese comando en el fichero.</p>
<p>Ahora, solo queda que en el equipo se mande a capistrano que arranque los Mongrel con:</p>
<pre class="brush: plain;"># cap deploy:start</pre>
<p>Gracias a todo esto tenemos el servidor de aplicaciones escuchando, desde local todo funciona, pero nos queda el servidor web. Como este post esta quedando muy largo, dejo para el siguiente finiquitar esto y dejarlo 100% funcional. Si llegaste leyendo hasta aquí ¡enhorabuena!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Migrating to Thinking Sphinx from Ferret]]></title>
<link>http://kaizenfury7.wordpress.com/2009/11/11/migrating-to-thinking-sphinx-from-ferret/</link>
<pubDate>Wed, 11 Nov 2009 21:48:03 +0000</pubDate>
<dc:creator>kaizenfury7</dc:creator>
<guid>http://kaizenfury7.wordpress.com/2009/11/11/migrating-to-thinking-sphinx-from-ferret/</guid>
<description><![CDATA[I recently switched to Thinking Sphinx from ferret and in doing so, I encountered some problems with]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I recently switched to Thinking Sphinx from ferret and in doing so, I encountered some problems with deploying it with Capistrano.  I tried to follow the <a href="http://freelancing-god.github.com/ts/en/deployment.html">official directions</a>, but to no avail.  So here are some of the gotchas I found:</p>
<p>Context: Deploying from Windows XP to Ubuntu Heron using Capistrano</p>
<ol>
<li>After you get thinking-sphinx installed and running, make sure to have <strong>svn ignore the db/sphinx folder</strong>.  The recipe in the official directions needs to create a symlink from db/sphinx to your shared folder and will be unable to do so if the folder already exists.
</li>
<li>
<strong>Remember to remove all references to ferret!</strong>  I had acts_as_ferret in a few of my models, and although I had turned off the ferret server, it locked up my web app whenever I did updates on a record.
</li>
<li>These are the portions of my recipe which differ from the official recipe:
<pre>
namespace :deploy do
  task :rebuild_index, :roles =&#62; :app do
    thinking_sphinx.stop
    update
    thinking_sphinx.index
    thinking_sphinx.start
    restart
end
</pre>
<p>I use this for when I <strong>make changes to the index and need to rebuild the index</strong>.  I made sure to put &#8216;thinking_sphinx.stop&#8217; above &#8216;update&#8217; to ensure that the server will be stopped using the old conf file if there is one.  </p>
<p>I also put in:</p>
<pre>
task :update_config, :roles =&#62; [:app], :except =&#62; { :no_release =&#62; true } do
  thinking_sphinx.configure
end
before 'deploy:finalize_update', :symlink_sphinx_indexes
before 'deploy:finalize_update', :update_config
</pre>
<p>to <strong>regenerate the sphinx configuration file on each deploy</strong> because Capistrano will checkout into a new folder which won&#8217;t have the configuration file in it.
</li>
</ol>
<p>Here&#8217;s my recipe code: <a href="http://www.pastie.org/705288">http://www.pastie.org/705288</a></p>
<p>Anyways, good luck to everyone else migrating to Thinking Sphinx!<!--more--></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Capistrano + Nginx + Thin deployment on Linode]]></title>
<link>http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/</link>
<pubDate>Tue, 10 Nov 2009 12:58:16 +0000</pubDate>
<dc:creator>gautamrege</dc:creator>
<guid>http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/</guid>
<description><![CDATA[This was long lost post I had written about 8 months ago (converted from wiki to HTML &#8211; so par]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>This was long lost post I had written about 8 months ago (converted from wiki to HTML &#8211; so pardon typos if any)</p>
<h2>Terminologies</h2>
<p><strong>Capistrano</strong> is a ruby gem which helps in remote deployment. As against widely known convention, Capistrano can be used for <strong>any</strong> deployment, not just a rails app!</p>
<p><strong>Nginx</strong> is a web-proxy server. This is simply a light weight HTTP web-server which received requests on HTTP and passes them to other applications. This is way more preferable than Application servers like Apache! Moreover, nginx is very easily configurable and can support multiple domain-names very easily. It has an in-build load-balancer which can send requests to apps based on its internal load-balancing mechanism.</p>
<p><strong>Thin</strong> is the next-generation lean, mean rails server. Its much faster, lighter in memory than mongrel. Its has an internal event based mechanism for request processing and a very high concurrency performance ratio than other rails servers.</p>
<p><strong>Linode</strong> is a VPS (a Virtual Private Server) that is hosted by <a href="http://www.linode.com">www.linode.com</a>. As the name suggests <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , its a &#8220;Linux Node&#8221;.  We are using Ubuntu 8.10 (Tip: To find Ubuntu release, issue command: lsb_release -a) <strong>NOTE:</strong> In the linode we had, it was a raw machine with no packages installed. Please read <a href="http://wiki.rubyonrails.org/getting-started/installation/linux">Linode RoR package installation</a> for details.</p>
<h2>Steps</h2>
<p><strong>Capistrano Configuration</strong> Follow the steps provided by Capistrano for basic instructions: <a href="http://www.capify.org/getting-started/from-the-beginning">Capistrano &#8211; From The Beginning</a> Some modifications that you may need (as I needed for deployment):</p>
<ul>
<li>Edit Capfile and add the following to it. This ensures that remote capistrano deployment does not fork a remote shell using command &#8220;sh -c&#8221;. Some hosting servers do not allow remote shells.</li>
<pre>default_run_options[:shell] = false</pre>
<li>In addition to changes mentioned in Capistrano tutorial, add the following to config/deploy.rb. This ensures that &#8220;sudo&#8221; is not used (default for Capistrano) and the user is &#8220;root&#8221;. Not usually a good practice.. but what the hell!</li>
<pre>set :use_sudo, false            set :user, "root"</pre>
<li> Since capistrano uses default script/spin and script/process/reaper, we need to override the deploy:start, deploy:stop and deploy:restart to ensure that we can start/stop the thin service and the ferret_server. I know that in deply:restart, there is a copy-paste involved but I am trying to find out how to invoke a rake task from another rake task.</li>
</ul>
<pre>namespace :deploy do
    desc "Custom AceMoney deployment: stop."
    task :stop, :roles =&#62; :app do

        invoke_command "cd #{current_path};./script/ferret_server -e production stop"
        invoke_command "service thin stop"
    end

    desc "Custom AceMoney deployment: start."
    task :start, :roles =&#62; :app do

        invoke_command "cd #{current_path};./script/ferret_server -e production start"
        invoke_command "service thin start"
    end

    # Need to define this restart ALSO as 'cap deploy' uses it
    # (Gautam) I dont know how to call tasks within tasks.
    desc "Custom AceMoney deployment: restart."
    task :restart, :roles =&#62; :app do

        invoke_command "cd #{current_path};./script/ferret_server -e production stop"
        invoke_command "service thin stop"
        invoke_command "cd #{current_path};./script/ferret_server -e production start"
        invoke_command "service thin start"
    end
end</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"><strong>Thin Configuraion</strong> I looked up most of the default configuration of Thin and Nginx on Ubunto at <a href="http://newwiki.rubyonrails.org/deployment/nginx-thin">Nginx + Thin</a>. Some extra configuration or differences are mentioned below. </span></p>
<ul>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">The init script for starting thin and nginx during startup is configured during package installation. Leave them as they are.</span></li>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">The following command generates the /etc/thin/acemoney.yml for 3 server starting from port 3000. Note that the -c option specifies the BASEDIR of the rails app. Do NOT change any settings in this file as far as possible.</span></li>
<pre><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">thin config -C /etc/thin/acemoney.yml -c /home/josh/current --servers 3 -e production -p 3000</span></pre>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">Starting and stopping thin is as simple as</span></li>
<pre><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">service thin start</span>
<span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">service thin stop</span></pre>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">This will read the acemoney.yml file and spawn the 3 thin processes. I noticed that each thin server took about 31MB in memory to start with and with caching went upto ~70MB. On the contrary, a mongrel server (tested earlier) started with 31MB but exceeded 110MB later! </span></li>
</ul>
<p><strong>Nginx Configuration</strong> Installation on nginx is simple on Ubuntu <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre>apt-get install nginx</pre>
<p>Configure the base /etc/nginx/nginx.conf. The default configuration are fine but I added / edited a few more for as recommended at <a href="http://articles.slicehost.com/2009/3/5/ubuntu-intrepid-nginx-configuration">Nginx Configuration</a></p>
<pre>        worker_processes  4;

        gzip_comp_level 2;
        gzip_proxied any;
        gzip_types  text/plain text/html text/css application/x-javascript
                    text/xml application/xml application/xml+rss text/javascript;</pre>
<p>According to this configuration above, nginx will spawn 4 worker threads and each worker thread can process 1024 connections (default setting). So, nginx can now process ~4000 concurrent HTTP requests !!! See performance article of thin at <a href="http://www.rubyinside.com/thin-a-ruby-http-daemon-thats-faster-than-mongrel-688.html"><span style="color:#000000;"><span style="text-decoration:none;">Thin Server</span></span></a></p>
<p>Configure the domainname, in our case acemoney.in. Ensure that acemoney.in &#8220;A record&#8221; entry points to this server! Check this by doing a nslookup or a ping for the server. In /etc/nginx/sites-available create a file by the domainname to be hosted. So I added /etc/nginx/sites-available/acemoney.in. In /etc/nginx/sites-enabled create a symbolic link to this file.</p>
<pre><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">ln -s /etc/nginx/sites-available/acemoney.in /etc/nginx/sites-enabled/acemoney.in </span></pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"> </span><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">Now add the contents in /etc/nginx/sites-available/acemoney.in <strong>This</strong> is the key configuration to hook up nginx with thin.</span></p>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size:small;"><span style="line-height:19px;white-space:normal;"> </span></span></p>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size:small;"> </span></p>
<pre>upstream thin {
     server 127.0.0.1:3000;
     server 127.0.0.1:3001;
     server 127.0.0.1:3002;
}

server {
    listen 80;
    server_name acemoney.in;

    root /home/josh/current/public;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect false;

      if (-f $request_filename/index.html) {
        rewrite (.*) $1/index.html break;
      }
      if (-f $request_filename.html) {
        rewrite (.*) $1.html break;
      }
      if (!-f $request_filename) {
        proxy_pass http://thin;
        break;
      }
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
      root html;
    }
}</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">To analyze this configuration, here are some details: </span></p>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">The following lines tell nginx to listen on port 80 for HTTP requests to acemoney.in. The &#8216;root&#8217; is the public directory for our rails app deployed at /home/josh/current! </span></p>
<pre>server {
    listen 80;
    server_name acemoney.in;

    root /home/josh/current/public;</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"> Now, nginx will try to process all HTTP requests and try to give the response.. for static HTML&#8217;s it will automatically give the data from the &#8216;root&#8217;. If it cannot find the HTML file, it will &#8216;proxy_pass&#8217; it to thin. &#8220;thin&#8221; in the code below is an &#8216;upstream&#8217; directive that tells nginx where to forward the current request it cannot directly serve.</span> <span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size:small;"> </span></p>
<pre>if (!-f $request_filename) {
        proxy_pass http://thin;
        break;
      }</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">The upstream code is where load-balancing plays a role in nginx. The following code tells nginx which all processes are running on which different ports and it forwards requests to <strong>any</strong> of the servers based on its internal load balancing algorithm. The servers can be on different machines (i.e. different IP addresses) if needed. In AceMoney, we have started 3 thin servers on 3 different ports! </span> <span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size:small;"> </span></p>
<pre>upstream thin {
     server 127.0.0.1:3000;
     server 127.0.0.1:3001;
     server 127.0.0.1:3002;
}</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"><strong>Performance Statistics</strong></span> <span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"> Nothing is complete without them. Here is what I found out for 3 thin servers and 1 ferret_server.</span></p>
<pre>top - 14:06:10 up 7 days, 22:58,  2 users,  load average: 0.00, 0.00, 0.00
Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    553176k total,   530868k used,    22308k free,    16196k buffers
Swap:   524280k total,     2520k used,   521760k free,    87280k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
12424 mysql     18   0  127m  42m 5520 S    0  7.9   0:23.01 mysqld
18338 root      15   0 77572  70m 4392 S    0 13.1   0:06.79 thin
18348 root      15   0 71176  64m 4388 S    0 11.9   0:06.51 thin
18343 root      15   0 68964  62m 4384 S    0 11.5   0:07.20 thin
18375 root      18   0 70912  54m 2660 S    0 10.0   2:34.24 ruby
 8141 www-data  15   0  5176 1736  820 S    0  0.3   0:00.07 nginx
 8142 www-data  15   0  5176 1724  816 S    0  0.3   0:00.01 nginx
 8144 www-data  15   0  5152 1720  816 S    0  0.3   0:00.06 nginx
 8143 www-data  15   0  5156 1656  784 S    0  0.3   0:00.00 nginx</pre>
<p><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">As can be seen: </span></p>
<ul>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">Each thin server takes around 70M</span></li>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">The Mysql server takes 41M</span></li>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;">Ruby process (18375 above) is the ferret_serve which takes 54M</span></li>
<li><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"> 4 nginx threads take about 1.7K in memory. </span></li>
</ul>
<pre><span style="font-family:Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;line-height:19px;white-space:normal;font-size:13px;"> Overall: (3 thin server cluster + Mysql + ferret): <strong>300MB</strong></span></pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[St. John Capistrano - Feast Day Oct. 23]]></title>
<link>http://lionslair.wordpress.com/2009/10/23/st-john-capistrano-feast-day-oct-23/</link>
<pubDate>Fri, 23 Oct 2009 13:31:15 +0000</pubDate>
<dc:creator>The Lioness</dc:creator>
<guid>http://lionslair.wordpress.com/2009/10/23/st-john-capistrano-feast-day-oct-23/</guid>
<description><![CDATA[SAINT JOHN OF CAPISTRANO (1386-1456) St. John of Capistrano was born in 1385, at Capistrano. St. Joh]]></description>
<content:encoded><![CDATA[SAINT JOHN OF CAPISTRANO (1386-1456) St. John of Capistrano was born in 1385, at Capistrano. St. Joh]]></content:encoded>
</item>
<item>
<title><![CDATA[Rails Summit 2009 - Chad Fowler]]></title>
<link>http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/</link>
<pubDate>Fri, 16 Oct 2009 02:37:13 +0000</pubDate>
<dc:creator>andrefaria</dc:creator>
<guid>http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/</guid>
<description><![CDATA[Depois de ter me impressionado com a qualidade do evento Rails Summit 2008 e a força da comunidade R]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Depois de ter me impressionado com a qualidade do <a href="http://andrefaria.com/2008/10/20/participacao-no-rails-summit-latin-america/">evento Rails Summit 2008</a> e a força da comunidade Ruby, não poderia de forma alguma deixar de marcar presença novamente este ano. O evento foi realizado nos dias 13 e 14 de outubro na cidade de São Paulo no auditório Elis Regina do Anhembi, e com uma organização novamente fantástica, contando com excelentes palestrantes, e uma audiência que sem dúvida está acima da média, o evento foi mais uma vez um sucesso total. Parabéns <a href="http://www.akitaonrails.com/">Akita</a> e equipe <a href="http://www.locaweb.com.br">Locaweb</a>!</p>
<p>Nesta série de posts que começa com este, quero registrar os pontos mais importantes e minhas principais impressões sobre a edição 2009 do evento.</p>
<p><a href="http://chadfowler.com">Chad Fowler</a> deu largada com a apresentação do keynote &#8220;<strong>Insurgência Ruby on Rails&#8221;</strong> em que explorou estratégias para insurgências de Ruby on Rails em ambientes pouco amigáveis. Logo no inicio da palestra Chad digiriu-se aos desenvolvedores dizendo &#8220;<em><strong>parem de fazer coisas que vocês sabem que estão erradas</strong></em>&#8220;,  sabemos que todos os dias, muitos de nós desenvolvedores realizamos nosso trabalho de forma burocrática e pouco produtiva, nem sempre utilizamos as melhores práticas e nem sempre temos <strong><a href="http://improveit.com.br/xp/valores/coragem">coragem</a></strong> suficiente para transformar essa realidade.</p>
<div class="wp-caption aligncenter" style="width: 460px"><a href="http://www.flickr.com/photos/danicuki/"><img class=" " title="Chad Fowler por Daniel Cukier" src="http://farm3.static.flickr.com/2607/4008587336_9347f99bcd.jpg" alt="Chad Fowler por Daniel Cukier" width="450" height="300" /></a><p class="wp-caption-text">Chad Fowler por Daniel Cukier</p></div>
<p>Segundo Chad, ao se tentar introduzir desenvolvimento ágil, ruby, rails e novas tecnologias nas organizações geralmente nos deparamos com <strong>monstros guardiões</strong> que tentam proteger suas empresas de <strong>mudanças </strong>a todo o custo, e eles o fazem por causa do fenômeno <a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt">FUD </a>(<em>Fear, uncertainty and doubt</em> &#8211; <strong>medo, incerteza e dúvida), </strong>por alguma razão eles tem medo, medo de sair da zona de conforto, <strong>medo de lutar contra a inércia</strong>, medo perder suas posições, medo de errar, e é então que buscam todo tipo de argumento estúpido para tentar evitar algo novo seja feito.</p>
<p>Esse é o caso da velha conversa mole de que rails não escala, isso graças aos problemas que o twitter, um famoso case de rails, enfrentou no passado, &#8220;<em><strong>o twitter não escalava por causa de sua arquitetura</strong></em>&#8221; disse Chad. A lista de desculpas dos tais guardiões não pára por aí, eles dizem que <strong>ruby é lento</strong>, &#8220;mas é claro que é, e quem se importa? O ruby é responsável por em torno de <strong>apenas 6% do tempo de request</strong> de uma aplicação web tradicional&#8221; afirma Chad. Eles perguntarão &#8220;mas dá pra fazer isso? e aquilo?&#8221; e não vão parar até que finalmente encontrem alguma coisas que lhes sirva de desculpa. Mas afinal de contas quem são esses caras? Será que você tem sido um deles?</p>
<p style="text-align:center;">
<div class="wp-caption aligncenter" style="width: 410px"><a href="http://www.flickr.com/photos/gmacorig/"><img class="  " title="Two dragons... (the gate to the end) por Giampaolo Macorig" src="http://farm1.static.flickr.com/46/106472343_689686aa68.jpg" alt="Two dragons... (the gate to the end) por Giampaolo Macorig" width="400" height="366" /></a><p class="wp-caption-text">Two dragons... (the gate to the end) por Giampaolo Macorig</p></div>
<p>Para ajudá-lo na batalha contra os guardiões, Chad recomendou a leitura do artigo &#8220;<a href="http://www.paulgraham.com/avg.html">beating the averages</a>&#8221; de <a href="http://www.paulgraham.com/">Paul Graham</a> e acrescentou procure fazer as coisas de forma gradual, se você tentar fazer uma mudança massiva, provavelmente vai acabar fazendo uma bagunça. Você pode até mesmo começar a usar <a href="http://railroad.rubyforge.org/">rails como uma ferramenta case</a>, é possível fazer algo parecido com o que propõe o <a href="http://www.nakedobjects.org">naked objects</a> com java. Use também  Ruby para criar scripts. Use Ruby para testar java, .net, c++.  Use Ruby para gerar código. Use Ruby como <a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html">template engine</a>. Automatize o seu deployment com <a href="http://www.capify.org/index.php/Capistrano">capistrano</a>. Use Ruby para construir protótipos de UI. <strong>Crie metas mensuráveis, meça e apresente resultados</strong>!</p>
<p>Um outro ponto importante é que para introduzir Rails você não precisa necessariamente jogar fora o seu investimento anterior, <a href="http://www.ironruby.net/">IronRuby</a>, <a href="http://jruby.org/">JRuby</a> e etc estão aí para entre outras coisas, te ajudar com isso, mas tome cuidado para não acabar escrevendo código Ruby da mesma forma que você escreve código Java ou C#, entenda que os paradigmas são diferentes e <strong>não tente abrir a casa nova com a chave da velha</strong>.</p>
<p>Chad recomendou ainda a leitura de sua série de artigos &#8220;<a href="http://chadfowler.com/2006/12/27/the-big-rewrite">The Big Rewrite</a>&#8221; e enfatizou <strong>conserve a <a href="http://andrefaria.com/2009/03/18/pense-grande-como-donald-trump/">paixão</a> pelo seu trabalho</strong>.</p>
<p>Assista <a href="http://blip.tv/file/2726795/">a palestra na integra</a> gentilmente gravada e disponibilizada por <a href="http://www.agaelebe.com.br/">Hugo Borges</a>:</p>
<p><!--blip.tv pattern not matched in posts_id=2746679&#38;dest=-1--></p>
<p>Em breve publicarei sobre mais palestras, a<a href="http://feeds.feedburner.com/andrefaria">ssine o feed</a> e acompanhe!</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:252px;width:1px;height:1px;">ruby is slow? of course it is but who cares? ruby is reponsible of about 6% of a web request in typical application.</div>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[http://github.com/nesquena/cap-recipes -...]]></title>
<link>http://bstonwebdev.wordpress.com/2009/10/09/httpgithub-comnesquenacap-recipes/</link>
<pubDate>Fri, 09 Oct 2009 15:10:19 +0000</pubDate>
<dc:creator>BillSaysThis</dc:creator>
<guid>http://bstonwebdev.wordpress.com/2009/10/09/httpgithub-comnesquenacap-recipes/</guid>
<description><![CDATA[http://github.com/nesquena/cap-recipes &#8211; Battle-tested capistrano recipes for passenger, delay]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>http://github.com/nesquena/cap-recipes<br />
&#8211; Battle-tested capistrano recipes for passenger, delayed_job, juggernaut, whenever, among other popular tools</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Double Shot #558]]></title>
<link>http://afreshcup.com/2009/10/09/double-shot-558/</link>
<pubDate>Fri, 09 Oct 2009 10:48:19 +0000</pubDate>
<dc:creator>Mike Gunderloy</dc:creator>
<guid>http://afreshcup.com/2009/10/09/double-shot-558/</guid>
<description><![CDATA[I&#8217;m getting too old for these late nights. Caliper &#8211; From Devver.net, a simple way to ru]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I&#8217;m getting too old for these late nights.</p>
<ul>
<li><strong><a href="http://devver.net/caliper">Caliper</a></strong> &#8211; From Devver.net, a simple way to run metric_fu on any project with an accessible git repo.</li>
<li><strong><a href="http://github.com/nesquena/cap-recipes/">cap-recipes</a></strong> &#8211; A collection of capistrano recipes for managing things like delayed job and whenever and passenger.</li>
<li><strong><a href="http://github.com/blog/515-gem-building-is-defunct">Gem Building is Defunct</a></strong> &#8211; At GitHub, anyhow. They&#8217;re throwing their weight behind Gemcutter.</li>
<li><strong><a href="http://invoicemachine.com/home">The Invoice Machine</a></strong> &#8211; New online time-tracking and invoicing service for freelancers.</li>
<li><strong><a href="http://github.com/stonean/ruhl">ruhl</a></strong> &#8211; Yet another new scheme for rendering HTML markup from Ruby in an elegant fashion.</li>
<li><strong><a href="http://beginningruby.org/what-ive-earned-and-learned/">What I’ve Earned (And Learned) From Writing “Beginning Ruby”</a></strong> &#8211; Basically, &#8220;writing books sucks.&#8221; </li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Double Shot #553]]></title>
<link>http://afreshcup.com/2009/10/02/double-shot-553/</link>
<pubDate>Fri, 02 Oct 2009 10:49:17 +0000</pubDate>
<dc:creator>Mike Gunderloy</dc:creator>
<guid>http://afreshcup.com/2009/10/02/double-shot-553/</guid>
<description><![CDATA[Bad ways to wake up #317: Spend an hour disassembling a 24&#8243; monitor to fix a broken power butt]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Bad ways to wake up #317: Spend an hour disassembling a 24&#8243; monitor to fix a broken power button.</p>
<ul>
<li><strong><a href="http://www.chicagoboss.org/">Chicago Boss</a></strong> &#8211; &#8220;The no-nonsense MVC framework for Erlang&#8221;. High on hype and buzzwords, but I don&#8217;t see any ponies. Not switching till I get ponies.</li>
<li><strong><a href="http://www.colonfail.com/?p=7">Dynamically filling capistrano roles via puppet’s stored config db</a></strong> &#8211; An interesting little code spike.</li>
<li><strong><a href="http://press.redhat.com/2009/10/01/one-small-leap-for-open-source-one-giant-leap-for-mankind/">One Small Leap for Open Source, One Giant Leap for Mankind</a></strong> &#8211; Red Hat on software patents. Bottom line: they&#8217;re willing to stand up and say they should be abolished. Good for you, Red Hat.</li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[http://github.com/relevance/cap_gun -- C...]]></title>
<link>http://bstonwebdev.wordpress.com/2009/10/01/httpgithub-comrelevancecap_gun-c/</link>
<pubDate>Thu, 01 Oct 2009 18:21:08 +0000</pubDate>
<dc:creator>BillSaysThis</dc:creator>
<guid>http://bstonwebdev.wordpress.com/2009/10/01/httpgithub-comrelevancecap_gun-c/</guid>
<description><![CDATA[http://github.com/relevance/cap_gun &#8211; CapGun: Tell everyone about your releases! Send email no]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>http://github.com/relevance/cap_gun<br />
&#8211; CapGun: Tell everyone about your releases! Send email notification after Capistrano deployments! Rule the world!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Double Shot #534]]></title>
<link>http://afreshcup.com/2009/09/07/double-shot-534/</link>
<pubDate>Mon, 07 Sep 2009 11:21:41 +0000</pubDate>
<dc:creator>Mike Gunderloy</dc:creator>
<guid>http://afreshcup.com/2009/09/07/double-shot-534/</guid>
<description><![CDATA[I pulled the trigger and upgraded my main dev box to Snow Leopard. Took about 12 hours including som]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I pulled the trigger and upgraded my main dev box to Snow Leopard. Took about 12 hours including some false starts, but all appears to be well.</p>
<ul>
<li><strong><a href="http://growl.info/beta.html">Growl 1.2b2</a></strong> &#8211; With Snow Leopard compatibility for GrowlMail.</li>
<li><strong><a href="http://blog.matt-darby.com/posts/759-capistrano-make-sure-there-is-something-to-deploy">Capistrano: Make sure there is something to deploy</a> </strong>- Tip passed on by Matt Darby.</li>
<li><strong><a href="http://github.com/terrbear/openid_engine/tree/master">openid_engine</a></strong> &#8211; Rails engine wrapper around the ruby-openid gem.</li>
<li><strong><a href="http://codahale.com/a-lesson-in-timing-attacks/">A Lesson In Timing Attacks (or, Don&#8217;t use MessageDigest.isEquals)</a></strong> &#8211; Some background for folks who don&#8217;t understand the latest Rails security patch.</li>
<li><strong><a href="http://railsmagazine.com/issues/4">Rails Magazine #4</a></strong> &#8211; Free PDF now available.</li>
<li><strong><a href="http://www.rubyinside.com/rvm-ruby-version-manager-2347.html#comment-39480">Make rvm and TextMate play nice</a></strong> &#8211; Patch from Peter Cooper.</li>
<li><strong><a href="http://www.indev.ca/MailTagsSnowLeopard.html">MailTags for Snow Leopard</a></strong> &#8211; Compatibility release, though major new features planned for some time this fall are still a mystery.</li>
<li><strong><a href="http://github.com/edavis10/prepend_engine_views/tree/master">prepend_engine_views</a></strong> &#8211; Code to add Rails engine views ahead of those in the app, from Eric Davis.</li>
<li><strong><a href="http://www.ricroberts.com/articles/2009/09/04/snow-leopard-ruby-development-environment-checklist-gotchas">Snow Leopard Ruby Development Environment Checklist / Gotchas</a></strong> &#8211; Notes from Ric Roberts.</li>
<li><strong><a href="http://www.metaskills.net/2009/9/5/the-ultimate-os-x-snow-leopard-stack-for-rails-development-x86_64-macports-ruby-1-8-1-9-sql-server-more">The Ultimate OS X Snow Leopard Stack For Rails Development &#8211; x86_64, MacPorts, Ruby 1.8/1.9, SQL Server, SQLite3, MySQL &#38; More</a></strong> &#8211; Another install guide, this one MacPorts-centric.</li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Despliegue de aplicaciones CakePHP con Capistrano]]></title>
<link>http://synergiasoluciones.wordpress.com/2009/09/05/despliegue-de-aplicaciones-cakephp-con-capistrano/</link>
<pubDate>Sat, 05 Sep 2009 16:03:33 +0000</pubDate>
<dc:creator>targess</dc:creator>
<guid>http://synergiasoluciones.wordpress.com/2009/09/05/despliegue-de-aplicaciones-cakephp-con-capistrano/</guid>
<description><![CDATA[Capistrano es una una herramienta para automatizar tareas realizadas contra un servidor remoto, perm]]></description>
<content:encoded><![CDATA[Capistrano es una una herramienta para automatizar tareas realizadas contra un servidor remoto, perm]]></content:encoded>
</item>
<item>
<title><![CDATA[Find the Latest SVN Repository Tag with Ruby]]></title>
<link>http://fitzgeraldsteele.wordpress.com/2009/09/02/find-the-latest-svn-repository-tag-with-ruby/</link>
<pubDate>Wed, 02 Sep 2009 18:20:56 +0000</pubDate>
<dc:creator>fitzgeraldsteele</dc:creator>
<guid>http://fitzgeraldsteele.wordpress.com/2009/09/02/find-the-latest-svn-repository-tag-with-ruby/</guid>
<description><![CDATA[Here&#8217;s a quick and dirty (and I mean DIRTY &#8211; use at your own risk) way to extract the la]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Here&#8217;s a quick and dirty (and I mean DIRTY &#8211; use at your own risk) way to extract the latest tag from a SVN repository.  This is a helper method I wrote for a Capistrano deploy script:</p>
<pre class="brush: ruby;">

# Quick and dirty means to pull the latest tag name from an SVN repository

# TODO: Error checking - it should have some
# TODO: Check to see if the repository exists before running code
# TODO: Return nothing if the tag doesn't look right (eg, the tag name is 'tags')

# Given an SVN repository URL, return the name of the latest tag in the repo/tags directory.
# * Assumes the standard SVN setup: trunk/, tags/, branches.  It will append the /tags/ directory to the end of the URL
# * Does ZERO error checking...returns whatever it finds.
def get_last_svn_tag(repo)

 txt = `svn log #{repo}/tags/ --limit=1 -v`

# thanks to http://www.txt2re.com/ for this
re1='.*?'    # Non-greedy match on filler
 re2='((?:\\/[\\w\\.\\-]+)+)'    # Unix Path 1

 re=(re1+re2)
 m=Regexp.new(re,Regexp::IGNORECASE);
 if m.match(txt)
 unixpath1=m.match(txt)[1];
 puts &quot;(&quot;&lt;&lt;unixpath1&lt;&lt;&quot;)&quot;&lt;&lt; &quot;\n&quot;
 latesttag =  File.basename(unixpath1)
 puts &quot;Tag name: &quot;&lt;&lt; latesttag &lt;&lt; &quot;\n&quot;
 return latesttag
 end
end

tag = &quot;get_last_svn_tag(&quot;http://some/repo&quot;)

puts &quot;Tagname: #{tag}&quot;
</pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Double Shot #520]]></title>
<link>http://afreshcup.com/2009/08/18/double-shot-520/</link>
<pubDate>Tue, 18 Aug 2009 10:07:33 +0000</pubDate>
<dc:creator>Mike Gunderloy</dc:creator>
<guid>http://afreshcup.com/2009/08/18/double-shot-520/</guid>
<description><![CDATA[Offline for a chunk of the day, just for a change. Still, a few links before I go. Clickistrano ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Offline for a chunk of the day, just for a change. Still, a few links before I go.</p>
<ul>
<li><strong><a href="http://github.com/outoftime/clickistrano/tree/master">Clickistrano</a></strong> &#8211; Sinatra-backed web UI for Capistrano deployments.</li>
<li><strong><a href="http://robots.thoughtbot.com/post/164832789/yard-sale-clearance">YARD sale clearance</a></strong> &#8211; Thoughtbot has pushed the documentation for Clearance out to rdoc.info.</li>
<li><strong><a href="http://aaronlongwell.com/2009/07/what-am-i-about-to-merge-with-git.html">What Am I About to Merge (with Git)?</a></strong> &#8211; Aaron Longwell demonstrates a shortcut for figuring out what&#8217;s on a branch you&#8217;ve been away from.</li>
<li><strong><a href="http://github.com/laserlemon/vestal_versions/tree/master">vestal_versions</a></strong> &#8211; Versioning for ActiveRecord that includes the ability to revert to a particular date or version and is very unobtrusive.</li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Micah and Tiffany]]></title>
<link>http://bradcapote.wordpress.com/2009/08/16/micah-and-tiffany/</link>
<pubDate>Sun, 16 Aug 2009 23:10:56 +0000</pubDate>
<dc:creator>Brad Capote</dc:creator>
<guid>http://bradcapote.wordpress.com/2009/08/16/micah-and-tiffany/</guid>
<description><![CDATA[T+M, originally uploaded by Brad Capote.]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div style="text-align:left;padding:3px;">
<a href="http://www.flickr.com/photos/bradcapote/3827066403/" title="photo sharing"><img src="http://farm3.static.flickr.com/2459/3827066403_378ab8b10a.jpg" style="border:solid 2px #000000;" alt="" /></a><br />
<br />
<span style="font-size:.8em;margin-top:0;"><a href="http://www.flickr.com/photos/bradcapote/3827066403/">T+M</a>, originally uploaded by <a href="http://www.flickr.com/people/bradcapote/">Brad Capote</a>.</span>
</div></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Micah and Tiffany (Post 2)]]></title>
<link>http://bradcapote.wordpress.com/2009/08/15/micah-and-tiffany-post-2/</link>
<pubDate>Sat, 15 Aug 2009 17:51:57 +0000</pubDate>
<dc:creator>Brad Capote</dc:creator>
<guid>http://bradcapote.wordpress.com/2009/08/15/micah-and-tiffany-post-2/</guid>
<description><![CDATA[]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:center;">
<p style="text-align:center;"><img src="http://farm4.static.flickr.com/3452/3823901068_c4f94233e4.jpg" alt="" /></p>
<p style="text-align:center;"><img src="http://farm3.static.flickr.com/2512/3823095115_3e9a28926c.jpg" alt="" /></p>
<p style="text-align:center;"><img src="http://farm3.static.flickr.com/2654/3823093965_1fd71a3c01.jpg" alt="" /></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Micah + Tiffany (Post 1)]]></title>
<link>http://bradcapote.wordpress.com/2009/08/14/micah-tiffany-post-1/</link>
<pubDate>Sat, 15 Aug 2009 06:21:16 +0000</pubDate>
<dc:creator>Brad Capote</dc:creator>
<guid>http://bradcapote.wordpress.com/2009/08/14/micah-tiffany-post-1/</guid>
<description><![CDATA[]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:center;"><img src="http://farm3.static.flickr.com/2457/3821885255_906ca9cb84.jpg" alt="" /></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Deploying and Maintaing your Rails Application]]></title>
<link>http://blog.brockbouchard.net/2009/08/11/deploying-and-maintaing-your-rails-application/</link>
<pubDate>Tue, 11 Aug 2009 08:11:30 +0000</pubDate>
<dc:creator>Brock</dc:creator>
<guid>http://blog.brockbouchard.net/2009/08/11/deploying-and-maintaing-your-rails-application/</guid>
<description><![CDATA[So you&#8217;ve bought yourself a good book on rails (I recommend Agile Web Development with Rails, ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>So you&#8217;ve bought yourself a good book on rails (I recommend <a href="http://www.amazon.com/Agile-Web-Development-Rails-Third/dp/1934356166/ref=sr_1_1?ie=UTF8&#38;qid=1249974162&#38;sr=8-1">Agile Web Development with Rails, Third Edition</a>), and you&#8217;ve finished developing, and writing tests for, your application.  If you&#8217;ve been following Agile development methods, you have even been deploying to your server using something like <a href="http://www.capify.org/index.php/Capistrano">Capistrano</a> right from the get go.</p>
<p>But now you are thinking about going live to the world, and suddenly realize there is still so much more to be done!  This is exactly where I found myself recently with the deployment of <a title="Brock Bouchard .net" href="http://brockbouchard.net">brockbouchard.net</a>.  Below are some of the tasks that are easy to overlook and how to go about completing them.</p>
<p><strong>1. Keeping Log Files Tidy</strong></p>
<p>While you could have your single production.log file fill up indefinitely on your server, it is better to create a rake task that will automatically truncate and create separate files for logs older than X days.  Below is a rake task that I use called &#8220;clean_logs&#8221; that does just this.  Place this code in a ruby file in your [rails_app]/lib/task directory:</p>
<pre class="brush: ruby;">
require 'ftools'

desc &quot;Truncates and backs up log files.  Deletes backup logs older than ENV['CLEAN_LOGS_DAYS_OLD'] days, default is 30.  Set RAILS_ENV on command line to target correct log file.&quot;
task :clean_logs =&gt; :environment do

  days_ago = ENV['CLEAN_LOGS_DAYS_OLD'] &amp;#124;&amp;#124; 30

  environment_name = ENV['RAILS_ENV'].downcase
  log_file = &quot;log/#{environment_name}.log&quot;
  log_file_backup = &quot;log/#{environment_name}-#{Date.today.to_s}.log&quot;

  if File.exist?(log_file)
    # move log file
    File.move log_file, log_file_backup, true
    # delete log files older than days_ago
    puts &quot;Deleting log file backups prior to #{Date.today - days_ago}&quot;
    Dir.foreach &quot;log&quot; do &amp;#124;filename&amp;#124;
      if filename =~ /#{environment_name}-\d\d\d\d-\d\d-\d\d/
        backup_date = Date.parse filename.scan(/\d\d\d\d-\d\d-\d\d/)[0]
        File.delete &quot;log/#{filename}&quot; if Date.today - backup_date &gt; days_ago
      end
    end
  else
    puts &quot;#{log_file_name} does not exist.&quot;
  end

end
</pre>
<p>Note here that X defaults to 30, you can change the default to whatever you like, or you can pass in the number of days to keep.  With this rake task in place, add an entry for it to your crontab:</p>
<pre class="brush: bash;">
0 9 * * * cd /path/to/rails/app &amp;&amp; /path/to/rake clean_logs RAILS_ENV=production
</pre>
<p>Notice that the full path to the rake executable is specified.  In my case, it is /usr/bin/rake.  However on some systems it may be different.</p>
<p><strong>2. Backing Up Your Database</strong></p>
<p>Even if you run a small site with a small audience, or don&#8217;t have access to fancy backup drives or tapes, you should employ some kind of database backup.  This is indeed my situation: <a title="Brock Bouchard .net" href="http://brockbouchard.net">brockbouchard.net</a> and its MySQL database all run on one affordable VPS hosting plan.  Nonetheless I run a database backup every night with the following shell script&#8230;</p>
<pre class="brush: bash;">
#!/bin/sh
/usr/bin/mysqldump -h localhost database_name -uusername -ppassword &gt; /path/to/db/backup/directory/`date +%Y%m%d`.sql
/bin/gzip /path/to/db/backup/directory/`date +%Y%m%d`.sql
</pre>
<p>&#8230;that is called from cron with the following entry&#8230;</p>
<pre class="brush: bash;">
0 10 * * * /path/to/db_backup_script
</pre>
<p>Be sure to verify the exact location of your mysqldump and gzip commands.  They could be different on your system.  Indeed I was loathe at first to go through setting this up, but just the other day MySQL decided to corrupt my live database upon server restart.  Fortunately I had a backup ready and waiting!</p>
<p><strong>3. Handling Errors</strong></p>
<p>The first thing to do here is create custom 404, 422 and 500 error pages.  You&#8217;ll notice that your Rails app has an html file corresponding to each error number under the [rails_app]/public directory.  While the pages created by rails may suffice, it would probably be more helpful to create a page with relevant contact information on it!</p>
<p>The next thing to do is install the <a href="http://agilewebdevelopment.com/plugins/exception_notifier">Exception Notifier</a> plugin.  It&#8217;s a pretty straight-forward installation, with the following catch.  If you are using a recent version of Rails (I believe 2.2 or later), you&#8217;ll need to add a new ruby file to your [rails_app]/config/initializers directory where you will initialize the exception notifier plugin:</p>
<pre class="brush: ruby;">
ExceptionNotifier.exception_recipients = %w(errors@yourdomain.com)
ExceptionNotifier.sender_address = %(errors@yourdomain.com)
</pre>
<p>In earlier versions of Rails you could configure ExceptionNotifier right inside of your production.rb configuration file.  But apparently something changed in a recent version of Rails such that doing so no longer works.</p>
<p>Finally, in order to actually get error emails, <em>don&#8217;t forget to configure your mail server</em> as I talk about below!</p>
<p><strong>4. Configure Your Mail Server</strong></p>
<p>Oh wow did I ever get burnt by this.  I spent way too much of my time wondering why emails sent by cron and my Rails app were not arriving.  While your mail server situation may be more complex and may already be setup by an IT department, in my case my app is a one man show running on an affordable VPS hosting plan.  By default my mail server (exim4) was limiting emails to local domains only.  I only discovered this after looking in my /var/log/exim4/mainlog file:</p>
<pre class="brush: bash;">
... Mailing to remote domains not supported ...
</pre>
<p>Once I turned this off everything was fine.  If you are in the same boat as me, refer to your mail server&#8217;s documentation for info on how to disable this behavior.</p>
<p><strong>5. Permissions</strong></p>
<p>Make sure the directory hosting your application is accessible by the user your web server (Apache, nginx, etc) runs as, and make sure new files placed there pick up those permissions.  I host <a title="Brock Bouchard .net" href="http://brockbouchard.net">brockbouchard.net</a> on <a href="http://slicehost.com">Slice Host</a> (which I highly recommend) and they have a great article about setting up Apache permissions.  While it follows the deployment conventions of their tutorials, it is nonetheless useful as one could  easily draw parallels to their particular environment:</p>
<ol>
<li><a href="http://articles.slicehost.com/2007/9/18/apache-virtual-hosts-permissions">http://articles.slicehost.com/2007/9/18/apache-virtual-hosts-permissions</a></li>
</ol>
<p><strong>6. Maintaing Files in /public</strong></p>
<p>You may have files in your [rails_app]/public directory that are not part of your Rails app; these could be files you upload manually or files that others upload.  However if you are using <a href="http://capistrano.org">Capistrano</a> to deploy your Rails app (and you should be), each successive deployment will leave the files in your [rails_app]/public directory that are not under source control in the directory for the previous release!  Fortunately this is easy enough to get around by putting something similar to the following in your [rails_app]/config/deploy.rb file:</p>
<pre class="brush: ruby;">
namespace :deploy do
  task :move_uploaded_files, <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> n_error =&gt; :continue do
    run &quot;mv #{previous_release}/public/uploaded_files #{current_release}/public&quot;
  end
end

after &quot;deploy:update_code&quot;, &quot;deploy:move_uploaded_files&quot;
</pre>
<p><strong>7. Basic Search Engine Optimization (SEO)</strong></p>
<p>While I am not an expert in this field, I knew I had to do something about this for my site!  I found a number of good tutorials for this with Rails in mind:</p>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:2088px;width:1px;height:1px;">http://www.seoonrails.com/</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:2088px;width:1px;height:1px;">http://www.bingocardcreator.com/articles/rails-seo-tips.htm</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:2088px;width:1px;height:1px;">http://www.tonyspencer.com/2007/01/26/seo-for-ruby-on-rails/</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:2088px;width:1px;height:1px;">http://noobonrails.blogspot.com/2006/09/good-seo-mojo-with-rails.html</div>
<ol>
<li><a href="http://www.seoonrails.com/">http://www.seoonrails.com/<br />
</a></li>
<li><a href="http://www.bingocardcreator.com/articles/rails-seo-tips.htm">http://www.bingocardcreator.com/articles/rails-seo-tips.htm<br />
</a></li>
<li><a href="http://www.tonyspencer.com/2007/01/26/seo-for-ruby-on-rails/">http://www.tonyspencer.com/2007/01/26/seo-for-ruby-on-rails/<br />
</a></li>
<li><a href="http://noobonrails.blogspot.com/2006/09/good-seo-mojo-with-rails.html">http://noobonrails.blogspot.com/2006/09/good-seo-mojo-with-rails.html</a></li>
</ol>
<p>I also set out to get my Rails app setup with a Google sitemap and Google webmaster tools.  This was a little bit more complicated and I will leave it for my next post!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Escola Rural é arrombada durante o fim de semana]]></title>
<link>http://valeindependente.wordpress.com/2009/08/10/escola-rural-e-arrombada-durante-o-fim-de-semana/</link>
<pubDate>Tue, 11 Aug 2009 01:10:06 +0000</pubDate>
<dc:creator>Eduardo Avival</dc:creator>
<guid>http://valeindependente.wordpress.com/2009/08/10/escola-rural-e-arrombada-durante-o-fim-de-semana/</guid>
<description><![CDATA[A Escola Municipal Mariquinha Capistrano situada na estrada vicinal Bairro Vintém na zona rural, foi]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><strong>A Escola Municipal Mariquinha Capistrano situada na estrada vicinal Bairro Vintém na zona rural, foi arrombada no final de semana.O fato só foi descoberto pela manhã de hoje (10/08) quando as funcionárias chegaram para o trabalho e  depararam com o cadeado onde dá acesso ao consultório odontológico estourado.</strong></p>
<p><strong>Segundo a Coordenadora  L.O.M. de 42 anos, foi levado 01(um) compressor de ar, 01 (uma) antena de celular e  01 (uma) antena de internet, a Polícia Militar foi acionada,porém não há pista do autor.</strong></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Double Shot #512]]></title>
<link>http://afreshcup.com/2009/08/06/double-shot-512/</link>
<pubDate>Thu, 06 Aug 2009 09:45:09 +0000</pubDate>
<dc:creator>Mike Gunderloy</dc:creator>
<guid>http://afreshcup.com/2009/08/06/double-shot-512/</guid>
<description><![CDATA[Lots of people are excited about Rails and 37Signals being mentioned in Microsoft&#8217;s annual For]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Lots of people are excited about Rails and 37Signals being mentioned in Microsoft&#8217;s annual <strong><a href="http://www.sec.gov/Archives/edgar/data/789019/000119312509158735/d10k.htm">Form 10-K</a></strong>. I think that&#8217;s just silly. This isn&#8217;t any sort of acknowledgement that Microsoft considers us a serious threat; it&#8217;s a &#8220;cover your ass&#8221; survey of software and firms whose business overlaps that of Microsoft. For some perspective, go look at other 10-K&#8217;s; for example, the one for <strong><a href="http://www.sec.gov/Archives/edgar/data/63908/000119312509037008/d10k.htm">McDonald&#8217;s</a></strong> says &#8220;The Company’s competition in the broadest perspective includes restaurants, quick-service eating establishments, pizza parlors, coffee shops, street vendors, convenience food stores, delicatessens and supermarkets.&#8221; So, yeah &#8211; McDonald&#8217;s:street vendor::Microsoft:37 Signals. That&#8217;d be about right.</p>
<li><strong><a href="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/">NoSQL: If Only It Was That Easy</a></strong> &#8211; Look at some of the currently-sexy database alternatives by someone who actually evaluated at heavy load.</li>
<li><strong><a href="http://github.com/blog/470-deployment-script-spring-cleaning">Deployment Script Spring Cleaning</a></strong> &#8211; New ideas on using Capistrano with git, from the GitHub guys.</li>
<li><strong><a href="http://www.napkee.com/">Napkee</a></strong> &#8211; Convert Balsamiq Mockups to HTML/CSS/JSS/Flex 3 source.</li>
<li><strong><a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/297dd2a2923c8de6/ca2e9dc8b2b21962?show_docid=ca2e9dc8b2b21962">Lone Star Ruby Conference</a></strong> &#8211; One more week for registration for this Texas conference at the end of the month.</li>
<li><strong><a href="http://wiki.github.com/cpjolicoeur/cerberus">Cerberus 0.7</a></strong> &#8211; Lightweight continuous integration, now with Bazaar support and better Git support.</li>
<li><strong><a href="http://theadmin.org/articles/2009/8/5/railsbridge-bugmash-contribute-to-the-rails-core">RailsBridge BugMash &#8211; Contribute to the Rails core</a></strong> &#8211; Just a reminder: it&#8217;s coming up this weekend.</li>
<li><strong><a href="http://github.com/ryanb/complex-form-examples/tree/master">complex-form-examples</a></strong> &#8211; Ryan Bates takes a shot at showing ways to manage forms with nested attributes.</li>
<li><strong><a href="http://github.com/thisisdato/va_cache/tree/master">va_cache</a></strong> &#8211; Simple caching for Active Record virtual attributes.</li>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Southern Orange County wants to Secede from MWDOC; Report says this would be financially unwise]]></title>
<link>http://waterwiseconsulting.wordpress.com/2009/08/04/southern-orange-county-wants-to-secede-from-mwdoc-report-says-this-would-be-financially-unwise/</link>
<pubDate>Tue, 04 Aug 2009 23:35:31 +0000</pubDate>
<dc:creator>Kevin Collier</dc:creator>
<guid>http://waterwiseconsulting.wordpress.com/2009/08/04/southern-orange-county-wants-to-secede-from-mwdoc-report-says-this-would-be-financially-unwise/</guid>
<description><![CDATA[Teri Sforza writes in The OC Register about The Municipal Water District of Orange County&#8217;s re]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Teri Sforza writes in The OC Register about The Municipal Water District of Orange County&#8217;s response to claims that its southern cities, Laguna Beach, San Juan Capistrano, and San Clemente, would leave the umbrella of MWDOC and form their own Water District. MWDOC issued a report that found a large amount of money would be wasted if this happened.</p>
<p>The proposed new water agency would be called south Orange County Water Authority and it comes as a sort of mirror to the United States&#8217; formation out of Great Britain. They list a series of concerns in a report, saying they disagree with some decisions and policies of MWDOC.</p>
<p>The southern cities and agencies claim that the new water authority would save customers money. MWDOC&#8217;s rebuttal offers figures to back up its claim that, long-term, both the southern and northern cities would lose money. Not only that, but MWDOC is currently number 3 under the umbrella of MWD, and its power on the water board would suffer due to the division.</p>
<p>The article provides facts and rebuts so-called misinformation from the report. It looks like there is some tension among cities in Orange County regarding water. So, what will come of this? Will the southern cities get their wish and break away from MWDOC? Or can the two parties patch things up and retain stability within MWDOC?</p>
<p>What do you think of these developments? Read both sides of the issue and decide for yourself: <a title="Southern secession from OC Water Union would waste millions" href="http://http://taxdollars.freedomblogging.com/2009/08/04/southern-secession-from-oc-water-union-would-waste-millions-report-says/29657/" target="_blank">MWDOC</a> and <a title="South-oc-water-authority.pdf" href="http://taxdollars.freedomblogging.com/2009/07/22/mutiny-ahoy-southerners-may-seceed-from-water-union-which-could-cost-northerners-money/27691/south-oc-water-authoritypdf/" target="_blank">South OC Water Authority</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[which subversion will submit itself to my feet?]]></title>
<link>http://pinastro.wordpress.com/2009/07/04/which-subversion-will-submit-itself-to-my-feet/</link>
<pubDate>Sat, 04 Jul 2009 06:28:47 +0000</pubDate>
<dc:creator>pinastro</dc:creator>
<guid>http://pinastro.wordpress.com/2009/07/04/which-subversion-will-submit-itself-to-my-feet/</guid>
<description><![CDATA[Please help me in this.I am trying to deploy my Rails app on my bluehost domain.The tutorial mention]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Please help me in this.I am trying to deploy my Rails app on my bluehost domain.The tutorial mentioned in the bluehost sucks and doesn&#8217;t seem to work though I am getting this screen but again with a 404 not found message in place of &#8230; (server info??)</p>
<div id="attachment_495" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-495" title="rails" src="http://pinastro.wordpress.com/files/2009/07/rails.png" alt="WTF ?" width="500" height="312" /><p class="wp-caption-text">WTF ?</p></div>
<p>I asked the help from Bluehost&#8217;s Live chat but there doesn&#8217;t seem to be any solid support guy who can guide me on this.Even the ROR guide mentioned in the Knowledge base seems to be an outdated one.</p>
<p>I asked about using Subversioning as mentioned in various blogs about deployment in rails.They said they do not endorse SVN for their host though we can do that&#8230;Chat closed..</p>
<p>WTH</p>
<p>There are so many ways to deploy rails application&#8230;though I still not able to figure out what is using which strategy.I was following blindly whatever was mentioned in the blogs.</p>
<p>This is my current stop at deployment effort.</p>
<p>http://www.codeweblog.com/capistrano-automatic-deployment-of-rails-projects-windows-to-bluehost-fastdomain/</p>
<p>Which asks for installing SVN client on my host&#8230; and for installing SVN this is the blog i am following</p>
<p>http://www.tabruyn.com/site/index.php?option=com_content&#38;view=article&#38;id=55:tortoisesvn-subversion-and-bluehost&#38;catid=36:digital&#38;Itemid=58</p>
<p>I found that apr and apr-util versions are outdated ones so I went to the gtlib,gatech.edu and downloaded the latest versions of apr and apr-util that is apr-1.3.5 and apr-util-1.3.7.</p>
<p>then I downloaded neon-0.28.0. I don&#8217;t know what is that for ???</p>
<p>then the subversion 1.6.3 then 1.4.6. I am able to MAKE apr and apr-util versions and also the neon versions but the SVN 1.6.3 said that the SVN is not compatible with apr-version so I tried making SVN 1.4.6 which was compatible with apr-1.3.5 but was not compatible with apr-util-1.3.7</p>
<div id="attachment_497" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-497" title="odd man" src="http://pinastro.wordpress.com/files/2009/07/odd-man.png" alt="The odd men here is the SVN 1.4 and 1.6 versions ..help needed" width="500" height="233" /><p class="wp-caption-text">The odd men here is the SVN 1.4 and 1.6 versions ..help needed</p></div>
<p>What I need is a proper version of SVN that can work with the following :</p>
<ul>
<li> apr-1.3.5</li>
<li> apr-util-1.3.7</li>
<li> neon-0.28.0</li>
</ul>
<p>I need help &#8230;if you have any easier way ..ONE CLICK DEPLOYMENT for RAILS please suggest me</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ubuntu Capistrano]]></title>
<link>http://indlovu.wordpress.com/2009/06/30/ubuntu-capistrano/</link>
<pubDate>Tue, 30 Jun 2009 10:00:35 +0000</pubDate>
<dc:creator>davidrobertlewis</dc:creator>
<guid>http://indlovu.wordpress.com/2009/06/30/ubuntu-capistrano/</guid>
<description><![CDATA[This looks amazing. If you need to set-up a server, Ubuntu Machine has Capistrano recipes that will ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="alignleft size-full wp-image-524" title="logo-ubuntu-machine" src="http://indlovu.wordpress.com/files/2009/06/logo-ubuntu-machine.jpg" alt="logo-ubuntu-machine" width="377" height="52" /></p>
<p>This looks amazing. If you need to set-up a server, <a href="http://suitmymind.github.com/ubuntu-machine/">Ubuntu Machine</a> has Capistrano recipes that will automate the setups. Now wouldn&#8217;t it be amazing to see some desktop customisations coming out as Capistrano recipes? In fact I would love to reduce my entire setup to a script, and carry my Ubuntu computer around in my pocket. Or better yet, upload my data, and publish my installation which could then behave like ET and phone home?</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Yarn Closet, A Hat, and Updatery!!]]></title>
<link>http://domiknitrix.wordpress.com/2009/06/28/yarn-closet-a-hat-and-updatery/</link>
<pubDate>Mon, 29 Jun 2009 01:43:46 +0000</pubDate>
<dc:creator>Felicity</dc:creator>
<guid>http://domiknitrix.wordpress.com/2009/06/28/yarn-closet-a-hat-and-updatery/</guid>
<description><![CDATA[Hello hello!! A semi big post with plenty o pictures to feast your eyes on. First, a self plug]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello hello!! A semi big post with plenty o pictures to feast your eyes on.</p>
<p>First, a self plug&#8211;I&#8217;m slowly getting together a store for selling my handknit items. It will primarily be lace. I&#8217;ll likely post pictures of each up here before they ever get listed, seeing as they are projects!  For the moment, you can go visit the site (which is seperate from the Etsy store I&#8217;ll be using). <a href="http://silverroselace.com">Silverrose Lace</a></p>
<p>So the intarsia gift is finished and sent away. It&#8217;s found a good home with my friend Mroo.  Since I was so rushed to get it to her on time (well, it was a self-imposed deadline, but dammit, I was going to keep it!) she&#8217;ll be sending pictures later. Then I&#8217;ll post them up here.</p>
<p>Moving along, I just finished another gift, a hat from the Winter 08 issue of Knitty (Fern Glade pattern I do believe) in KnitPicks Merino Style storm. Pictures to follow in a moment; the pattern itself was wonderful to knit, stayed interesting, and was really quite easy once I got the feel for it.  The gauge is larger than what it should have been, but my ribbing always ends up too wide and in the end I don&#8217;t think it&#8217;s affected the pattern much.  It took a while to wash for blocking, if only because I was paranoid I might felt it by accident&#8211;nevermind I&#8217;ve never done it to anything else. I&#8217;m just glad it&#8217;s done.  </p>
<div id="attachment_154" class="wp-caption aligncenter" style="width: 1034px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-006-1024x768.jpg" alt="Seed stitch between the ferns." title="kat&#39;s hat 006 (1024x768)" width="300" height="225" class="size-full wp-image-154" /><p class="wp-caption-text">Seed stitch between the ferns.</p></div>
<div id="attachment_150" class="wp-caption aligncenter" style="width: 1034px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-005-1024x768.jpg" alt="The fern pattern" title="kat&#39;s hat 005 (1024x768)" width="300" height="225" class="size-full wp-image-150" /><p class="wp-caption-text">The fern pattern</p></div>
<div id="attachment_152" class="wp-caption aligncenter" style="width: 310px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-007-1024x768.jpg?w=300" alt="Still on the blocking plate, the top of the hat." title="kat&#39;s hat 007 (1024x768)" width="300" height="225" class="size-medium wp-image-152" /><p class="wp-caption-text">Still on the blocking plate, the top of the hat.</p></div>
<div id="attachment_153" class="wp-caption aligncenter" style="width: 310px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-001-1024x768.jpg?w=300" alt="The hat on a human head (mine!). " title="kat&#39;s hat 001 (1024x768)" width="300" height="225" class="size-medium wp-image-153" /><p class="wp-caption-text">The hat on a human head (mine!). </p></div>
<div id="attachment_148" class="wp-caption aligncenter" style="width: 310px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-010-1024x768.jpg?w=300" alt="My stuffed horse OLiReH models the hat for us." title="kat&#39;s hat 010 (1024x768)" width="300" height="225" class="size-medium wp-image-148" /><p class="wp-caption-text">My stuffed horse OLiReH models the hat for us.</p></div>
<p>On the spinning front, I just finished the first two ounces of my Capistrano fiber &#8220;Sargasseo Sea,&#8221; the lovely BFL. It&#8217;s making a lovely laceweight, and I&#8217;m up to probably about 500 yards (an estimate, as I haven&#8217;t counted the last batch).</p>
<div id="attachment_151" class="wp-caption aligncenter" style="width: 235px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-011-768x1024.jpg?w=225" alt="Capistrano Fiber BFL is drying. There&#39;s a lot of teal in the middle, which you can&#39;t see here." title="kat&#39;s hat 011 (768x1024)" width="225" height="300" class="size-medium wp-image-151" /><p class="wp-caption-text">Capistrano Fiber BFL is drying. There's a lot of teal in the middle, which you can't see here.</p></div>
<p>And to wrap up, I finally got a yarn closet! So here&#8217;s a picture of the closet open, and all the glorious stash in it. I plan on hopefully not ending up with more than I can fit in this thing, but let&#8217;s be realistic.</p>
<div id="attachment_155" class="wp-caption aligncenter" style="width: 235px"><img src="http://domiknitrix.wordpress.com/files/2009/06/kats-hat-012-768x1024.jpg?w=225" alt="Yarndrobe!!" title="kat&#39;s hat 012 (768x1024)" width="225" height="300" class="size-medium wp-image-155" /><p class="wp-caption-text">Yarndrobe!!</p></div>
<p>The top has knitting books. First shelf is needles, niddy noddy, spindles, ect. Second shelf is current projects/fiber being used, vinegar and soap for the yarn, and little knicks to easily reach. Third is yarn, vaguely arranged right to left, lace weight to bulky. Fourth is the fiber shelf, and last is the finished/needs to be frogged things and blocking mats. </p>
<p>Wow, that was a ton. Probably more than I&#8217;ve posted in a while. Now, allow me to write up another post and schedule it to go up later so that I don&#8217;t forget!</p>
<p>Peace,<br />
Brooke</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
