<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jesús Navarrete &#187; Tips &amp; Tricks</title>
	<atom:link href="http://www.jenaiz.com/category/tips-tricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jenaiz.com</link>
	<description>jenaiz.com</description>
	<lastBuildDate>Thu, 14 Jan 2010 12:00:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Instanciar clase desde String en Ruby</title>
		<link>http://www.jenaiz.com/2008/11/26/instanciar-clase-desde-string-en-ruby/</link>
		<comments>http://www.jenaiz.com/2008/11/26/instanciar-clase-desde-string-en-ruby/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 10:13:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[instanciar]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=84</guid>
		<description><![CDATA[Investigando un poco el comportamiento de acts_as_scribe, me surgió la necesidad de instanciar un clase conociendo el nombre de la misma. Algo que en java conocía como se realizaba:
Object o = Class.forName("className").newInstance()
lo curioso es que vi que no necesitaba esta solución, que mi problema era otro  , sin embargo la curiosidad pudo más que [...]]]></description>
			<content:encoded><![CDATA[<p>Investigando un poco el comportamiento de <a href="http://github.com/linkingpaths/acts_as_scribe/tree/master">acts_as_scribe</a>, me surgió la necesidad de instanciar un clase conociendo el nombre de la misma. Algo que en java conocía como se realizaba:</p>
<pre name="code" class="java">Object o = Class.forName("className").newInstance()</pre>
<p>lo curioso es que vi que no necesitaba esta solución, que mi problema era otro <img src='http://www.jenaiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , sin embargo la curiosidad pudo más que la necesidad.</p>
<p>Esperaba utilizar para ello la misma clase: <a href="http://www.ruby-doc.org/core/classes/Class.html">Class</a>, sin embargo descubrí que no podía hacerlo así. En Ruby el camino es distinto. Un post en <a href="http://stackoverflow.com/questions/157480/dynamically-instantiate-a-ruby-class-similar-to-java">stackoverflow</a> me llevó a encontrar una solución múltiple, aquí las distintas posibilidades:</p>
<pre name="code" class="ruby">Object::const_get('String').new()

class_name = 'String'
eval(class_name).new

Module.const_get('Array').new</pre>
<p>Y un helper:</p>
<pre name="code" class="ruby">"String".constantize.new</pre>
<p><strong>Module.const_get</strong> no funciona con clases anidadas en módulos, digamos que no admite la sintaxis Admin::Folder, debido a que sólo reconoce sintaxis válidas para dar nombre a una constante.</p>
<p><strong>eval</strong>, por el contrario sí permite nombres de clases con namespaces, aunque sufrimos un decrimento en el rendimiento.</p>
<p>Podríamos comprobar el rendimiento de todas ellas con un simple script:</p>
<pre name="code" class="ruby">#class_instanciation.rb
#!/usr/bin/env ruby
#
#  Created by  on 2008-11-24.

require 'benchmark'
require 'qualified_const_get'

n = 1000000

Benchmark.bmbm(10) do |rpt|
rpt.report("simple") do
n.times {Array.new}
end

rpt.report("Object::const_get") do
n.times {Object::const_get('Array').new()}
end

rpt.report("Kernel.const_get") do
n.times {Kernel.const_get('Array').new}
end

rpt.report("Kernel.qualified_const_get") do
n.times {Kernel.qualified_const_get('Array').new}
end

rpt.report("eval") do
n.times {eval('Array').new}
end

# no funciona!!
#rpt.report("eval") do
#  n.times {"String".constantize.new}
#end
end</pre>
<pre name="code" class="ruby">#qualified_const_get.rb
module Kernel
def qualified_const_get(str)
path = str.to_s.split('::')
from_root = path[0].empty?
if from_root
from_root = []
path = path[1..-1]
else
start_ns = ((Class === self)||(Module === self)) ? self : self.class
from_root = start_ns.to_s.split('::')
end
until from_root.empty?
begin
return (from_root+path).inject(Object) { |ns,name| ns.const_get(name) }
rescue NameError
from_root.delete_at(-1)
end
end
path.inject(Object) { |ns,name| ns.const_get(name) }
end
end</pre>
<p>Los resultados obtenidos los podéis ver en la siguiente gráfica:</p>
<p><img src="http://farm4.static.flickr.com/3218/3061040154_93fb9041dd.jpg" alt="" /></p>
<p>en ella podemos apreciar que si utilizamos <strong>const_get</strong> se tarda aproximadamente 2 veces más que con la creación normal; que el uso de <strong>eval</strong> nos hace emplear 5 veces más tiempo y que sin duda la implementación de <strong>qualified_const_get</strong> no es nada buena, dado que nos hace emplear unos 10sg! osea unas 15 veces más.</p>
<p>La recomendación sería utilizar <strong>const_get</strong> siempre que se pueda, es decir mientras nuestra clase no tenga namespaces y <strong>eval</strong> cuando no quede más remedio. El caso de <strong>qualified_const_get</strong>, me parece poco apropiado para cualquier caso.</p>
<p>Por otro lado, el caso de <strong>constantize</strong>, no terminó de funcionar, por lo que es imposible compararlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/11/26/instanciar-clase-desde-string-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nube de tags</title>
		<link>http://www.jenaiz.com/2008/09/15/nube-de-tags/</link>
		<comments>http://www.jenaiz.com/2008/09/15/nube-de-tags/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 08:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[tags]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=74</guid>
		<description><![CDATA[El otro día cuando hablábamos de poder taggear modelos, os puse el ejemplo de las nubes de tags que vemos en innumerables ocasiones, sin embargo sólo avanzamos hasta disponer de un modelo tageable.
Ahora os voy a mostrar cómo se podría construir la nube de tags partiendo de lo que hicimos.
Lo primero, es que nuestra aplicación [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día cuando hablábamos de poder taggear modelos, os puse el ejemplo de las nubes de tags que vemos en innumerables ocasiones, sin embargo sólo avanzamos hasta disponer de un modelo tageable.</p>
<p>Ahora os voy a mostrar cómo se podría construir la nube de tags partiendo de lo que <a href="http://www.jenaiz.com/index.php?/archives/144-Como-anadir-tags-a-nuestros-modelos.html#comments">hicimos</a>.</p>
<p>Lo primero, es que nuestra aplicación necesita utilizar un método llamado tag_cloud, que es el que se va a encargar de pintar la nube de tags, para ello hacemos que nuestro AplicationHelper incluya el helper que contiene el método:</p>
<pre name="code" class="ruby">module ApplicationHelper
  include TagsHelper
end</pre>
<p>Nos basta con añadir esto al helper del controlador concreto, pero dada la implementación del plugin creo que querréis crear más nubes de tags para otros modelos, por lo que he preferido tener disponible estos métodos para toda la aplicación.</p>
<p>Ahora Necesitamos cargar en nuestro controlador lo que va a ser mostrado en la vista:</p>
<pre name="code" class="ruby">@tags = Entry.tag_counts</pre>
<p>Y por último nos vamos a la vista y añadimos la nube de tags:</p>
<pre name="code" class="ruby">&lt;% tag_cloud @tags, %w(css1 css2 css3 css4 css5) do |tag, css_class| %&gt;
    &lt;%= link_to tag.name, { :action =&gt; :tag, :id =&gt; tag.name }, :class =&gt; css_class %&gt;
  &lt;% end %&gt;</pre>
<p>para que esta pueda tener el efecto adecuado, necestitáis definir los siguiente estilos en la vista:</p>
<pre name="code" class="css">.css1 { font-size: 1.0em; }
.css2 { font-size: 1.4em; }
.css3 { font-size: 1.6em; }
.css4 { font-size: 1.8em; }
.css5 { font-size: 2em; }</pre>
<p>estos deberíais adaptarlos en tamaño según vuestro diseño, ¿sencillo verdad?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/09/15/nube-de-tags/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo añadir tags a nuestros modelos</title>
		<link>http://www.jenaiz.com/2008/09/13/ca%c2%b3mo-aa%c2%b1adir-tags-a-nuestros-modelos/</link>
		<comments>http://www.jenaiz.com/2008/09/13/ca%c2%b3mo-aa%c2%b1adir-tags-a-nuestros-modelos/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 15:45:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[tags]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=73</guid>
		<description><![CDATA[Estoy seguro que más de una vez habéis visto nubes de tags en variedad de sitios webs, a la vez que las habéis utilizado, pues bien, existe un plugin en rails que puede haceros las delicias, para poder tagear cualquier modelo con el que estéis trabajando.
La historia de este plugin, es que David Heinemeier Hansson [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy seguro que más de una vez habéis visto nubes de tags en variedad de sitios webs, a la vez que las habéis utilizado, pues bien, existe un plugin en rails que puede haceros las delicias, para poder tagear cualquier modelo con el que estéis trabajando.</p>
<p>La historia de este plugin, es que <a href="www.loudthinking.com/ ">David Heinemeier Hansson</a> creó un plugin para poder poner tags a sus modelos, llamado: <a href="http://wiki.rubyonrails.org/rails/pages/Acts+As+Taggable+Plugin">acts_as_taggable,</a> sin embargo alguien decidió hacerle unos añadidos para convertirlo en más actual, haciendo que el nuevo plugin tuviese:</p>
<blockquote><p>[...] extras such as tests, smarter tag assignment, and tag cloud calculations.</p></blockquote>
<p>Este nuevo plugin recibió el nombre de <a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids">acts_as_taggable_on_steroids</a> y es obra de Jonathan Viney.</p>
<p>Para instalarlo, nuestro primer paso debe ser:</p>
<blockquote><p>script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids</p></blockquote>
<p>Tras esto, debemos generar una migración para poder crear la tablas en las que se guardaran los datos:</p>
<blockquote><p>script/generate acts_as_taggable_migration</p></blockquote>
<p>Esto nos genera:</p>
<blockquote><p>004_acts_as_taggable_migration.rb</p></blockquote>
<p>el número no tiene porqué coincidir con el vuestro; aplicamos la migración:</p>
<blockquote><p>rake db:migrate</p></blockquote>
<p>Y ahora ya sólo nos queda hacer que nuestro controlador sea <em>tageable</em>:</p>
<pre name="code" class="ruby">class Entry &lt; ActiveRecord::Base
  acts_as_taggable
end</pre>
<p>Para añadir tags en el formulario de edición o en el de creación de nuestro modelo concreto, en nuestro caso: entries/new.html.erb y entries/edit.html.erb, basta con la siguiente línea de código:</p>
<pre name="code" class="ruby">&lt;%= f.text_field :tag_list %&gt;</pre>
<p>así nuestras entradas utilizarán tags y se guardarán.</p>
<p>Nuestro modelo cuenta con una serie de métodos para jugar con tags. Uno que debéis esperar, al ver como he llamado al <em>text_field</em> de los tags, es sin duda:</p>
<pre name="code" class="ruby">entry.tag_list = "ruby, rails"
entry.save</pre>
<p>Con él añadimos los tags a entry, tras grabarlo.</p>
<p>Podemos añadir a una lista ya existente:</p>
<pre name="code" class="ruby">entry.tag_list.add("languages", "article")</pre>
<p>borrar una etiqueta concreta:</p>
<pre name="code" class="ruby">entry.tag_list.remove("ruby")</pre>
<p>Podemos encontrar las entradas taggeadas con unas determinadas tags:</p>
<pre name="code" class="ruby">Entry.find_tagged_with('ruby, rails')</pre>
<p>Esto nos traera objetos que contenga cualquiera de las dos tags, si queremos que contengan las dos o más, tenemos que usar match_all.</p>
<pre name="code" class="ruby">Entry.find_tagged_with('ruby, rails', :match_all =&gt; true)</pre>
<p>Por defecto el delimitador es una coma, si deseamos cambiarlo, también tenemos esa opción:</p>
<pre name="code" class="ruby">TagList.delimiter = " "</pre>
<p>añadido al config/environment.rb, quedaría cambiado el delimitador.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/09/13/ca%c2%b3mo-aa%c2%b1adir-tags-a-nuestros-modelos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Envio de mails utilizando Google Apps</title>
		<link>http://www.jenaiz.com/2008/08/25/envio-de-mails-utilizando-google-apps/</link>
		<comments>http://www.jenaiz.com/2008/08/25/envio-de-mails-utilizando-google-apps/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 08:21:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mails]]></category>
		<category><![CDATA[ror]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=72</guid>
		<description><![CDATA[Tras haber instalado el plugin que nos posibilitaba tener comentarios e incluso protegerlos debidamente; una utilidad bastante interesante es que se nos avise cuando alguien publique un comentario. Así podemos estar informados de lo que ocurra.
En mi caso quería utilizar mi dominio particular que utiliza Google Apps para ello. Recordé haber leido antes acerca de [...]]]></description>
			<content:encoded><![CDATA[<p>Tras haber instalado el plugin que nos posibilitaba tener <a href="http://www.jenaiz.com/index.php?/archives/142-Instalacion-del-plugin-acts_as_commentable.html">comentarios</a> e incluso <a href="http://www.jenaiz.com/index.php?/archives/146-Instalacion-de-recaptcha.html">protegerlos debidamente</a>; una utilidad bastante interesante es que se nos avise cuando alguien publique un comentario. Así podemos estar informados de lo que ocurra.</p>
<p>En mi caso quería utilizar mi dominio particular que utiliza <a href="http://www.google.com/a/help/intl/es/index.html">Google Apps</a> para ello. Recordé haber leido antes acerca de cómo hacerlo con gmail, en el blog de <a href="http://www.jaimeiniesta.com/2008/07/16/envio-de-correos-a-traves-de-gmail-con-rails/">Jaime Iniesta</a> utilizando: <a href="http://code.openrain.com/rails/action_mailer_tls/">action_mailer_tls</a>.</p>
<p>El problema al utilizar <a href="http://www.google.com/a/help/intl/es/index.html">Google Apps</a>, al igual que si utilizásemos <a href="http://www.gmail.com.com">Gmail</a> es que utiliza el protocolo TLS, por eso no podemos utilizar el mailer normal de Rails, de ahí que tengamos que instalar este plugin.</p>
<p>Así que seguimos el consejo de Jaime e instalamos el plugin:</p>
<blockquote><p>script/plugin install http://code.openrain.com/rails/action_mailer_tls/</p></blockquote>
<p>Siguiendo con lo que dice en su blog:</p>
<blockquote><p>Una vez instalado, en la carpeta /vendor/plugins/action_mailer_tls/sample encontrarás dos ficheros. Copia smtp_gmail.rb dentro de tu carpeta /config/initializers, y copia mailer.yml.sample a tu carpeta /config, renombrándolo a mailer.yml. Finalmente, edita este fichero para usar el user_name y password de la cuenta de correo de Gmail que quieras usarâ€¦ reinicia el servidor yâ€¦ ya puedes enviar correos a través de Gmail desde tu aplicación!</p></blockquote>
<p>El fichero config/mailer.yml  que en nuestro caso hemos creado es de la forma:</p>
<blockquote><p>:address: smtp.gmail.com<br />
:port: 587<br />
:user_name: youraccount@yourdomain.com<br />
:password: xxxx<br />
:authentication: :plain</p></blockquote>
<p>en esto debes sustituir <em>xxxx</em> por la password de tu cuenta y <em>youraccount@yourdomain.com</em> por tu cuenta de correo asociada a Google Apps.</p>
<p>Continuamos creando el mailer para poder enviar los mails:</p>
<blockquote><p>weemac:blogg jenaiz$ script/generate mailer commentmailer<br />
exists  app/models/<br />
create  app/views/commentmailer<br />
exists  test/unit/<br />
create  test/fixtures/commentmailer<br />
create  app/models/commentmailer.rb<br />
create  test/unit/commentmailer_test.rb</p></blockquote>
<p>Debemos crear el método con el que vamos a hacer el envio del mail que situamos en el Mailer recién creado:</p>
<pre name="code" class="ruby">class Commentmailer &lt; ActionMailer::Base
  def comment(comment)
    @recipients   = 'jesus.navarrete@gmail.com'
    @from         = 'support@jenaiz.com'
    headers         "Reply-to" =&gt; "support@jenaiz.com"
    @subject      = "jenaiz.com ha recibido un comentario"
    @sent_on      = Time.now
    @content_type = "text/html"

    body[:name] = comment.author
    body[:text] = comment.body
  end
end</pre>
<p>Ahora, necesitamos crear los templates, dado que hemos especificado como content_type text/html, crearemos dos templates en views/commentmailer: comment.text.plain.erb y comment.text.html.erb</p>
<pre name="code" class="ruby"><strong>comment.text.html.erb</strong>
jenaiz.com ha recibido un comentario de: <em>&lt;%= @name %&gt;</em>.

Diciendo:
&lt;%= @text %&gt;

Producido en la entrada: &lt;%= @entry%&gt;
<blockquote>

<strong>comment.text.plain.erb</strong>
jenaiz.com ha recibido un comentario de: &lt;%= @name %&gt;.

Diciendo:
&lt;%= @text %&gt;

Producido en la entrada: &lt;%= @entry%&gt;</blockquote>
</pre>
<p>Ahora hacemos la llamada al método del mailer, basta con:</p>
<pre name="code" class="ruby">Commentmailer.deliver_comment(comment)</pre>
<p>en nuestro caso esto se meterá dentro del código del comentario normal:</p>
<pre name="code" class="ruby"> def comment

    if verify_recaptcha
      @entry = Entry.find(params[:id])
      comment = Comment.new(params[:comment])
      @entry.add_comment comment
      comment.save!

      Commentmailer.deliver_comment(comment)
      flash[:notice] = "Comentario añadido con éxito"
    else
      flash[:error] = "There was an error with the recaptcha code below. Please re-enter the code and click submit."
    end
    redirect_to :action =&gt; 'show'
  end</pre>
<p>Desde ahora podremos recibir correos cada vez que un comentario sea publicado en nuestra web, además de tener disponible esta posibilidad para otras acciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/08/25/envio-de-mails-utilizando-google-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrations: problemas con dos versiones iguales</title>
		<link>http://www.jenaiz.com/2008/08/22/migrations-problemas-con-dos-versiones-iguales/</link>
		<comments>http://www.jenaiz.com/2008/08/22/migrations-problemas-con-dos-versiones-iguales/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 08:55:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[migrations]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=77</guid>
		<description><![CDATA[Tras la vuelta de vacaciones, estaba haciendo unas cosas en el servidor e intentaba hacer una migración a una versión determinada en un entorno, staging:
[jenaiz@barracuda current]$ rake db:migrate VERSION=3 RAILS_ENV=staging
(in /home/jenaiz/app/proyecto/releases/20080821085746)
rake aborted!
Multiple migrations have the version number 4
Lo que nos trasmite el error es que tenemos dos migrations con la misma versión, osea que dentro [...]]]></description>
			<content:encoded><![CDATA[<p>Tras la vuelta de vacaciones, estaba haciendo unas cosas en el servidor e intentaba hacer una migración a una versión determinada en un entorno, staging:</p>
<blockquote><p>[jenaiz@barracuda current]$ rake db:migrate VERSION=3 RAILS_ENV=staging<br />
(in /home/jenaiz/app/proyecto/releases/20080821085746)<br />
rake aborted!<br />
Multiple migrations have the version number 4</p></blockquote>
<p>Lo que nos trasmite el error es que tenemos dos <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">migrations</a> con la misma versión, osea que dentro de la carpeta db/migrate poseemos dos ficheros cuya versión es igual, sirva como ejemplo mi caso:</p>
<blockquote><p>004_add_column_visible_to_tag.rb<br />
004_add_column_for_children_to_tag.rb</p></blockquote>
<p>¿Extraño? Pues la verdad es que en mi caso ha sido porque había borrado un fichero del svn y no había actualizado bien, luego había creado otro con el mismo número de versión y distinto nombre, por lo que al desplegar en el servidor, he encontrado el problema.</p>
<p>Esta situación, no es extraña que se produzca, podría darse si varios desarrolladores crean una <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">migration</a> de forma simultánea y luego envían sus cambios al svn, si no tienen cuidado con el número de su versión, podrían coincidir; lo más probable en estos casos es que el nombre del fichero no coincida de forma exacta, pero sí la versión, por lo que al hacer update al svn o cvs no veríamos nada extraño.</p>
<p>Un caso similar lo plantea <a href="http://blog.the-mitchells.org/archives/2005/12/18/rails-migrations-and-multiple-developers/">Scott Mitchell</a> y un comentario le devuelve el error que habéis visto arriba. No sé porqué, pero en cuando he llegado a la parte de los dos desarrolladores, rápidamente he ido a comprobar lo que había en mi repositorio, para comprobar que el fichero que había borrado en un paso anterior se había borrado, pero no, seguía allí&#8230; colleja para mi <img src='http://www.jenaiz.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Para solventar el problema, <a href="http://blog.stochasticbytes.com/">Christopher J. Bottaro</a> ha creado un plugin que corrige esto: <a href="http://github.com/cjbottaro/migration_izzle/tree/master">migration_izzle</a>. Como el bien explica mantiene un histórico en la base de datos de los scripts ejecutados, os remito a la documentación para que le echéis un vistazo, yo por mi parte no voy a tardar en probarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/08/22/migrations-problemas-con-dos-versiones-iguales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación de recaptcha</title>
		<link>http://www.jenaiz.com/2008/07/31/instalacion-de-recaptcha/</link>
		<comments>http://www.jenaiz.com/2008/07/31/instalacion-de-recaptcha/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 07:47:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[recaptcha]]></category>
		<category><![CDATA[ror]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=75</guid>
		<description><![CDATA[Si el otro día hablábamos de crear comentarios gracias al plugin acts_as_commentable, creo que convendréis conmigo en que nos dejamos una cosita en el tintero, ¿qué pasa con la seguridad? Existen infinidad de robots en internet que si ven un formulario y pueden utilizarlo, no dudarán en hacerlo. Por lo que nuestro sistema de comentarios [...]]]></description>
			<content:encoded><![CDATA[<p>Si el otro día hablábamos de crear comentarios gracias al plugin <a href="http://agilewebdevelopment.com/plugins/acts_as_commentable">acts_as_commentable</a>, creo que convendréis conmigo en que nos dejamos una cosita en el tintero, ¿qué pasa con la seguridad? Existen infinidad de robots en internet que si ven un formulario y pueden utilizarlo, no dudarán en hacerlo. Por lo que nuestro sistema de comentarios está inconcluso: debemos protegerlo. Y que mejor manera que añadir <a href="http://recaptcha.net/ ">Recaptcha</a> para validar el envio de un comentario.</p>
<p>Paso uno e indispensable, instalación del <a href="http://ambethia.com/recaptcha">plugin</a>:</p>
<blockquote><p>script/plugin install http://svn.ambethia.com/pub/rails/plugins/recaptcha</p></blockquote>
<p>Si queréis, podéis utilizar la última versión del plugin, que está alojada ahora en <a href="http://www.github.com">github</a>, por lo que si no habéis experimentado con <a href="http://es.wikipedia.org/wiki/Git">git</a> aún, os lo recomiendo como experiencia para empezar a utiliar <a href="http://es.wikipedia.org/wiki/Git">git</a>.</p>
<p>Por si os interesa lo anterior, el plugin ahora se encuentra en: <a href="http://github.com/ambethia/recaptcha">http://github.com/ambethia/recaptcha</a>.</p>
<p>Lo primero que os recomiendo es que vayáis a <a href="http://recaptcha.net/ ">Recaptcha</a> y obtengáis vuestras llaves, pública y privada, que hacen falta para poder utilizar el plugin; en mi caso ya las estaba utilizando en este blog. No os las pego por seguridad y porque no os servirían, dado que están asociadas a la url en cuestión.</p>
<p>Una vez las tenéis, deben ser añadidas a environment.rb de la forma:</p>
<pre name="code" class="ruby">ENV['RECAPTCHA_PUBLIC_KEY'] = 'tullavepublica'
ENV['RECAPTCHA_PRIVATE_KEY'] = 'tullaveprivada'</pre>
<p>En la vista, para mostrarlo, sólo tendríamos que añadir:</p>
<pre name="code" class="ruby">&lt;%= recaptcha_tags %&gt;</pre>
<p>en caso de estar utilizando ssl, deberéis cambiarlo a:</p>
<pre name="code" class="ruby">&lt;%= recaptcha_tags :ssl =&gt; true %&gt;</pre>
<p>Y ahora en nuestro método de publicación, debéis comprobar la validez del <a href="http://recaptcha.net/ ">Recaptcha</a>, de la forma:</p>
<pre name="code" class="ruby">if verify_recaptcha
      ...
      else
      flash[:error] = "Ha habido un error en el envio."
      render :action =&gt; 'show'
    end</pre>
<p>Nosotros lo utilizamos para publicar comentarios, por lo que el método en cuestión queda como sigue:</p>
<pre name="code" class="ruby">if verify_recaptcha
      @entry = Entry.find(params[:id])
      comment = Comment.new(params[:comment])
      @entry.add_comment comment
      comment.save!
      flash[:notice] = "Comentario añadido con éxito"
    else
      flash[:error] = "Ha habido un error en el envio del comentario."
    end
    redirect_to :action =&gt; 'show'</pre>
<p>Pues nada, listo, ya tenéis validación con <a href="http://recaptcha.net/ ">Recaptcha</a> en vuestros comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/07/31/instalacion-de-recaptcha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación del plugin: acts_as_commentable</title>
		<link>http://www.jenaiz.com/2008/07/28/instalacion-del-plugin-acts_as_commentable/</link>
		<comments>http://www.jenaiz.com/2008/07/28/instalacion-del-plugin-acts_as_commentable/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 23:02:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[acts_as_commentable]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ror]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=71</guid>
		<description><![CDATA[Este fin de semana he retomado mi idea de crear una herramienta para blogs, pero tenía la intención de hacer uso de la mayor cantidad posible de plugins que pudiese, para así poder experimentar con ellos. Cualquier blog que guste de hacer uso del feedback y de las opiniones de la gente, cuenta con un [...]]]></description>
			<content:encoded><![CDATA[<p>Este fin de semana he retomado mi idea de crear una herramienta para blogs, pero tenía la intención de hacer uso de la mayor cantidad posible de plugins que pudiese, para así poder experimentar con ellos. Cualquier blog que guste de hacer uso del feedback y de las opiniones de la gente, cuenta con un sistema que permite <strong>comentar</strong> las entradas que se hacen en el mismo. Pues bien, para hacer esto, podríamos crearnos el modelo que lo contendría, establecer la relación, validar las entradas, etc. Sin embargo existe un plugin, <a href="http://agilewebdevelopment.com/plugins/acts_as_commentable">acts_as_commentable</a>, que podría simplificarnos esta labor.</p>
<p>Para poder comentar nuestras entradas, vamos a generar un scaffold llamado <em>Entry</em>:</p>
<pre name="code" class="ruby">script/generate scaffold Entry title:string body:text create_at:datetime draft:boolean</pre>
<p>Empezamos por instalar el plugin:</p>
<pre name="code" class="ruby">script/plugin install http://juixe.com/svn/acts_as_commentable</pre>
<p>Necesitamos crear una migración para contener la tabla de comentarios, dado que el plugin no la crea por nosotros:</p>
<pre name="code" class="ruby">script/generate migration create_comments</pre>
<p>Esto nos genera un fichero en db/migrate cuyo nombre es <em>XXX_create_comments.rb</em>; XXX es un número, que dependerá de nuestro contenido en el directorio anterior, en mi caso es <em>002_create_comments.rb</em>, el contenido que debemos copiar en dicho fichero es:</p>
<pre name="code" class="ruby">class CreateComments &lt; ActiveRecord::Migration
  def self.up
    create_table :comments, :force =&gt; true do |t|
      t.column :author, :string, :limit =&gt; 50, :default =&gt; ""
      t.column :email, :string, :limit =&gt; 100, :default =&gt; ""
      t.column :website, :string, :limit =&gt; 100, :default =&gt; ""
      t.column :body, :text, :default =&gt; ""
      t.column :created_at, :datetime, :null =&gt; false
      t.column :commentable_id, :integer, :default =&gt; 0, :null =&gt; false
      t.column :commentable_type, :string, :limit =&gt; 15, :default =&gt; "", :null =&gt; false
      t.column :user_id, :integer, :default =&gt; 0, :null =&gt; false
    end

    add_index :comments, ["user_id"], :name =&gt; "fk_comments_user"
  end

  def self.down
    drop_table :comments
  end
end</pre>
<p>ejecutamos el proceso de migración, para poder empezar a usar la tabla:</p>
<pre name="code" class="ruby">rake db:migrate</pre>
<p>Para que nuestro modelo <em>Entry</em> empieze a ser comentable, necesitamos añadirle lo siguiente:</p>
<pre name="code" class="ruby">class Entry &lt; ActiveRecord::Base
  acts_as_commentable
end</pre>
<p>A partir de este momento, tenemos todo listo. Aunque ahora necesitamos utilizarlo, para ello, primero cambiamos la vista de las entradas para que puedan ser comentadas cuando las estemos viendo. Así que modificamos el fichero <em>entries/show.html.erb</em>, y añadimos:</p>
<pre name="code" class="ruby">&lt;%= render :partial =&gt; 'comment', <img src='http://www.jenaiz.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> bject =&gt; @entries %&gt;</pre>
<p>Creamos el fichero _comment.html.erb:</p>
<pre name="code" class="ruby">Comments
&lt;% if @entry.comments.count != 0%&gt;
    &lt;% for comment in @entry.comments %&gt;
    &lt;%= comment.author%&gt; said &lt;%= distance_of_time_in_words(Time.now,comment.created_at) %&gt;.
    	&lt;%= comment.body %&gt;
    &lt;% end %&gt;
&lt;% end %&gt;

&lt;%= form_tag :action =&gt; "comment", :id =&gt; @entry do %&gt;
  &lt;%= text_field 'comment', 'author'  %&gt; name (required)
 	&lt;%= text_field 'comment', 'email'  %&gt; email ( will not be shown ) (required)
 	&lt;%= text_field 'comment', 'website'  %&gt; website
	&lt;%= text_area "comment", "body" %&gt;
	&lt;%= submit_tag "Comment!" %&gt;
&lt;%= end_tag %&gt;
(falta añadir los saltos de línea correspondientes)</pre>
<p><em>comment</em>:</p>
<pre name="code" class="ruby"> def comment
      @entry = Entry.find(params[:id])
      comment = Comment.new(params[:comment])
      @entry.add_comment comment
      comment.save!

      Commentmailer.deliver_comment(comment)
      flash[:notice] = "Comentario añadido con éxito"
      redirect_to :action =&gt; 'show'
  end</pre>
<p>La creación del comentario es recogiendo los parámetros del formulario, aunque la parte importante es cómo manejar los comentarios, cómo añadírselo a una entrada:</p>
<pre name="code" class="ruby">@entry.add_comment comment</pre>
<p>Si os habéis fijado, la tabla añade una columna <em>user_id</em>, de esta forma tenemos asociados los comentarios a los usuarios. De tal forma que podremos hacer búsquedas como:</p>
<pre name="code" class="ruby">comments = Comment.find_comments_by_user(user)</pre>
<p>De tal forma que obtendríamos todos los comentarios para un usuario dado. O podríamos obtener los comentarios de un usuario para las entradas:</p>
<pre name="code" class="ruby">postComments = Entry.find_comments_by_user(user)</pre>
<p>Por si os entra la vena investidadora, os diré que en la tabla hay un par de columnas &#8220;mágicas&#8221; que crean la relación con los distintos modelos que quisieramos comentar:</p>
<blockquote><p>commentable_id &gt;&gt; almacena el identificador de lo que comentemos<br />
commentable_type &gt;&gt; almacena el tipo de lo que comentemos, en nuestro caso Entry</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/07/28/instalacion-del-plugin-acts_as_commentable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVNMate: Plugin de svn para TexMate</title>
		<link>http://www.jenaiz.com/2008/07/24/svnmate-plugin-de-svn-para-texmate/</link>
		<comments>http://www.jenaiz.com/2008/07/24/svnmate-plugin-de-svn-para-texmate/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 08:53:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[svnmate]]></category>
		<category><![CDATA[textmate]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=70</guid>
		<description><![CDATA[Trabajar en TextMate y no saber que archivos has modificado a la hora de hacer un commit, la verdad es que es un poco engorroso, porque ¿cómo sabes cúando hacer un commit? ¿cuáles son los archivos modificados? Siempre tenderás aer a hacer un commit de la carpeta padre más elevada que puedas o olvidarás algo.
En [...]]]></description>
			<content:encoded><![CDATA[<p>Trabajar en TextMate y no saber que archivos has modificado a la hora de hacer un commit, la verdad es que es un poco engorroso, porque ¿cómo sabes cúando hacer un commit? ¿cuáles son los archivos modificados? Siempre tenderás aer a hacer un commit de la carpeta padre más elevada que puedas o olvidarás algo.</p>
<p>En otros entornos de desarrollo esto se soluciona gráficamente, añadiendo un icono pequeño a cada archivo de tal forma que podemos saber el estado que tiene. Para TextMate existe una solución: <a href="http://ciaranwal.sh/files/SVNMate.tmplugin.zip">SVNmate</a>.</p>
<p>La instalación es bastante sencilla, el zip contiene un archivo llamado <strong>SVNMate.tmplugin</strong> que con doble click, se añadirá directamente a TextMate. Podéis corroborarlo entrando en las <em>Preferences</em>, allí podréis visualizar un menú similar a:</p>
<p><img class="size-full wp-image-136 aligncenter" title="svnmate" src="http://farm4.static.flickr.com/3464/3774584633_5b7110f5b6.jpg" alt="svnmate" width="576" height="302" /></p>
<p>Ahora necesitáis reiniciar y todos vuestros archivos adquirirán el icono del estado con respecto al svn.</p>
<p>Existe una pequeña pega: si modificas un archivo, el directorio inmediatamente superior queda como <em>modificado</em> por lo cual sabes que dentro existen cambios para hacer commit, pero por encima de esto ningún otro directorio muestra modificaciones. Un pantallazo de mi entorno de desarrollo os lo aclarará mejor:</p>
<p><img class="aligncenter size-full wp-image-137" title="directorios" src="http://farm4.static.flickr.com/3563/3775389700_f3c426baf8.jpg" alt="directorios" width="240" height="107" /></p>
<p>Esto hace que mientras trabajas con los directorios desplegados sabes más o menos como estás, pero que si los tienes comprimidos, realmente tienes parte del problema por el cual instalé el plugin.</p>
<p>¿Alguno sabéis si esto es configurable? ¿Habéis utilizado otro plugin?</p>
<p><strong>Update:</strong> Para hacer commits, updates, add file, etc. directamente seleccionamos un fichero y luego pulsamos a la vez: <strong>ctrl + shift + a</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/07/24/svnmate-plugin-de-svn-para-texmate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugear en Rails con ruby-debug</title>
		<link>http://www.jenaiz.com/2008/07/22/debugear-en-rails-con-ruby-debug/</link>
		<comments>http://www.jenaiz.com/2008/07/22/debugear-en-rails-con-ruby-debug/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 09:09:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=26</guid>
		<description><![CDATA[Investigando podemos descubrir diferentes formas para debugear en RoR, para el caso he elegido hacerlo con  ruby-debug, no sólo por su utilidad sino por la extensa lista de recomendaciones que existen en la red. Kent Sibilev, es el creador de esta gema, que desde el principio nacía con una importante mejora de rendimiento sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Investigando podemos descubrir diferentes formas para debugear en RoR, para el caso he elegido hacerlo con  <a href="http://rubyforge.org/projects/ruby-debug/">ruby-debug</a>, no sólo por su utilidad sino por la extensa lista de recomendaciones que existen en la red. <a href="http://www.datanoise.com">Kent Sibilev</a>, es el creador de esta gema, que desde el principio nacía con una importante mejora de rendimiento sobre el tradicional <em>rdebug</em>, esto es posible dado que utiliza una extensión nativa haciendo uso directo de la API Ruby en C, en lugar de usar la API <em>Kernel#set_trace_func</em>.</p>
<p>Algunas de las funcionalidades aportadas son:</p>
<ul>
<li> avanzar y retroceder en nuestro código mientras debugeamos.</li>
<li> ejecutar o saltar líneas de codigo</li>
<li> listar el contexto actual en el que estamos detenidos</li>
<li> realizar cambios en caliente sobre el código y poder recargar</li>
<li> usar el modo <em>irb</em>, además de tener un modo consola propio más potente que el anterior</li>
</ul>
<p>Para comenzar a utilizarlo, basta con tenerlo instalado, para ello:</p>
<blockquote><p>sudo gem install ruby-debug</p></blockquote>
<p>He observado que en algunos lugares, te recomiendan estar atento a la instalación, para seleccionar la plataforma sobre la que se va a instalar: Linux/Mac o Windows. Aquí tengo que decir que en mi caso, sobre Mac OS X, no tuve que elegir plataforma, dado que fue seleccionada de forma automática.</p>
<p>Para empezar a hacer uso del plugin, debemos configurar algunas cosas; la primera de ellas es añadir una línea a nuestro <strong>environment.rb</strong>:</p>
<blockquote><p>SCRIPT_LINES__ = {} if ENV['RAILS_ENV'] == &#8216;development&#8217;</p></blockquote>
<p>Con esto debemos de ser cautelosos. <em>SCRIPT_LINES__</em> almacena todos los ficheros ruby leidos en un hash para poder decir luego en qué línea de código estamos. Esto sin duda puede causar problemas de rendimiento y algunos de consumo de memoria, de ahí que hayamos puesto que sólo se use en desarrollo. Debemos tener mucho cuidado para que no activemos el debug en entornos de producción.</p>
<p>Una vez, tenemos esto, bastaría con situarnos en nuestro código y añadir lo siguiente para poder empezar a debugear allí mismo:</p>
<blockquote><p><strong>require &#8216;ruby-debug&#8217;</strong><br />
&#8230;<br />
def your_method<br />
&#8230;<br />
<strong>debugger if ENV['RAILS_ENV'] == &#8216;development&#8217;</strong><br />
&#8230;<br />
end</p></blockquote>
<p>El debug se parará justo en <em>debugger</em>.</p>
<p>Ahora arrancamos el servidor web el cual se detendrá en nuestro <em>breakpoint</em> y estaremos en modo consola en el mismo terminal en el que el servidor estaba trabajando, como decíamos es una consola más potente que <em>IRB</em>, algunos la comparan a <a href="http://sourceware.org/gdb/">GDB</a>, el debugger de <a href="http://www.gnu.org">GNU</a> para C.</p>
<p>En este momento, ya podemos interacturar, bastaría con conocer los comandos y podríamos debugear. Una lista de los más indispensables:</p>
<p><strong>list</strong>: te muestra unas líneas de código y te dice donde estás detenido.</p>
<p><strong>irb</strong>: pasas a la consola de <em>IRB</em>, puedes interactuar con los objetos, obtener valores, etc. Por ejemplo para ver el valor de una propiedad:</p>
<blockquote><p>@users.name</p></blockquote>
<p><strong>exit</strong>: salir del IRB</p>
<p><strong>PP (pretty print)</strong>: para ver el contenido de forma bonita, por ejemplo un formulario:</p>
<blockquote><p>pp params[:user][:email]<br />
o<br />
pp params</p></blockquote>
<p><strong>cont</strong>: continúa la ejecución</p>
<p><strong>next</strong>: avanza a la siguiente línea de código</p>
<p><strong>method</strong>: para listar los métodos de un objeto:</p>
<blockquote><p>method instance @user</p></blockquote>
<p>o si queremos listar los métodos de una clase:</p>
<blockquote><p>method User</p></blockquote>
<p><strong>break</strong>: para ir a un sitio dado y saltar todo lo demás:</p>
<blockquote><p>break Entry#create</p></blockquote>
<p>para ir al método <em>create</em> de <em>Entry</em></p>
<p><strong>set autoreload</strong>: recarga el código para aceptar los cambios</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/07/22/debugear-en-rails-con-ruby-debug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Actualizar JDK 1.6 en Mac OS X</title>
		<link>http://www.jenaiz.com/2008/07/16/actualizar-jdk-16-en-mac-os-x/</link>
		<comments>http://www.jenaiz.com/2008/07/16/actualizar-jdk-16-en-mac-os-x/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 08:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[1.6]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[macosx]]></category>

		<guid isPermaLink="false">http://192.168.1.100/~jenaiz/wordpress/?p=69</guid>
		<description><![CDATA[Hasta ahora he trabajado con la versión por defecto instalada en el OS X del JDK de java la 1.5; esta se ha ido actualizando automáticamente. Sin embargo ahora quería hacer algunas pruebas con VisualVM y resulta que necesitaba una versión más moderna del JDK, la 6.0 mínimo, así que he decidido ver como funciona [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta ahora he trabajado con la versión por defecto instalada en el OS X del JDK de java la 1.5; esta se ha ido actualizando automáticamente. Sin embargo ahora quería hacer algunas pruebas con <a href="https://visualvm.dev.java.net/relnotes.html#system_requirements">VisualVM</a> y resulta que necesitaba una versión más moderna del JDK, la 6.0 mínimo, así que he decidido ver como funciona el sistema de actualizaciones de Mac OS X.</p>
<p>Cual ha sido mi sorpresa cuando en <a href="http://support.apple.com/kb/HT1856">una de las actualizaciones del sistema</a> venía la nueva versión del JDK. Sin embargo esta release no se convierte en la release por defecto, sino que si deseas utilizarla, debes hacer los cambios por ti mismo.</p>
<p>Investigando un poco logramos la ruta física donde se instalan todas las versiones de los JDK de java descargados:</p>
<blockquote><p>/System/Library/Frameworks/JavaVM.framework/Versions</p></blockquote>
<p>Además de todas las versiones, existen tres directorios llamativos: <em>A,</em> <em>Current</em> y <em>CurrentJDK</em>; estos dos últimos directorios son <em>symbolic links</em> a la versión que interesa. Lo que significa que para cambiar de versión del JDK sólo hay que cambiarlos a ellos.</p>
<p>Si buscáis por internet encontraréis <a href="http://www.macosxhints.com/article.php?story=20060121171126988">un script bastante utilizado</a>, que nos muestra las JDKS que existen instaladas en vuestra máquina y cambia el <em>CurrentJDK</em> a la versión que queramos. Sin embargo, habría que completar este script. Ambos <em>Current</em> y <em>CurrentJDK</em> deben ser cambiados o algunos programas os dejarán de funcionar. La verdad es que por lo que he encontrado, lo único que he podido sacar en claro es que hay algunas razones por las que no cambiar <em>CurrentJDK</em>:</p>
<blockquote><p>it affects the system globally, it changes the system from how Apple shipped it (things under /System are Apple managed), and it can cause updates to fail and/or have unintended side effects.</p></blockquote>
<p>Si aún así queréis seguir adelante con el cambio podéis hacer lo siguiente.</p>
<p>Un vistazo rápido al directorio : /System/Library/Frameworks/JavaVM.framework/Versions/ os devolverá algo parecido a:</p>
<blockquote><p>weemac:Versions jenaiz$ ls -la<br />
total 56<br />
drwxr-xr-x  14 root  wheel  476 15 jul 08:59 .<br />
drwxr-xr-x  11 root  wheel  374  4 jul 08:08 ..<br />
lrwxr-xr-x   1 root  wheel    5  7 may 20:39 1.3 -&gt; 1.3.1<br />
drwxr-xr-x   3 root  wheel  102 29 sep  2007 1.3.1<br />
lrwxr-xr-x   1 root  wheel    5 21 oct  2007 1.4 -&gt; 1.4.2<br />
lrwxr-xr-x   1 root  wheel    3  7 may 20:39 1.4.1 -&gt; 1.4<br />
drwxr-xr-x   8 root  wheel  272 21 oct  2007 1.4.2<br />
lrwxr-xr-x   1 root  wheel    5 21 oct  2007 1.5 -&gt; 1.5.0<br />
drwxr-xr-x   8 root  wheel  272 21 oct  2007 1.5.0<br />
lrwxr-xr-x   1 root  wheel    5  7 may 20:39 1.6 -&gt; 1.6.0<br />
drwxr-xr-x   8 root  wheel  272  7 may 20:39 1.6.0<br />
drwxr-xr-x   8 root  wheel  272  7 may 20:40 A<br />
lrwxr-xr-x   1 root  wheel    1 15 jul 08:57 Current -&gt; A<br />
lrwxr-xr-x   1 root  wheel    3 15 jul 08:59 CurrentJDK -&gt; 1.5</p></blockquote>
<p>Como podéis ver, en estos momentos mi <em>CurrentJDK</em> está usando la 1.5 y mi <em>Current</em> apunta a <em>A.</em></p>
<p>Para hacer que el JDK 1.6 sea el actual, tendréis que hacer:</p>
<blockquote><p>ln -hfs 1.6 Current<br />
y<br />
ln -hfs 1.6 CurrentJDK</p></blockquote>
<p>Así es tal como <a href="http://darelltan.multiply.com/journal/item/515">darrell</a> lo explica, y es parecido a como el script lo hace. Todo esto hay que hacerlo como <strong>super usuario</strong>.</p>
<p>El porqué algunas aplicaciones dejan de funcionar hay que encontrarlo a que existen <a href="http://java.dzone.com/news/java-6-mac-worsest-release-eve">algunos problemas</a> en esta versión, que Apple no ha considerado en solucionar aún:</p>
<blockquote><p>- Sólo soporta 64 bits: adios a los applets en Safari.<br />
- No hay soporte para Cocoa: aplicaciones como Cyberdurk dejarán de funcionar. Esto no <em>sólo</em> significa que no podamos tener look&amp;feel de Mac OS sino que también perderemos algunas de las utilidades tales, como poder usar Growl como sistema de notificación, por ejemplo.</p></blockquote>
<p>Si el tema de cómo está organizado el directorio de versiones de Java y el porqué de esta cosas, os interesa realmente, os  dejo unos links interesantes sobre todo esto, no sólo aplicable al JDK:</p>
<p><a href="http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html">Anatomy of Framework Bundles</a><br />
<a href="http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/VersionInformation.html">Framework Versions</a><br />
<a href="http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html#//apple_ref/doc/uid/20002303">What are Frameworks?<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jenaiz.com/2008/07/16/actualizar-jdk-16-en-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
