Bienvenido(a) a Proyecto Script

Hola!!!

Este es un buen lugar donde buscar las respuestas a tus dudas sobre "Programación", "Lenguajes", "Linux", "Electrónica", etc.

Suele ser difícil buscar en la red y encontrar respuestas claras y en español a muchas preguntas sobre estos temas, así que aquí tienes un buen lugar para iniciar.

Quieres ser parte de esto, solo ¡regístrate!

sábado, 31 de enero de 2009

Error "undefined method `cache_template_loading='"

En Rails 2.2.2 (no tengo conocimiento hasta el momento de publicar esta entrada si en otra versión también ocurre este error), me di cuenta que al ejecutar mi aplicacion en modo de "producción", arrojaba el siguiente error:


1 /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `send': undefined method `cache_template_loading=' for ActionView::Base:Class (NoMethodError)
2 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `initialize_framework_settings'
3 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `each'
4 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `initialize_framework_settings'
5 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `each'
6 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `initialize_framework_settings'
7 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:154:in `process'
8 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `send'
9 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `run'
10 from /home/neoriddle/etc/rails_apps/miproyecto/config/environment.rb:13

Tomando en cuenta el volcado anterior en la ultima línea visible esta una referencia a la línea número 13 del archivo enviroment.rb, esa línea es la siguiente:


Rails::Initializer.run do |config|

Sabemos que en ejecutar esta línea se carga también el archivo de configuración específico del modo de ejecución (que podría ser "development", "test" o "production"), en mi caso al ejecutar el modo de producción, se generaba el error, de ahí que en la línea 13 del archivo de configuracion del modo produccion tiene lo siguiente:


config.action_view.cache_template_loading = true

Al parecer este método ya no existe en esta versión por lo que una solución es borrar o simplemente comentar esta línea. No estoy seguro si esta sea una solución correcta pero al menos elimina el error el cual no permite que el servicio se ejecute, es decir, el proceso se finaliza.

Error "nil.dependencies" en `rake gems`

En la versión 2.2.2 de Rails, al ejecutar rake:gems aparece el siguiente mensaje (con alguna posible variación dependiendo de las gemas principalmente):


   1 neoriddle@neobalam ~/proyectos/miproyecto $ rake gems
   2 (in /home/neoriddle/proyectos/miproyecto)
   3  - [I] calendar_date_select >= 1.13
   4   - [ ] hoe = 1.8.2
   5   - [ ] rubyforge = 1.0.2
   6   - [I] rake = 0.8.3
   7  - [I] mini_magick >= 1.2.3
   8   - [ ] hoe = 1.8.2
   9   - [ ] rubyforge = 1.0.2
  10   - [I] rake = 0.8.3
  11  - [I] RedCloth >= 4.1.1
  12 rake aborted!
  13 You have a nil object when you didn't expect it!
  14 The error occurred while evaluating nil.dependencies
  15 
  16 (See full trace by running task with --trace)
  17 neoriddle@neobalam ~/proyectos/miproyecto $

Este es un error que hay en la versión de la gema, así que para solucionarlo hay que abrir el archivo /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails/gem_dependency.rb (esta ubicación podría variar por el sistema operativo o alguna opción en la instalación) y ubicar el siguiente fragmento de código:


   1 def dependencies
   2   return [] if framework_gem?
   3   all_dependencies = specification.dependencies.map do |dependency|
   4     GemDependency.new(dependency.name, :requirement => dependency.version_requirements)
   5   end
   6   all_dependencies += all_dependencies.map(&:dependencies).flatten
   7   all_dependencies.uniq
   8 end

Basta con agregar la siguiente línea return [] if specification.nil?, de manera que quedaría de la siguiente forma:


   1 def dependencies
   2   return [] if framework_gem?
   3   return [] if specification.nil?
   4   all_dependencies = specification.dependencies.map do |dependency|
   5     GemDependency.new(dependency.name, :requirement => dependency.version_requirements)
   6   end
   7   all_dependencies += all_dependencies.map(&:dependencies).flatten
   8   all_dependencies.uniq
   9 end

Una vez editado, hay que guardar los cambios y regresemos a ejecutar de nuevo la instrucción inicial rake:gems y el resultado es el siguiente:


   1 neoriddle@neobalam ~/proyectos/miproyecto $ rake gems
   2 (in /home/neoriddle/proyectos/miproyecto)
   3  - [I] calendar_date_select >= 1.13
   4     - [ ] hoe = 1.8.2
   5     - [ ] rubyforge = 1.0.2
   6     - [I] rake = 0.8.3
   7  - [I] mini_magick >= 1.2.3
   8     - [ ] hoe = 1.8.2
   9     - [ ] rubyforge = 1.0.2
  10     - [I] rake = 0.8.3
  11  - [I] RedCloth >= 4.1.1
  12     - [ ] echoe
  13 
  14 I = Installed
  15 F = Frozen
  16 R = Framework (loaded before rails starts)
  17 neoriddle@neobalam ~/proyectos/miproyecto $

Este es un bug en esta versión de Rails.

lunes, 8 de diciembre de 2008

Tabla simulando un arbol

Seguramente se ha presentado el caso donde tiene una tabla a nivel base de datos que guarda la información de una entidad que tiene un comportamiento de árbol, peensando un ejemplo práctico tenemos una tabla de Categorias la cual esta construida por el siguiente script:

   1 CREATE TABLE categories (
   2   id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   3   nombre VARCHAR(20) NOT NULL,
   4   parent_id BIGINT NULL
   5 );


De esta manera podriamos tener lo siguiente:

  • General de División
    • General de Brigada
      • General Brigadrier


Y visto como una tabla tendrías:

id |        nombre       | parent_id
------------------------------------
 1 | General de División |   null
 2 | General de Brigada  |     1
 3 | General Brigadier   |     2


Vayamos al código...
Existe una funcion llamada "acts_as_tree" la cual nos ayuda con ese comportamiento, es importante hacer la aclaración que hasta la versión 1.x de Rails (mas específicamente en ActiveRecord) era parte de ésta, pero apartir de la versión 2.x, ésta fue seprada para convertirse en un plugin.

La instalación del plugin es muy sencilla, basta con ejecutar la siguiente linea:

script/plugin install acts_as_tree


Una vez hecho esto, podemos ir a nuestra clase model "Categoria":

   1 class Categoria < ActiveRecord::Base
   2   acts_as_tree :order => 'parent_id'
   3 end


De esta manera tenemos los isguientes metodos disponibles para aprovechar mucho mejor el comportamiento en arbol:

MétodoDescripcion
childrendevuelve todos los hijos inmediatos
parentdevuelve el padre (objeto inmediato)
siblingsdevuelve todos los hijos del mismo padre (hermanos)
self_and_siblingsdevuelve todos los hermanos incluyéndome
ancestorsdevuelve todos los objetos padre hasta llegar a la raiz (padre, abuelo, etc)
rootdevuelve el objeto raiz de la jerarquía


Digg!

viernes, 5 de diciembre de 2008

Problems compiling app-text/poppler-bindings-0.8.7

Hace algunos días trataba de compilar el paquete "app-text/poppler-bindings-0.8.7" pero me arrojaba el siguiente error en la compilación:

0001 neobalam proyectos # emerge -q1 =app-text/poppler-bindings-0.8.7
0002 >>> Verifying ebuild Manifests...
0003
0004 >>> Emerging (1 of 1) app-text/poppler-bindings-0.8.7 to /
0005 * Applying poppler-0.6-bindings.patch ... [ ok ]
0006 * Running eautoreconf in '/var/tmp/portage/app-text/poppler-bindings-0.8.7/work/poppler-0.8.7' ...
0007 ...
0008 checking for Qt headers... /usr/qt/3/include
0009 checking for Qt libraries... /usr/qt/3/lib
0010 checking if Qt needs -pthread... no
0011 checking for POPPLER_QT4... configure: error: Package requirements (QtCore >= 4.1.0 QtGui >= 4.1.0 QtXml >= 4.1.0 QtTest >= 4.1.0) were not met:
0012
0013 No package 'QtGui' found
0014
0015 Consider adjusting the PKG_CONFIG_PATH environment variable if you
0016 installed software in a non-standard prefix.
0017
0018 Alternatively, you may set the environment variables POPPLER_QT4_CFLAGS
0019 and POPPLER_QT4_LIBS to avoid the need to call pkg-config.
0020 See the pkg-config man page for more details.
0021
0022
0023 !!! Please attach the following file when seeking support:
0024 !!! /var/tmp/portage/app-text/poppler-bindings-0.8.7/work/poppler-0.8.7/config.log
0025 *
0026 * ERROR: app-text/poppler-bindings-0.8.7 failed.
0027 * Call stack:
0028 * ebuild.sh, line 49: Called src_compile
0029 * environment, line 2536: Called econf 'src_compile' 'src_compile' '--enable-cairo-output' '--enable-poppler-glib'
0030 * ebuild.sh, line 519: Called die
0031 * The specific snippet of code:
0032 * die "econf failed"
0033 * The die message:
0034 * econf failed
0035 *
0036 * If you need support, post the topmost build error, and the call stack if relevant.
0037 * A complete build log is located at '/var/tmp/portage/app-text/poppler-bindings-0.8.7/temp/build.log'.
0038 * The ebuild environment file is located at '/var/tmp/portage/app-text/poppler-bindings-0.8.7/temp/environment'.
0039 *
0040
0041 * Messages for package app-text/poppler-bindings-0.8.7:


Cabe mencionar que usaba el administrador "Portage" (para los que no sepan algo como el "apt-get", "yast", etc, a diferencia que este descara el código fuente y lo compila).

Por fin pude compilar ese paquete, basta con incluir en la compulacion qt-4 y poppler-bindings en la misma llamada de emerge-

Digg!

martes, 14 de octubre de 2008

Unexpected result mapping beans with betwixt

Dadas dos clases (beans), las intentaba mapear con betwixt, pero a la hora de hacer la generación del XML a partir de los beans, curiosamente no aparecia el XML que yo esperaba. Lo que hice fue (por razones de practicidad del momento) en un archivo definir algunas clases entre ellas los beans a manera, donde ninguno de los beans tenía el modificador public, algo como lo siguiente:

   1 public class Prueba {
   2     // Definicion de clase
   3 }
   4 
   5 class Familia implements Serializable {
   6     List personas;
   7 
   8     // setters y getters
   9 }
  10 
  11 class Persona implements Serializable {
  12     private String nombre;
  13     private String apellido;
  14     // setters y getters
  15 }


Y los beans mapeados de la siguiente forma:

Primero el archivo Persona.betwixt:

   1 <info primitiveTypes="element">
   2   <element name="persona">
   3     <attribute name="nombre" property="nombre" updater="setNombre" />
   4     <attribute name="apellido" property="apellido" updater="setApellido" />
   5   </element>
   6 </info>


Y en segundo lugar el archivo Familia.betwixt:

   1 <info primitiveTypes="element">
   2   <element name="familia">
   3     <element name="personas">
   4       <element name="personas" property="personas" updater="setPersonas" />
   5     </element>
   6   </element>
   7 </info>


El problemas radica en que todas las clases a mapear deben estar definicas con el modificador public. Así que hay que ponerlo en archivos separados.


Digg!