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.

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!

sábado, 27 de septiembre de 2008

Agregar automáticamente salto de línea en Emacs

Para agregar de manera automática un salto de línea en cualquier buffer al momento de guardar a un archivo en Emacs basta con agregar la siguiente línea:

1 (setq require-final-newline t)

Nótese que se pasa como parámetro a la funcion una t, lo cual podríamos ver para fines prácticos como un true, recordemos que el lenguaje es Lisp y dado que utiliza listas, podríamos decir que "algo" está o no en una lista, asi que podríamos ver como un valor false a nil (lo cual significa Not In List).

Es decir, si lo queremos deshabilitar estaría asi:

1 (setq require-final-newline nil)


Digg!

lunes, 15 de septiembre de 2008

Error en NewGem con RubyGems 1.1.1: Undefined method `add_development_dependency'

Para empaquetar proyectos en gem's de ruby, una vez que ejecutaba rake, arroja lo siguiente:

neoriddle@neobalam ~/proyectos/amatohtli $ rake
(in /home/neoriddle/proyectos/amatohtli)
rake aborted!
undefined method `add_development_dependency' for #
/home/neoriddle/proyectos/amatohtli/Rakefile:2
(See full trace by running task with --trace)
neoriddle@neobalam ~/proyectos/amatohtli $


El error se soluciona con actualizar la version de rubygems a la versión 1.2.0.

En mi caso muy particular yo tenia a versión 1.1.1:

neobalam amatohtli # emerge -vp =dev-ruby/rubygems-1.2.0

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild U ] dev-ruby/rubygems-1.2.0 [1.1.1] USE="doc server" 242 kB

Total: 1 package (1 upgrade), Size of downloads: 242 kB
neobalam amatohtli #


Una vez hecho esto ya no arrojaró errores.


Digg!

domingo, 14 de septiembre de 2008

Problemas con caracteres al enviar un formulario HTML

Muchas ocaciones tenemos el problema donde el enviar una forma de html los caracteres cambiar por caracteres raros o simplemente no son los que esperabamos.

Esto es principalmente porque al momento que se hace la encapsulación de la petición se toma un charset (conjunto de caracteres) que no corresponde al que necesitamos para que estos caracteres sean válidos.

La solución es simple, basta con especificar el charset en el atributo accept-charset del tag form de html:

1 <form method="post" accept-charset="CHARSET" />

Para mayor información sobre charset's consulte la sección 6.9 y para detalles del tag form la sección 17.3 de la especificación de html 4.01.


Digg!

sábado, 13 de septiembre de 2008

Carga de archivos en un tag <FORM> con Java (Apache FileUpload)

La carga de archivos requiere -según la especificacion de HTML 4.0-
básicamente dice que para poder enviar un archivo hay que poner el valor
multipart/form-data al atributo enctype del tag
form, de la siguiente manera:


1 <form method="post" action="miaccion" enctype="multipart/form-data">

Esto es con respecto a el archivo HTML (o JSP, o algún tipo similar), pero
ahora falta la programación del lado del servidor. Por suerte existe Apache
Commons FileUpload, el cual implementa la solución dejandonos solo unas
clases para obtener los archivos.

Como ejemplo, imaginemos que tenemos el siguiente archiv jsp:

1 <form method="post" action="MiServlet" enctype="multipart/form-data">
2   <input name="cancion" type="file" value="~/jaguares_-_45_-_alquimista.mp3" />
3   <input name="grupo" type="text" value="Jaguares" />
4   <input name="submit" type="submit" value="Enviar" />
5 </form>


Entonces en nuestra clase MiServlet podríamos hacer lo siguiente:

1 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
2 import org.apache.commons.fileupload.servlet.ServletFileUpload;
3 import org.apache.commons.fileupload.FileItem;
4
5 public class MiServlet extends HttpServlet {
6   public void doPost(HttpServletRequest req, HttpServletResponse resp) {
7     DiskFileItemFactory factory = new DiskFileItemFactory();
8     ServletFileUpload upload = new ServletFileUpload(factory);
9     List params = upload.parseRequest(request);
10     Map paramsMap = new HashMap();
11     for(FileItem param : params) {
12       // paramsMap["grupo","Jaguares"];
13       paramsMap.put(param.getFieldName(),param.getString());
14     }
15   }
16 }


Una vez ya en este punto, tenemos los siguientes métodos en la interfaz FileItem:


  • getInputStream()

  • getName()

  • getOutputStream()

  • getSize()

  • write(java.io.File file)

  • getContentType()



Cuando algunos de los parámetros es un archivo el método getContentType es diferente de null por lo es importante señalar que los parámetros como típicamente se obtienen aquí no tiene efecto, es decir:

   1 public class MiServlet extends HttpServlet {
   2   public void doPost(HttpServletRequest req, HttpServletResponse resp) {
   3     req.getParameter("cancion"); // null
   4     req.getParameter("grupo"); // null
   5     req.getParameterNames(); // Enumeration vacio
   6   }
   7 }



Digg!

jueves, 17 de julio de 2008

Problema 'xcb_xlib_unlock' al actualizar JVM

Después de cada actualización a la JVM es posible que cuando se quiere ejecutar algo en Java nos arroje algún error similar, en este reproduciré el error al ejecutar un archivo jar (el cual es el un diagramador de modelos entidad-relación):


neoriddle@neobalam ~/dbwrench_1.4.7 $ java -jar DbWrenchAll.jar
java: xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
Abortado
neoriddle@neobalam ~/dbwrench_1.4.7 $


Y esto se corrige deshabilitando el XCB Xlib de la siguiente manera, basta con ejecutar la línea correspondiente (con los suficientes privilegios) dependiendo de la versión de la JVM.


  • Para Java 5:
    sed -i 's/XINERAMA/FAKEEXTN/g' /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/jre/lib/i386/xawt/libmawt.so


  • Para Java 6:
    sed -i 's/XINERAMA/FAKEEXTN/g' /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/i386/xawt/libmawt.so

Según he visto en varios foros, el problema se puede reproducir con muchas aplicaciones escritas o ejecutables en Java.

Como referencias aqui tienen las siguientes ligas:



Digg!

martes, 24 de junio de 2008

Registro de Nick en IRC

Muchos de los canales de IRC, solicitan que los nicknames (o apodos) sean registrados, unos servidores (como por ejemplo Freenode) lo requieren para entrar a algún canal y otros simplemente para mandar mensajes privados a los integrantes del canal.

Aquí escribo los pasos básicos para realizar este proceso:

  • Una vez dentro del servidor hay que elegir el apodo (de hecho para entrar al servidor se debió haber elegido un nick) pero si se quiere cambiar se puede hacer con el siguiente comando: /nick nuevo_nombre.
  • Después si el apodo ha sido elegido lo notificará en tal caso pide autentificarse (lo cual se explica mas adelante), en caso de que el apodo este libre hay que registrar la contraseña y un correo electrónico relacionados con el apodo, esto se hace con el siguiente comando: /msg nickserv register <password>, o /msg nickserv register <password> <email> (es importante escribir un correo electrónico válido porque ahí se enviará una confirmación de registro que hay que realizar forzosamente).
  • Una vez realizado el paso anterior es posible que se mande un correo electrónico para confirmar el registro, en tal caso ahí se envían unas instrucciones para enviar el código de verificación del registro.
  • Y por ultimo lo que queda es iniciar sesión con este apodo (nombre de usuario) y con su contraseña registrada, con el siguiente comando /msg nickserv identify password.
Por ejemplo imaginemos que mi apodo es 'usuarioirc', la contraseña es 'claveirc' y el correo eletrónico al registrar es 'micorreo@miservidor.com', el registro sería de la siguiente manera:


/nick usuarioirc
/msg nickserv register claveirc micorreo@miservidor.com
...
/msg nickserv identify claveirc


Digg!

domingo, 15 de junio de 2008

Mas sobre JSTL

Bueno,hoy quiero compartir algo de lo que aprendí haciendo mi proyecto con JSP y JSTL.

Intente hacer todo el proyecto usando las librerías estándar que ofrece JSTL 1.1, evitando el uso de java tradicional.

Mientras iba avanzado en el proyecto me di cuenta de que no se puede reemplazar uno por el otro; aunque JSTL engloba las funciones principales JSP tiene más ventaja para nosotros los que no estamos familiarizados con la web.

Un ejemplo de ello en mi sistema fue cuando generé una lista de captura de calificaciones de asignaturas (mostrando las calificaciones de acuerdo al grado y/o al plan de estudios y nombrando los SELECT de las calificaciones con el nombre de la asignatura), pero en la página donde recibí el valor no pude referenciar la variable de ningun modo por que en ${param.atributo} atributo no es un string y eso me genera un grave problema a la hora de iterar.
En cambio si hubiera usado algo del lenguaje java pude haber creado un arreglo de String con los nombres de las materias de dicho grado y/o plan de estudios e insertar los valores con request.getParam(arreglo[posicion]); .

Con esto no digo que JSTL no sirva ni mucho menos, es mucho más fácil usar DBCP con JSTL, solo indicando el dataSource como atributo de la etiqueta
en lugar de crear objetos Context,DataSource... en fin, aprendí que combinando estas dos cosas podemos hacer cosas muy hermosas y funcionales:D.

Quizá muchos de ustedes ya sepan eso, pero yo tuve que aprenderlo del modo difícil y quiero que el próximo que este en una situacion similar lo piense dos veces antes de hacer a un lado el buen lenguaje java.


Digg!

sábado, 14 de junio de 2008

Avira Antivir License File

Seguramente los usuarios del programa de Antivirus Avira AntiVir a la hora de hacer la actualización de la definición de virus, les ha pedido este programa un archivo de licencia.

Sucede que si vamos a la página oficial del programa, deberíamos encontrar una forma rápida para descargar este archivo, pero bajo el esquema espacial del sitio en estos momentos, simplemente no se encuentra en la sección de soporte, descargas, ni ninguna.

Resulta que existe una liga a este archivo en la sección Support, después a FAQ y finalmente en la primera pregunta del FAQ se encuentra la liga a este archivo, por si las dudas aquí pondré una liga a el:

Debido a que los administradores de ese sitio pueden cambiar la url hacia este archivo (y obviamente yo no tengo control sobre eso) es posible que la liga se rompa, en ese caso por favor envienme un mensaje informando este caso y aún mejor la nueva ruta para que se actualize.

Digg!

lunes, 9 de junio de 2008

Railscasts

A todos los programadores de Rails muy seguramente les servirá esta página, se llama Railscasts, la cual tiene pequeñas "recetas de cocina" sobre el trabajo con Rails. Y para los que están cansados de que cuando le preguntan a alguien los manda a Google, aquí a parte de dar soluciones tienen un video como demostración para ver la implementación paso a paso. Vale la pena tenerlo entre los favoritos y hasta tener el feed suscrito.

Digg!

domingo, 1 de junio de 2008

Error al generar controlador con Login_Generator en Rails 2.0

Tratando de implementar un sistema de seguridad por logeo en una aplicacion en Rails 2.0, uno de los pasos señala que hay que generar un controlador con la siguiente instrucción:

ruby script/generate login <controlador&rt;

En mi caso lo hice así:

$ ruby script/generate login Security
    create lib/login_system.rb
    create app/controllers/security_controller.rb
    create test/functional/security_controller_test.rb
    create app/helpers/security_helper.rb
    create app/models/user.rb
    create test/unit/user_test.rb
    create test/fixtures/users.yml
No such file or directory - /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml
$


Revisando un poco el directorio para comprobar si realmente ese archivo no existia me di cuenta que si existe, pero con otro nombre:

$ ls -l /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/
total 40
-rw-r--r-- 1 root root 2464 may 13 23:47 controller.rb
-rw-r--r-- 1 root root 1256 may 13 23:47 functional_test.rb
-rw-r--r-- 1 root root 46 may 13 23:47 helper.rb
-rw-r--r-- 1 root root 495 may 13 23:47 layout.html.erb
-rw-r--r-- 1 root root 1152 may 13 23:47 style.css
-rw-r--r-- 1 root root 463 may 13 23:47 view_edit.html.erb
-rw-r--r-- 1 root root 697 may 13 23:47 view_index.html.erb
-rw-r--r-- 1 root root 411 may 13 23:47 view_new.html.erb
-rw-r--r-- 1 root root 285 may 13 23:47 view_show.html.erb
$


Y como podemos ver si existe pero con la convención de nombres de la versión de Rails 2.0 (la cual es .html.erb) y no con la versión 1.2 (la cual es .rhtml).

Así que solo basta con hacer una copia del archivo con el nombre de la versión 2.0 a uno con el nombre de la versión 1.2:

$ cp layout.html.erb layout.rhtml

De esta manera ya existirá:

$ ls -l /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/
total 40
-rw-r--r-- 1 root root 2464 may 13 23:47 controller.rb
-rw-r--r-- 1 root root 1256 may 13 23:47 functional_test.rb
-rw-r--r-- 1 root root 46 may 13 23:47 helper.rb
-rw-r--r-- 1 root root 495 may 13 23:47 layout.html.erb
-rw-r--r-- 1 root root 495 jun 1 15:38 layout.rhtml
-rw-r--r-- 1 root root 1152 may 13 23:47 style.css
-rw-r--r-- 1 root root 463 may 13 23:47 view_edit.html.erb
-rw-r--r-- 1 root root 697 may 13 23:47 view_index.html.erb
-rw-r--r-- 1 root root 411 may 13 23:47 view_new.html.erb
-rw-r--r-- 1 root root 285 may 13 23:47 view_show.html.erb
$


Y con esto ya podremos seguir con la creacion del controlador (en mi caso aquí esta el ejemplo):

$ ruby script/generate login Security
identical lib/login_system.rb
identical app/controllers/security_controller.rb
identical test/functional/security_controller_test.rb
identical app/helpers/security_helper.rb
identical app/models/user.rb
identical test/unit/user_test.rb
identical test/fixtures/users.yml
overwrite app/views/layouts/scaffold.rhtml? (enter "h" for help) [Ynaqdh]
Y - yes, overwrite
n - no, do not overwrite
a - all, overwrite this and all others
q - quit, abort
d - diff, show the differences between the old and the new
h - help, show this help
overwrite app/views/layouts/scaffold.rhtml? (enter "h" for help) [Ynaqdh] Y
    force app/views/layouts/scaffold.rhtml
    identical public/stylesheets/scaffold.css
    create app/views/security
    create app/views/security/welcome.rhtml
    create app/views/security/login.rhtml
    create app/views/security/logout.rhtml
    create app/views/security/signup.rhtml
    create README_LOGIN
$


Digg!

domingo, 25 de mayo de 2008

SD/SDIO/MMC/MS/MSPro funcionando en linux

Para usar el dispositivo para SD/MMCMS/MSPro, basicamente en el kernel hay que tener habilitadas algunas opciones:

Code maturity level options --->
  [*] Prompt for development and/or incomplete code/drivers
Device Drivers --->
  MMC/SD Card support -->
    <*> MMC support
    [ ] MMC debugging
    <*> MMC block device driver
    <*> Secure Digital Host Controller Interface support (EXPERIMENTAL)
    < > Winbond W83L51xD SD/MMC Card Interface support
File systems --->
  <*> DOS FAT fs support
  DOS/FAT/NT Filesystems -->
    <*> MSDOS fs support
    < > UMSDOS: Unix-like file system on top of standard MSDOS fs
    <*> VFAT (Windows-95) fs support


En mi caso tengo un dispositivo de la marca Ricoh:

# lspci | grep -i mmc
03:01.1 SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 19)


Asi que solo lo recompilamos y usamos ese kernel y listo.

Digg!

sábado, 24 de mayo de 2008

Kopete tarda en iniciar

He encontrado que Kopete suele tardar en iniciar mucho tiempo debido a que la carga de los plugins que a su vez éste carga son pesados. En mi caso tuve la desafortunada experiencia durante casi mas de 4 meses donde Kopete tardaba en iniciar 5 minutos al principio y esto se extendió hasta casi 25 minutos, obviamente eso no es normal ni deseable, así que encontré que el archivo donde guarda la configuración de usuario ~/.kde/share/config/kopeterc, y ahí hay una linea que activa el plugin (muchas veces ya instalado, esto dependiendo del administrador de paquetes de dicha distribución), esta línea es:

kopete_statisticsEnabled=true

por lo que hay que cambiar su valor a false en caso de que no se pueda desactivar por la interfaz gráfica, de tal modo dicha linea cambiaría a:

kopete_statisticsEnabled=false

De este modo ya no carga las estadísticas que guarda por cada contacto y ya no hay retardo.

Aquí dejo el vínculo hacia el foro donde escribí un post sobre este problema (Gentoo Forums).

Digg!