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!

miércoles, 1 de abril de 2009

Productos Cruzados en SQL

Los productos cruzados de conjuntos son muy útiles para hacer combinaciones de ellos principalmente, aquí tendremos un ejemplo para una forma de tabulación.

Supongamos que tenemos los datos de un alumno y queremos desplegar sus datos de forma que nos pueda ayudar a visualizarlos mejor, para eso nos gustaría saber cuanto es el total de sus parciales pero también el porcentaje del total de cada parcial. Imaginemos los siguientes datos:


Alumno, Parcial, Total, Porcentaje

Si quisieramos sacar estos datos, una forma de hacerlo es por medio de "producto cruzado" en tablas para eso podemos hacer un conteo de los parciales, hacer producto cruzado con los datos de los parciales y por último hacer una proyección más para hacer el cálculo del porcentaje.


   1 SELECT * FROM alumnos;


 id | nombre | parcial
======================
  1 | Balam  |    6
  2 | Balam  |    8
  3 | Balam  |    9
  4 | Balam  |    4
  5 | Balam  |    7
  6 | Balam  |    1

   1 SELECT *
   2 FROM alumnos,
   3 (
   4   SELECT
   5     SUM(parcial) AS CONTADOR
   6   FROM alumnos
   7 ) TOTAL;


 id | nombre | parcial | contador
=================================
  1 | Balam  |    6    |    35
  2 | Balam  |    8    |    35
  3 | Balam  |    9    |    35
  4 | Balam  |    4    |    35
  5 | Balam  |    7    |    35
  6 | Balam  |    1    |    35

   1 SELECT
   2   *,
   3   parcial/TOTAL.CONTADOR
   4 FROM alumnos,
   5 (
   6   SELECT
   7     SUM(parcial) AS CONTADOR
   8   FROM alumnos
   9 ) TOTAL;


 id | nombre | parcial | contador | porcentaje
==============================================
  1 | Balam  |    6    |    35    |    0.17
  2 | Balam  |    8    |    35    |    0.23
  3 | Balam  |    9    |    35    |    0.26
  4 | Balam  |    4    |    35    |    0.11
  5 | Balam  |    7    |    35    |    0.2
  6 | Balam  |    1    |    35    |    0.03

martes, 31 de marzo de 2009

Concatenación de cadenas en SQL

Concatenar cadenas en SQL no es algo estandar así que depende mucho del manejador de base de datos que estemos usando y aquí tenemos ejemplos con tres de ellos:

Con oracle existen dos formas, una es con la funcion "CONCAT" y otra con el operador "||", con la funcion "CONCAT" no podemos concatenar mas de dos cadenas, es decir, acepta dos argumentos, en cambio con el operador "||" podemos concatenar mas (si somos estrictos el operador "||" tampoco concatena mas de dos por ser un operador binario pero por la sintaxis se puede aparentar hacerlo):


   1 CONCAT('hola','mundo')                 => 'holamundo'
   2 CONTACT(CONCAT('hola','mundo'),'hola') => 'holamundohola'
   3 CONCAT('hola',CONCAT('hola','mundo'))  => 'holaholamundo'
   4 'hola' || 'mundo'                      => 'holamundo'
   5 'hola' || 'mundo' || 'hola'            => 'holamundohola'

En el caso de mysql, existe también esta función solo que si acepta mas de dos cadenas (parámetros):


   1 CONCAT('hola','mundo')                => 'holamundo'
   2 CONCAT('hola','mundo','hola')         => 'holamundohola'
   3 CONCAT('hola','mundo','hola','mundo') => 'holamundoholamundo'

Y el caso de sqlserver o access, ellos tienen el operador "+" y de la misma forma que el operador "||" de oracle, es binario pero aparenta "recibir" mas de dos parámetros:


   1 'hola' + 'mundo'          => 'holamundo'
   2 'hola' + 'mundo' + 'hola' => 'holamundohola'

lunes, 23 de marzo de 2009

Adobe Air en Gentoo (y verdaderos Linux)

El archivo de instalación de Air para Linux que distribuye Adobe en su página (http://get.adobe.com/es/air/) solo funciona para distribuciones de Linux basadas en rpm y debian. Así que para distribuciónes como Gentoo el instalador no funciona.

Los pasos para instalar Adobe Air que segui son estos:

  1. Descargar de http://www.adobe.com/products/air/tools/sdk/ el archivo comprimido (en el momento que lo descarge la url era http://airdownload.adobe.com/air/lin/download/latest/AdobeAIRSDK.tbz2).
  2. Crear un directorio -por ejemplo- "adobe-air-sdk".
  3. Descomprimir el archivo del SDK descargado dentro del directorio "adobe-air-sdk".

También recomiendo agregar a la variable PATH los archivos ejecutables que se encuentran dentro del directorio "adobe-air-sdk/bin" (es decir "adl" y "adt") por practicidad.

Para ejecutar aplicaciones para Air:

  1. Crear un directorio -por ejemplo- "adobe-air-apps".
  2. En este directorio -recomiendo- descargar todas las aplicaciones y descomprimirlas.
  3. Y utilizar el ejecutable "adl" (para mayores detalles ver la documentación de este ejecutable).

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.