<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>cientifico.net</title>
  <link href="http://cientifico.net" rel="self"/>
  <id>http://cientifico.net</id>
  <updated>2010-07-01T16:37:32Z</updated>
  <author>
    <name>Guillermo &#193;lvarez Fern&#225;ndez</name>
  </author>
  <entry>
    <title>nginx rails passenger mass deployment actually.</title>
    <link href="http://cientifico.net/post/2010/07/01/nginx-rails-passenger-mass-deployment-actually" rel="alternate"/>
    <id>http://cientifico.net/post/2010/07/01/nginx-rails-passenger-mass-deployment-actually</id>
    <updated>2010-07-01T16:37:32Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>
I typically deploys several applications that do not have much load on one machine.&#160;I use the advanced nginx virtual host ...</summary>
    <content type="html">
&lt;div class="almost_half_cell"&gt;
&lt;div dir="ltr"&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span&gt;I typically deploys several applications that do not have much load on one machine.&#160;I u&lt;/span&gt;&lt;span&gt;se the &lt;a href="http://wiki.nginx.org/NginxVirtualHostExample"&gt;advanced nginx virtual host technic&lt;/a&gt;(see Wildcard Subdomains in a Parent Folder).&lt;/p&gt;
&lt;p&gt;&lt;/span&gt;&lt;span&gt;I was rather surprised to see the article "&lt;/span&gt;&lt;span&gt;&lt;a href="http://blog.phusion.nl/2010/07/01/the-road-to-passenger-3-technology-preview-3-closing-the-gap-between-development-and-production-rethinking-the-word-easy/"&gt;new Passenger 3&lt;/a&gt;&lt;/span&gt;&lt;span&gt;", especially in the aspect of mass deployment. &lt;/span&gt;&lt;span&gt;Feature that since I have tested, works in nginx and Passenger series (do not know from which version).&lt;/p&gt;
&lt;p&gt;&lt;/span&gt;&lt;span&gt;The part of the nginx configuration that makes this possible is this:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre name='code' class="ruby"&gt; http {     # [...]     passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15;     passenger_ruby /usr/local/bin/ruby;              server {         listen 0.0.0.0:80;         root /var/www/servers/$host/public;         access_log /var/log/nginx/servers.access.log;         error_log /var/log/nginx/servers.error.log;          location / {            index index.html index.php;            passenger_enabled on;            autoindex  on;         }     }     # [...] }  &lt;/pre&gt;
&lt;div dir="ltr"&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/span&gt;&lt;span&gt;As soon as dir structure is as &lt;a href="http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_a_rack_app"&gt;says on the documentation of Passenger&lt;/a&gt; (config.ru  /tmp and /public) appears an application on the specific domain.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span&gt;So if you want to deploy a new app, just put the files on the server.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span&gt;&lt;strong&gt;ExtraBoll&lt;/strong&gt;, for &lt;strong&gt;capistrano style&lt;/strong&gt; deploys:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre name='code' class="ruby"&gt; http {        ...          server {         ...         root /var/www/servers/$host/current/public;     } } &lt;/pre&gt;
&lt;/div&gt;
    </content>
  </entry>
  <entry>
    <title>El curioso bucle begin end while. Balbuceando en alto.</title>
    <link href="http://cientifico.net/post/2009/04/21/el-curioso-bucle-begin-end-while-balbuceando-alto" rel="alternate"/>
    <id>http://cientifico.net/post/2009/04/21/el-curioso-bucle-begin-end-while-balbuceando-alto</id>
    <updated>2009-04-21T00:00:41Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>Creo que todos conocemos una sintaxis parecida:&amp;nbsp;&amp;nbsp;def function&amp;nbsp;&amp;nbsp; &amp;nbsp;do something&amp;nbsp;&amp;nbsp; &amp;nbsp;whil...</summary>
    <content type="html">
&lt;p&gt;Creo que todos conocemos una sintaxis parecida:
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;def function&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;do something&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while condition&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;do something&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;end&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;En la mayor&#237;a de lenguajes tenemos que ejecutar el primer ciclo del loop fuera del loop.&lt;/div&gt;
&lt;div&gt;Pero en Ruby no.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;def temp_dir&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;i = 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;dir = File.join(Dir.tmpdir,'ginst', (i += 1).to_s)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;while(File.exists?(dir)) do&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dir = File.join(Dir.tmpdir,'ginst', (i += 1).to_s)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;end&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;FileUtils.mkdir_p(dir)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;end&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Casi sin querer, descubr&#237; la siguiente sintaxis&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Esto hace que se ejecute el c&#243;digo la primera vez y luego... &amp;nbsp;si a la condici&#243;n le apetece. Pero la primera, no te la quita nadie.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Esto me vino muy bien para hacer un generador de directorios temporales secuenciales:&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;def temp_dir(i=0)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;begin&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dir = File.join(Dir.tmpdir,'ginst', (i += 1).to_s)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;end while(File.exists?(dir))&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;FileUtils.mkdir_p(dir)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;end&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;Pero meditando un poco m&#225;s, record&#233; una obviedad que ten&#237;a olvidada, y que la primera vez que la vi me sorprendi&#243; tanto como ahora, y es el poner el while a lo que quieras. Por ejemplo, si est&#225;s deprimido, qu&#233; mejor que estas cuatro palabras&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;puts 'An&#237;mate' while true&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Y si lo est&#225;s solo un poquito.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;begin puts 'Venga tonto... &#161; An&#237;mate ! ' end while false&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Lo que me llev&#243; a intentar hacer la funci&#243;n de los directorios en una linea&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Primer intento:&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;def temp_dir(i=0)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;begin &amp;nbsp;dir = File.join(Dir.tmpdir,'ginst', (i += 1).to_s) end while (File.exists?(dir))&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;FileUtils.mkdir_p(dir)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;end&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;El problema que tenemos con esta sintaxis es que lo &#250;ltimo en ejecutarse del bloque es la condici&#243;n, por lo que no podremos obtener el valor devuelto. Ahora bien, si podemos pasar un begin..end... &amp;nbsp;&#191;Qui&#233;n nos prohibe pasar la sintaxis de toda la vida begin..begin..end..while..end .&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;def temp_dir(i=0)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;FileUtils.mkdir_p(begin begin dir = File.join(Dir.tmpdir,'ginst', (i += 1).to_s) end while File.exists?(dir) ; dir end)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;end&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;De aqu&#237;, llama la atenci&#243;n el poder estar usando bloques dentro de argumentos con la misma facilidad que a mi se me convence para ir de fiesta.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;Vale, hice una trampa. Inicializar la variable como par&#225;metro. Pero tiene soluci&#243;n:&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;def temp_dir&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;&amp;nbsp;&amp;nbsp;FileUtils.mkdir_p(begin begin dir = File.join(Dir.tmpdir,'ginst', (i ||=0 ; i+= 1).to_s) end while File.exists?(dir) ; dir end)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class="Apple-style-span" face="Courier"&gt;end&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Pese a no ser pr&#225;ctico sobre ninguno de los casos expuestos, ya que ofuscar nuestro c&#243;digo, aunque mola, no es &#250;til, me ha vuelto a llamar la atenci&#243;n, la versatilidad que puede haber en ruby.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Y como inquieto que soy... no puedo parar de preguntarme &#191;y si...? Y s&#237; funciona en ruby1.9, pero con la salvedad de que FileUtils.mkdir_p devuelve un array (creo que tambi&#233;n los conocen como arreglos de algo) en vez de una cadena o string.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Y a t&#237;... &#191; Hay alguna sintaxis de ruby que te llame especialmente la atenci&#243;n ?&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>Crear y eliminar tags remotos con git</title>
    <link href="http://cientifico.net/post/2009/04/19/crear-y-eliminar-tags-remotos-con-git" rel="alternate"/>
    <id>http://cientifico.net/post/2009/04/19/crear-y-eliminar-tags-remotos-con-git</id>
    <updated>2009-04-19T17:25:00Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>Manejar tags localmente es f&#225;cil:

&gt; git tag -l  # lista los tags locales
&gt; git tag tag_name # Crea un tag local
&gt; git tag -...</summary>
    <content type="html">
&lt;p&gt;Manejar tags localmente es f&#225;cil:&lt;/p&gt;
&lt;p&gt;&gt; git tag -l  # lista los tags locales&lt;br /&gt;
&gt; git tag tag_name # Crea un tag local&lt;br /&gt;
&gt; git tag -d tag_name # Borra el tag local&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; git tag -d `git tag -l `  # Borra todos los tags locales&lt;/p&gt;
&lt;p&gt;Pero manejar los remotos... no es tan intuitivo, as&#237; que me dejo esta&lt;br /&gt;
peque&#241;a nota:&lt;/p&gt;
&lt;p&gt;&gt; git fetch --tags  #Aunque ya lo hace por defecto&lt;br /&gt;
&gt; git ls-remote --tags origin # Lista los tags remotos&lt;/p&gt;
&lt;p&gt;Y para borrarlo, tendremos que borrar primero el local y luego hacer:&lt;/p&gt;
&lt;p&gt;&gt; git push origin :refs/tags/tag_name&lt;/p&gt;
&lt;p&gt;---Adjuntos---&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.lacoctelera.com/myfiles/cientifico/smime-3.p7s?Expires=1283724000&amp;Signature=bjeqiiTUd6Ye2QnJ9ah6zLIX1pQY4jGvXcOYRHxis3PMKgn0wUpXP3YIpjrf4mlcRfp8wpTLkIG5HZFd~aol1vxTK3t2LCSluk64N4H-JlpjUU7eyAFHkYdJcw9IV4~CPdt7A4pG4ncA8khUcDjTyL9avFKSQSFR63BhAV1-pus_&amp;Key-Pair-Id=APKAJYN3LZI5CG46B7AA&amp;Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QzZHM0b3k3ZzF3cnFxLmNsb3VkZnJvbnQubmV0L2NpZW50aWZpY28vbXlmaWxlcy9zbWltZS0zLnA3cyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI4MzcyNDAwMH19fV19"&gt;smime-3.p7s&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Variables especiales de ruby</title>
    <link href="http://cientifico.net/post/2009/02/04/variables-especiales-ruby" rel="alternate"/>
    <id>http://cientifico.net/post/2009/02/04/variables-especiales-ruby</id>
    <updated>2009-02-04T11:45:43Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>A modo de chuletario personal, dejo esta imagen con las variables especiales de ruby.

Siempre conocida y sabida, hasta que...</summary>
    <content type="html">
&lt;div&gt;A modo de chuletario personal, dejo esta imagen con las variables especiales de ruby.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Siempre conocida y sabida, hasta que requieres algunos de sus valores, es entonces cuando echas de menos este chuletario.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img class="imgcen" src="http://cientifico.net/myfiles/cientifico/Imagen-1-2.png" alt="" /&gt;&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Increible video.</title>
    <link href="http://cientifico.net/post/2009/01/31/increible-video" rel="alternate"/>
    <id>http://cientifico.net/post/2009/01/31/increible-video</id>
    <updated>2009-01-31T16:38:16Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary> </summary>
    <content type="html">
&lt;p&gt; &lt;img class="imgCen" src="http://cientifico.net/myfiles/cientifico/how-to-confuse-an-idiot-exclusive-youtube-video.jpg.jpeg" alt="" width="400" height="319" /&gt;&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Cucumber: Testeando ajax sin selenium (II)</title>
    <link href="http://cientifico.net/post/2009/01/23/cucumber-testeando-ajax-sin-selenium-ii" rel="alternate"/>
    <id>http://cientifico.net/post/2009/01/23/cucumber-testeando-ajax-sin-selenium-ii</id>
    <updated>2009-01-23T14:05:09Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>Continuando con el art&#237;culo Testeando ajax sin selenium han mejorado algunas cosillas.
La versi&#243;n anterio, ten&#237;a un probl...</summary>
    <content type="html">
&lt;p&gt;&lt;img style='border:0px' class="imgizqda" src="http://cientifico.net/myfiles/cientifico/freakyinsertions5.jpg_thumbnail.png" alt="" /&gt;Continuando con el art&#237;culo &lt;a href="http://cientifico.net/post/2009/01/23/cucumber-testeando-ajax-sin-selenium"&gt;Testeando ajax sin selenium&lt;/a&gt; han mejorado algunas cosillas.&lt;/p&gt;
&lt;p&gt;La versi&#243;n anterio, ten&#237;a un problema y es que solo serv&#237;a para visitar. &#191;Pero que pasa con el resto de steps (como I press), que implican peticiones y que esperan ajax como respuesta? Pues aqu&#237; est&#225; la soluci&#243;n.&lt;/p&gt;
&lt;pre name='code' class="ruby"&gt;When /^(.*) as an ajax request/ do |task|   When task   response.body = get_ajax_html(response.body) end &lt;/pre&gt;
&lt;p&gt;Esto dota a las features de poder realizar cualquier acci&#243;n que antes hac&#237;as y evaluar su respuesta. Por lo tanto, lo que antes era:&lt;/p&gt;
&lt;pre name='code'  class="ruby"&gt;    And I press "Guardar" &lt;/pre&gt;
&lt;p&gt;Ahora es&lt;/p&gt;
&lt;pre name='code'  class="ruby" style="border:red 5px"&gt;    And I press "Guardar" as an ajax request &lt;/pre&gt;
&lt;p&gt;Como extensi&#243;n, he visto que otras formas de page.update, usan la funci&#243;n javascript html en vez de replace with, por  lo que la funci&#243;n que obtiene el cuerpo ha sido actualizada.&lt;/p&gt;
&lt;pre  name='code'  class="ruby"&gt;def get_replace_with_body(body)   body=~/replaceWith\(\"(.*?)[^\\]\"\)/m   body=~/\)\.html\(\"(.*?)[^\\]\"\)/m unless $1   raise Exception.new('The ajax response doesn\'t containg a js replaceWith method') unless $1   "#{$1}" end &lt;/pre&gt;
&lt;p&gt;Y ahora &lt;strong&gt;ya puedo testear casi todo el js &lt;/strong&gt;sin usar selinium, configurar una m&#225;quina virtual, un xen, linux, firefox, selenium_server, etc...&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Cucumber testeando ajax sin selenium</title>
    <link href="http://cientifico.net/post/2009/01/23/cucumber-testeando-ajax-sin-selenium" rel="alternate"/>
    <id>http://cientifico.net/post/2009/01/23/cucumber-testeando-ajax-sin-selenium</id>
    <updated>2009-01-23T00:59:02Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>Como quer&#237;a terminar una cosa, y lo que necesita m&#225;s que test de vista o test de controlador era un test de integraci&#243;n, n...</summary>
    <content type="html">
&lt;p&gt;&lt;img class="imgdcha" src="http://cientifico.net/myfiles/cientifico/311155tyCX_w.jpg_thumbnail-1.png" alt=""&gt;Como quer&#237;a terminar una cosa, y lo que necesita m&#225;s que test de vista o test de controlador era un test de integraci&#243;n, no me qued&#243; otra que dotar a cucumber+webrat-selenium  (nuestro entorno de feature test&#237;n) de capacidad de ajax.&lt;/p&gt;
&lt;p&gt;Bueno, seamos serios, son un par de lineas que me permitieron hacer ejecutar la feature, y paso a comentar, ya que de tratarse de aplicaciones rails, este m&#233;todo es usable para la mayor&#237;a de page.update que realizamos.&lt;/p&gt;
&lt;p&gt;page.update actualiza un elemento del dom con nuevo contenido, para eso lanza un javascript que es interpretado por el navegador. Suponiendo que usamos jquery (tal vez cambie la implementaci&#243;n para el antiguo y obsoleto prototype), este har&#225; un replaceWith. &lt;strong&gt;Este c&#243;digo parsea el c&#243;digo devuelto por la aplicaci&#243;n y extrae la actualizaci&#243;n de la p&#225;gina.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pasemos ahora a ver el c&#243;digo:&lt;/p&gt;
&lt;pre name='code' class="ruby"&gt;# Desescapamos javascript, ya que escapado no nos sirve de mucho. # As&#237; tendremos un html v&#225;lido. Esto se resume en: #  &lt; div id="\'hola\'"&gt;\tadios\t&lt; /div&gt;  ===&gt;    adios   def unescape_javascript(javascript)  javascript.gsub!('\n' , "\n")  javascript.gsub!('\t' , "\t")  javascript.gsub!("\\'", "'")  javascript.gsub!('\"' , '"') end  # Expresi&#243;n regular encargada de sacar lo que realmente nos intersa. #  ...replaceWith(' ESTO NOS INTERESA ')... def get_replace_with_body(body)  body=~/replaceWith\(\"(.*?)[^\\]\"\)/m  raise Exception.new('The ajax response doesn\'t containg a js replaceWith method') unless $1  "#{$1}" end  # Combinado de las dos anteriores def get_ajax_html(text)  unescape_javascript(get_replace_with_body(text)) end &lt;/pre&gt;
&lt;p&gt;Y el step correspondiente.&lt;/p&gt;
&lt;pre name='code'  class="ruby"&gt;When /^I visits by ajax (.*) $/ do |path|  visits(path)  response.body = get_ajax_html(response.body) end &lt;/pre&gt;
&lt;p&gt;Y la feature&lt;/p&gt;
&lt;pre name='code' class="ruby"&gt; Scenario: Changing my name    Given I am a logged in as a Candidate    When I visits /profile/edit.js ajax    And I fill in "candidate_profile_first_name" with "Guillermooo"    And I fill in "candidate_profile_surnames" with "Alvarez"    And I press "Guardar"    Then I should see "Guillermooo Alvarez" &lt;/pre&gt;
&lt;p&gt;La soluci&#243;n es fea, torpe, poco optima. Pero creo que puede resolver la mayor&#237;a de peticiones ajax del servidor sin depender de un motor javascript externo.&lt;br /&gt;
Si alguien conoce alguna otra forma sin incorporar m&#225;s dependencias al testing... que me lo haga saber.
&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Truquitos servidor</title>
    <link href="http://cientifico.net/post/2009/01/05/truquitos-servidor" rel="alternate"/>
    <id>http://cientifico.net/post/2009/01/05/truquitos-servidor</id>
    <updated>2009-01-05T17:34:53Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>Bas&#225;ndonos en la teor&#237;a de que las m&#225;quinas est&#225;n bien configuradas en lo que respecta el correo, yo voy a tener cientifi...</summary>
    <content type="html">
&lt;p&gt;&lt;img class="imgdcha" src="http://cientifico.net/myfiles/cientifico/310.jpg.jpeg" alt="" /&gt;Bas&#225;ndonos en la teor&#237;a de que las m&#225;quinas est&#225;n bien configuradas en lo que respecta el correo, yo voy a tener cientifico.net para correos personales y yolanda.cientifico.net para los correos locales de la m&#225;quina.&lt;/p&gt;
&lt;p&gt;Esto permite que yo desde cualquier cuenta de correo envie un mensaje a guillermo @ yolanda cientifico PUNTO net.&lt;/p&gt;
&lt;p&gt;Para que sirve esto.... pues para ser m&#225;s comod&#243;n a&#250;n. Soy fiel usuario de scp (consola -&amp;gt; servidor) y webdav (escritorio&amp;lt;-&amp;gt;servidor), pero poder enviar archivos a mi cuenta del servidor y al llegar all&#237;, arrancar alpine o cualquier otro cliente de correo de consola, y poder guardarlo, es una gozada.&lt;/p&gt;
&lt;p&gt;Ah&#237; queda dicho.&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>DRB</title>
    <link href="http://cientifico.net/post/2009/01/04/drb" rel="alternate"/>
    <id>http://cientifico.net/post/2009/01/04/drb</id>
    <updated>2009-01-04T02:44:04Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>DRB o Distributed Ruby es una abstracci&#243;n de sockets tcp y serializaci&#243;n de objetos que trae integrada ruby por defecto.
...</summary>
    <content type="html">
&lt;p&gt;&lt;img class="imgdcha" src="http://cientifico.net/myfiles/cientifico/Imagen-4.png" alt=""&gt;DRB o &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/index.html"&gt;Distributed Ruby&lt;/a&gt; es una abstracci&#243;n de sockets tcp y serializaci&#243;n de objetos que trae integrada ruby por defecto.&lt;/p&gt;
&lt;p&gt;Ten&#237;a ganas de jugar con drb y su abstracci&#243;n superior sobre el patron &lt;a href="http://en.wikipedia.org/wiki/JavaSpaces"&gt;tuple spaces&lt;/a&gt; que es una forma de implementar el paradigma de memoria asociativa (&lt;a title="Content-addressable memory" href="http://en.wikipedia.org/wiki/Content-addressable_memory"&gt;associative memory&lt;/a&gt;) desda &lt;a href="http://en.wikipedia.org/wiki/Linda_(coordination_language)"&gt;linda&lt;/a&gt;, que es una forma de coordinar y comunicar diferentes procesos entre m&#225;quinas. Ya jugaremos con &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/rinda/rdoc/index.html"&gt;Rinda&lt;/a&gt;, pero como bien dice mi amigo Jack... Vayamos por partes.&lt;/p&gt;
&lt;p&gt;En este caso vamos a poner un caso real en rails para procesar emails. No es que sea necesario utilizar DRb, es que es la &#250;nica forma rentable que he encontrado. Recibimos e-mails con una frecuencia indeterminada, y los procesamos desde una tarea rake. Esto est&#225; bien salvo por que levantar una tarea rake que como dependencia tiene :environment, puede suponer bastante tiempo. Si supone 10 segundos y cada instancia supone 40 o 50 megas. 10 correos por segundo... tumbar&#237;an la m&#225;quina.&lt;/p&gt;
&lt;p&gt;Pues lejos de ir m&#225;s lejos se implementa una arquitectura cliente-servidor en el que el servidor es la tarea rake y el cliente es lo que se conecta con el &lt;a href="http://www.google.es/url?sa=t&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fes.wikipedia.org%2Fwiki%2FAgente_de_Transporte_de_Correo&amp;amp;ei=yfmpSKG9MYnA0wTzkJG3Dw&amp;amp;usg=AFQjCNHJIyPyXY0JSfjxH_I1xNjcqQFjcw&amp;amp;sig2=9HyJs0P7hKH3PQXmRm1yCA"&gt;MTA&lt;/a&gt;(Mail Transfer Agent) del sistema. Al grano:&lt;/p&gt;
&lt;p&gt;El cliente, solo necesita esto&lt;/p&gt;
&lt;pre name='code' class="ruby"&gt;#!/usr/bin/env ruby  require 'drb'  URI="druby://localhost:9999"   server = DRbObject.new_with_uri URI  return server.process($stdin.read.to_s)  &lt;/pre&gt;
&lt;p&gt;Mientras que el servidor se arreglar&#237;a con esto&lt;/p&gt;
&lt;pre name='code' class="ruby"&gt;    desc 'Start Mail Daemon'    task :daemon =&amp;gt; :environment do      require 'drb'      URI="druby://localhost:9999"      class Processor        def process(mail)          ModeloActiveRecordParaMails.create(TMail.new(mail))        end      end       DRb.start_service URI, Processor.new      DRb.thread.join    end &lt;/pre&gt;
&lt;p&gt;Con esto estar&#237;a ya  todo el trabajo hecho.&lt;/p&gt;
&lt;p&gt;Creo que el c&#243;digo es bastante auto-explicativo. Si hay alguna duda... A los comentarios.
&lt;/p&gt;
    </content>
  </entry>
  <entry>
    <title>Diferencia entre extend e include (extend vs include)</title>
    <link href="http://cientifico.net/post/2008/12/30/diferencia-entre-extend-e-include-extend-vs-include" rel="alternate"/>
    <id>http://cientifico.net/post/2008/12/30/diferencia-entre-extend-e-include-extend-vs-include</id>
    <updated>2008-12-30T12:45:36Z</updated>
    <author>
      <name>cientifico.net</name>
    </author>
    <summary>La diferencia entre extend e include puede ser confusa a veces, por eso voy a intentar aclarar, como creo yo que es. Pero pri...</summary>
    <content type="html">
&lt;p&gt;La diferencia entre &lt;em&gt;extend&lt;/em&gt; e &lt;em&gt;include&lt;/em&gt; puede ser confusa a veces, por eso voy a intentar aclarar, como creo yo que es. Pero primero echemos un vistazo al rdoc&lt;/p&gt;
&lt;h3&gt;Obj.extend Mod.include&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://cientifico.net/myfiles/cientifico/Imagen-3.png" alt="" class="imgcen" /&gt;&lt;br /&gt;
&lt;img src="http://cientifico.net/myfiles/cientifico/Imagen-2.png" alt="" class="imgcen" /&gt;&lt;br /&gt;
&lt;img src="http://cientifico.net/myfiles/cientifico/Imagen-1.png" alt="" class="imgcen" /&gt;&lt;/p&gt;
&lt;h3&gt;A jugar...&lt;/h3&gt;
&lt;p&gt; Vamos a poner este c&#243;digo de ejemplo:&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt; module A   def a     puts "Has llamado a A#a"   end end  module B   def b     puts "Has llamado a B#b"   end end  class C   include A   extend B end &lt;/pre&gt;
&lt;p&gt;La diferencia es que &lt;strong&gt;los m&#233;todos del m&#243;dulo A son para la instancia y los m&#233;todos del m&#243;dulo B son para la clase&lt;/strong&gt; por lo que ser&#237;a lo mismo que hacer:&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt; class D   include A   class &lt;&lt; self     include B   end end &lt;/pre&gt;
&lt;p&gt;Esta t&#233;cnica es muy usada en frameworks como merb. Cuando un objeto es incluido, se llama a:&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;   include InstanceMethods   extend ClassMethods &lt;/pre&gt;
&lt;p&gt;Este es uno de los usos m&#225;s t&#237;picos que he visto de include vs extend&lt;/p&gt;
&lt;p&gt;Otras diferencias que me vienen a la mente son:&lt;/P&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;extend&lt;/em&gt; es un m&#233;todo p&#250;blico, mientras que &lt;em&gt;include&lt;/em&gt; no.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si se llama a una a &lt;em&gt;extend&lt;/em&gt; de una instancia, es lo mismo que si la abrieses e incluyeses el m&#243;dulo.&lt;/p&gt;
&lt;/li&gt;
&lt;pre name="code" class="ruby"&gt; o = Object.new o.extend A class &lt;&lt; o   include B end  o.a #=&gt; Has llamado a A#a o.b #=&gt; Has llamado a B#b &lt;/pre&gt;
&lt;/ol&gt;
&lt;p&gt;Y hasta donde yo se... no tiene mucho m&#225;s misterio&lt;/p&gt;
&lt;/p&gt;&lt;/&lt;&gt;    </content>
  </entry>
</feed>
