jueves, julio 22, 2010

Reflexión en el desarrollo de Software

Introducción

De acuerdo con la Real Academia de la Lengua Española, reflexión(1) es la "Acción y efecto de reflexionar", en tanto que reflexionar(2) es: "Considerar nueva o detenidamente algo".

Wikipedia menciona la reflexión en informática(3) como "la capacidad que tiene un programa de ordenador  para observar y opcionalmente modificar su estructura de alto nivel".
 
Definición

En mis propios términos:

La reflexión en la programación de Software es la característica de un lenguaje  que permite conocer su estructura de manera dinámica (en tiempo de ejecución).

Ejemplo:

A continuación se muestra un ejemplo que tiene la siguiente funcionalidad:

  1. Crear una clase del tipo que se proporcione en el primer parámetro.
  2. Crear un objeto a partir de la clase creada en el punto anterior.
  3. Obtener el valor de la propiedad indicada en el segundo parámetro.
  4. Modificar el valor de la propiedad que se obtuvo en el punto anterior con el valor del tercer parámetro.

Versión Java:

Antes de efectuar el ejemplo es necesario:
  1. Tener la JDK versión >= 1.5 instalada (4)
  2. Saber compilar y ejecutar clases Java (5).

El ejemplo EjemploReflexion funciona con cualquier clase. La única restricción (por sencillez en la programación) es que la propiedad a modificar sea de tipo java.lang.String.

Para simplificar aún más la prueba se proporciona también la clase Cliente.

Para ejecutar el ejemplo solo es necesario compilar ambas clases y ejecutarlas mediante el comando:

java EjemploReflexion org.josuemb.Cliente nombre Josue


En caso de que se desee ejecutar el ejemplo con otra clase, la sintaxis sería:

java EjemploReflexion NombreClase NombrePropiedad Valor

Archivo EjemploReflexion.java:

package org.josuemb;

import java.lang.reflect.Field;

/**
 * 
 * Clase que muestra un ejemplo de reflexión.
 * 
 * @author josuemb
 * 
 */
public class EjemploReflexion {

 /**
  * @param args
  */
 @SuppressWarnings("unchecked") //Evita un warning al compilar
 public static void main(String[] args) {
  try {
   if (args.length < 3) {
    System.out.println("Error en llamado\n");
    System.out.println("Sintaxis:");
    System.out
      .println("\tjava EjemploReflexion NombreClase NombrePropiedad Valor");
    System.out.println("Ejemplo:");
    System.out
      .println("\tjava EjemploReflexion org.josuemb.Cliente nombre Josue");
    System.exit(1);
   }
   System.out.println("Creando clase [" + args[0]
     + "] de manera dinamica...");
   // Crea la clase proporcionada en el primer parámetro de manera
   // dinámica.
   Class clase = Class.forName(args[0]);
   System.out.println("Creando objeto de tipo [" + clase.getName()
     + "] manera dinámica...");
   //Crea un nuevo objeto de manera dinamica
   Object objeto = clase.newInstance();
   System.out.println("Obteniendo propiedad [" + args[1]
     + "] del nuevo objeto de manera dinamica...");
   // Obtiene la propiedad proporcionada en el segundo parámetro de
   // manera dinámica.
   Field propiedad = objeto.getClass().getDeclaredField(args[1]);
   // Es necesario establecer esta propiedad para acceder a los campos
   // de la clase directamente.
   propiedad.setAccessible(true);
   // Obtiene el valor de la propiedad
   Object valor1 = propiedad.get(objeto);
   // Imprime el valor de la propiedad
   System.out.println(propiedad.getName() + "=" + valor1);
   System.out.println("Modificando valor de propiedad ["
     + propiedad.getName() + "]...");
   //Establece el nuevo valor a la propiedad
   propiedad.set(objeto, args[2]);
   // Obtiene el valor de la propiedad
   Object valor2 = propiedad.get(objeto);
   // Imprime el valor de la propiedad
   System.out.println(propiedad.getName() + "=" + valor2);
   System.exit(0);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

Archivo Cliente.java:


package org.josuemb;

public class Cliente {
 private String nombre;
 private String lugar;

 public String getNombre() {
  return nombre;
 }

 public void setNombre(String nombre) {
  this.nombre = nombre;
 }

 public String getLugar() {
  return lugar;
 }

 public void setLugar(String lugar) {
  this.lugar = lugar;
 }
}  

El resultado de la ejecución es el siguiente:

josuemb@josuemb-laptop:~/workspaces/Ejemplos/EjemploReflexion/bin$ java org.josuemb.EjemploReflexion org.josuemb.Cliente nombre Josue
Creando clase [org.josuemb.Cliente] de manera dinamica...
Creando objeto de tipo [org.josuemb.Cliente] manera dinámica...
Obteniendo propiedad [nombre] del nuevo objeto de manera dinamica...
nombre=null
Modificando valor de propiedad [nombre]...
nombre=Josue

Versión Groovy:

Antes de efectuar el ejemplo es necesario:
  1. Tener la Groovy versión >= 1.7 instalado (6)
  2. Saber compilar clases Groovy (7).
  3. Saber ejecutar scripts Groovy (8).

El ejemplo funciona con cualquier clase. La única restricción (por sencillez en la programación) es que la propiedad a modificar sea de tipo java.lang.String.

Para simplificar aún más la prueba se proporciona también la clase Cliente.

Para ejecutar el ejemplo solo es necesario compilar la clase Cliente mediante el comando:

groovyc EjemploReflexion.groovy


Y después ejecutar el Script EjemploReflexion mediante el comando:

groovy EjemploReflexion.groovy org.josuemb.Cliente nombre Josue

En caso de que se desee ejecutar el ejemplo con otra clase, la sintaxis sería:

groovy EjemploReflexion.groovy nombreClase nombrePropiedad Valor

Archivo EjemploReflexion.groovy:

if(args.size() < 3 ){
    println """Error en llamado
Sintaxis:
    groovy EjemploReflexion.groovy NombreClase NombrePropiedad Valor
Ejemplo:
    groovy EjemploReflexion.groovy org.josuemb.Cliente nombre Josue"""
    System.exit 1
}

println "Creando clase [${args[0]}] de manera dinamica..."
// Crea la clase proporcionada en el primer parámetro de manera dinámica.
def clase = args[0] as Class;

println "Creando objeto de tipo [$clase.name] de manera dinamica..."
//Crea un nuevo objeto de manera dinamica
def objeto = clase.newInstance()

println "Obteniendo propiedad [${args[1]}] del nuevo objeto de manera dinamica..."

println "${args[1]}=${objeto[args[1]]}"

//Establece el nuevo valor a la propiedad
objeto[args[1]] = args[2]

println "Modificando valor de propiedad [${args[1]}]..."

objeto[args[1]] = args[2]

println "${args[1]}=${objeto[args[1]]}"
 
Archivo Cliente.groovy:

package org.josuemb

class Cliente{
    String nombre
    String lugar
}

El resultado de la ejecución es el siguiente:

josuemb@josuemb-laptop:~$ groovy EjemploReflexion.groovy org.josuemb.Cliente nombre Josue
Creando clase [org.josuemb.Cliente] de manera dinamica...
Creando objeto de tipo [org.josuemb.Cliente] de manera dinamica...
Obteniendo propiedad [nombre] del nuevo objeto de manera dinamica...
nombre=null
Modificando valor de propiedad [nombre]...
nombre=Josue


Conclusión

La reflexión nos permite hacer cosas bastante interesantes como por ejemplo: conocer la estructura interna de una clase, sus propiedades, constructores, métodos (parámetros de los mismos), ejecutar los métodos, incluso, ¡obtener y modificar información de miembros privados de una clase! y todo esto aún si no tenemos ni el código ni la documentación de una clase.
 
Referencias
  1. Reflexión: http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=reflexion
  2. Reflexionar: http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=reflexionar
  3. Reflexión Informática: http://es.wikipedia.org/wiki/Reflexi%C3%B3n_%28inform%C3%A1tica%29
  4. Instalación de la JDK 1.6: http://java.sun.com/javase/6/webnotes/install/index.html
  5.  Compilar y ejecutar clases Java: http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/getStarted/cupojava/index.html
  6. Instalación de Groovy 1.7: http://groovy.codehaus.org/Tutorial+1+-+Getting+started
  7. Compilar clases Groovy: http://docs.codehaus.org/display/GROOVY/Compiling+Groovy
  8. Ejecutar scripts Groovy: http://groovy.codehaus.org/Running
  9. Artículo "Usando Java Reflection" (Oracle): http://java.sun.com/developer/technicalArticles/ALT/Reflection/  
  10. Artículo "Programación dinámica en Java, parte 2" (IBM): http://www.ibm.com/developerworks/library/j-dyn0603/

lunes, mayo 03, 2010

Error de Grails 1.2.2 en Ubuntu

Problema:

Al instalar grails 1.2.2 en un equipo con Linux (Ubuntu en mi caso) y ejecutar el comando:

grails

Muestra el error:

Welcome to Grails 1.2.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /home/josuemb/development/grails-1.2.2

No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode
josuemb@josuemb-laptop-quarksoft:~$ grails
//home/josuemb/development/grails-1.2.2/bin/grails: 6: [[: not found
Welcome to Grails 1.2.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /home/josuemb/development/grails-1.2.2

No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode

Información adicional:

Este es un error que ya se reportó y corrigió en grails. Solo que la corrección saldrá en la versión de grails 1.2.3. El issue de JIRA es: http://jira.codehaus.org/browse/GRAILS-6001

Solución:

Mientras sale la versión de grails 1.2.3, podemos corregir el error de la siguiente manera:

  1. Abrir el archivo: $GRAILS_HOME/bin/startGrails con tu editor favorito (en mi caso, con gedit es más que suficiente).
  2. Ir a la línea 231:
    if [[ -n $GRAILS_OPTS  ]]
  3. Modificar el contenido de esta línea:
    if [[ -n $GRAILS_OPTS  ]]
    Por lo siguiente:
    if [ -n $GRAILS_OPTS ]
  4. Ejecutar nuevamente el comando:
    grails
  5. La salida del comando ahora muestra el mensaje sin errores:

    //home/josuemb/development/grails-1.2.2/bin/grails: 6: [[: not found
    Welcome to Grails 1.2.2 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: /home/josuemb/development/grails-1.2.2

    No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode
    josuemb@josuemb-laptop-quarksoft:~$ grails
    Welcome to Grails 1.2.2 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: /home/josuemb/development/grails-1.2.2

    No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode

lunes, marzo 22, 2010

Controlar Presentación de Open Office utilizando un teléfono celular con Bluetooth

Introducción:

Este artículo describe como utilizar un teléfono celular (ó móvil en algunos países) a través del puerto bluethoot para conectarse a una pc/laptop con puerto bluetooth habilitado y Linux. El presente artículo está orientado a Linux Mint 8.0 "Helena" que es una distribución basada en Ubuntu 9.10 "Karmic Koala", sin embargo, funcionará prácticamente sin cambios en cualquier distribución basada en Debian.

Prerequisitos:
  • Equipo con Linux Mint 8 "Helena", Ubuntu 9.10 "Karmic Koala" ó cualquier otra distribución basada en Debian instalada.
  • Puerto blueetooth instalado en el equipo.
  • Teléfono celular con puerto bluetooth.
Preparando el equipo (pc/laptop/otro):
  1. Asegurarse de que esté instalado el paquete gnome-bluethoot en el equipo. La manera más simple de hacer esto es verificar que se exista un icono de bluetooth en la barra de tareas (normalmente junto al reloj) y al colocar el puntero del ratón encima de este, aparece la leyenda: "Bluetooth: Activado" .




  2. En caso de que no esté instalado/activado el paquete gnome-bluetooth, se debe ejecutar el siguiente comando:
    sudo apt-get install gnome-bluetooth
    Una vez instalado, es recomendable reiniciar la sesión en el manejador de ventanas para que se habilite (normalmente a través de la opción "cerrar sesión" del menú).
  3. Una vez que el paquete gnome-bluetooth esté instalado y configurado (ver figura en el paso 1) se puede Conectar el equipo con el teléfono.
 Conectando el equipo con el Teléfono:
  1. Activar la conectividad Bluetooth en el teléfono: Para activar la conectividad a través de Bluetooth en el teléfono: Consulta el manual de tu teléfono en la sección "Bluetooth". En el caso específico de mi teléfono (Sony Ericson) se debe seleccionar la opción "Ajustes" del menú principal y posteriormente entrar a la sección "Conectividad", después se selecciona la opción "Bluetooth". En la sección "Bluetooth" se selecciona la opción "Activar". En la mayoría de los teléfonos se muestra un icono en la parte superior que indica que está activada la conectividad Bluetooth.




  2. Habilitar el equipo para conectarse con el teléfono: Para conectar el equipo al teléfono, se debe dar click sobre el icono de Bluetooth en la barra de tareas y seleccionar la opción "Preferencias" del menú.




  3. Habilitar el equipo para conectarse con el teléfono (continuación): En la ventana de "Preferencias de Bluetooth" se debe oprimir el botón "Configurar un dispositivo nuevo".




  4. Habilitar el equipo para conectarse con el teléfono (continuación): Se lee la introducción del asistente (en donde lo más importante es que el teléfono esté a no más de 10 mts. del equipo) y se oprime el botón "Adelante".





  5. Habilitar el equipo para conectarse con el teléfono (continuación): Seleccionar el dispositivo (en mi caso es el que tiene el nombre "josuemb").




  6. Habilitar el equipo para conectarse con el teléfono (continuación): Oprimir el botón "Adelante" y anotar el PIN que debe capturarse en el dispositivo.




  7. Habilitar el equipo para conectarse con el teléfono (continuación): Aceptar la conexión en el teléfono. Para esto hace una pregunta similar a "¿Agregar del dispositivos". Se debe responder "Sí" a esta pregunta.
  8. Habilitar el equipo para conectarse con el teléfono (continuación): Introducir el código de seguridad. Se debe capturar el código de seguridad (PIN) qué se mostró el asistente para configuración de dispositivos Bluetooth (763074 en este ejemplo).
  9. Habilitar el equipo para conectarse con el teléfono (continuación): Permitir el uso como control remoto. Muestra una pregunta similar a: "Utilizar el dispositivo como control remoto ¿Permitir?. Se debe Responder "Sí a esta pregunta".
  10. Habilitar el equipo para conectarse con el teléfono (continuación): Habilitar la opción para permitir la conexión sin pedir el PIN en cada conexión. Muestra la pregunta "Permitir conexión" a la que se debe responder con la opción: "Permitir siempre".
  11. Habilitar el equipo para conectarse con el teléfono (continuación): Terminar. A la pregunta "¿Iniciar control remoto?" Responder "No".
  12. Habilitar el equipo para conectarse con el teléfono (continuación): En el equipo (laptop/pc) muestra la última pantalla del asistente en donde pregunta si se desea Acceder a Internet utilizando el teléfono. En caso de habilitar el checkbox se podrá utilizar el teléfono para conectar el equipo a internet utilizando la conexión a Internet (generalmente GPRS) del teléfono. Recomiendo habilitar esta opción. Oprimir el botón "Cerrar" con lo que terminará el asistente.




Conectando el equipo (pc/laptop) con el teléfono:
  1. Dar click sobre el icono de Bluetooth en la barra de tareas y seleccionar la opción correspondiente al teléfono en el menú. Dentro del submenú se debe seleccionar la opción "Conectar" (recomiendo revisar la funcionalidad de las otras opciones en otra ocasión).




  2. Confirmar la conexión entre el equipo y el teléfono: A la pregunta "¿equipo solicita usar su teléfono como control remoto?" Responder: Sí
  3. Confirmar la conexión entre el equipo y el teléfono (continuación): A la opción "Permitir conexión" Responder: "Permitir siempre"
  4. Confirmar la conexión entre el equipo y el teléfono (continuación): A la pregunta "Iniciar Conexión" Responder: "Sí"
  5. Seleccionar opción de control remoto: En la lista de opción de control remoto seleccionar la opción "Presenter". Nota:La opción "Desktop" permite utilizar las teclas de dirección y acción del teléfono en lugar de un ratón (u otro dispositivo apuntador) en tanto que la opción "Media Player" permite controlar la mayoría de los reproductores de medios (música y video) con el teléfono. Los invito a explorar esas opciones en otra ocasión.
  6. Una vez seleccionada la opción "Presenter" estamos listos para controlar la presentación remota. En la pantalla del teléfono muestra una guía visual para mostrar las teclas que permiten controlar la presentación de manera remota. En mi caso, las teclas de volumen me permiten avanzar retroceder y también se pueden utilizar las teclas de acción, dirección y las teclas del 1 al 6. Los invito a probar la funcionalidad en su teléfono.
Iniciar la presentación:
  1. Abrir OpenOffice - Presenter (en Linux Mint está en el menú "Oficina" en la opción "OpenOffice.org Presentaciones".
  2. Abrir la presentación que se desea controlar.
  3. Ejecutar la presentación (Mediante la opción de menú "Presentación->Presentación" o la tecla "F5").
  4. Controlar la presentación utilizando las teclas definidas para el teléfono.
  5. Voilá!
 Notas:
  • La configuración en el teléfono puede variar entre marcas y modelos, se recomienda leer el manual de su teléfono o en su defecto probar las opciones.
  • La posición de los menús, barra de estado y otras opciones puede variar entre distintas distribuciones de Linux.
  • Los invito a dar retroalimentación el presente artículo con los comentarios de sus propias experiencias.
  • También los invito a proporcionar retroalimentación en cuanto al estilo, Ortografía, etc. del presente artículo.
  • Gracias por leerlo.

    viernes, noviembre 20, 2009

    Ubuntu 9.10 - Karmic Koala - Instalar Controlador de Red Inalámbrica para Laptop DELL Inspiron 1545

    Problema:

    Al instalar Ubuntu 9.10 - Karmic Koala en una Laptop DELL Inspiron 1545, el adaptador de red no funciona (no se detecta en el administrador de conexiones de Ubuntu) y en el archivo /var/log/messages se muestra el siguiente error:

    ...
    Nov 20 05:06:57 caleb-laptop kernel: [ 20.678140] b43-phy0: Broadcom 4312 WLAN found (core revision 15) Nov 20 05:06:57 caleb-laptop kernel: [ 20.724272] b43: probe of ssb0:0 failed with error -95 Nov 20 05:06:57 caleb-laptop kernel: [ 20.724301] Broadcom 43xx driver loaded [ Features: PL, Firmware-ID: FW13 ]
    ...


    Origen:

    Se está utilizando el driver b43 que no soporta el chipset que incluye la Inspiron 1545 (Broadcom BCM4312). Para averiguar el controlador de red inalámbrica se utiliza el siguiente comando: lspci | grep Network


    Solución:

    1. Instalar los controladores restringuidos del fabricante para el chipset de Broadcom. Ubuntu ya los tiene incluidos con el nombre de paquete "b43-fwcutter". Una manera de instalarlos es con el comando: sudo apt-get install b43-fwcutter
    2. Reiniciar la laptop.
    3. Habilitar los controladores restringuidos. Para habilitarlos, se debe ejecutar la opción "Controladores de Hardware" dentro del menú "Sistema" en la opción "Administración". Una vez abierta la pantalla de configuración "Controladores de hardware", se debe activar el "Controlador inalámbrico Broadcom STA" seleccionándolo y oprimiendo el botón "Activar". Esperar a que la activación realice el proceso completo hasta habilitar el controlador.
    4. Una vez habilitado el "Controlador inalámbrico Broadcom STA", reiniciar la laptop.
    5. Al reiniciar la laptop, ya es posible utilizar la red inalámbrica en el "Administrador de Redes".

    miércoles, febrero 20, 2008

    Error al instalar Ubuntu 7.10 (Gutsy): al intentar iniciar el Live CD envía un mensaje "BusyBox" y una línea de comandos.

    Síntomas:


    • Al intentar iniciar desde el disco de instalación de Ubuntu, no puede arrancar en su lugar envía un mensaje BusyBox (cons distintas variantes) y una consola shell.
    • Posterior a esto, se puede verificar el detalle del error en la consola virtual 1 (presionando las teclas Ctrl-F1).
    Origen:
    • Fallo en el kernel 2.6.22 que es el incluido con esta versión de Ubuntu.
    • Dicho fallo ocurre al cargar un módulo initramfs llamado piix.
    • Al cargarse dicho módulo con algunos discos duros IDE antiguos, ocurre un fallo que impide al kernel cargar adecuadamente la unidad de disco duro.
    Solución:

    Guía para instalar Ubuntu y hacerlo correr a pesar del mensaje BusyBox:


    1. Al arrancar con el disco de instalación, elegí las opciones de idioma y teclado que regularmente uso (con las opciones F2 y F3). Si se desea, se puede omitir este paso para cargar el idioma y mapeo de teclado original.
    2. Seleccione la opción F6. Al seleccionar esta opción, debajo de las opciones del menú se mostrará una línea con el comando completo que se ejecutará para cargar el Kernel del disco de instalación con las opciones elegidas.
    3. Al final de la línea de comandos (después del guión -) agregué la opción:
      break=top.
    4. Presionar para iniciar la instalación.
    5. Casi de manera inmediata, muestra el indicador de mensaje BusyBox y una línea de comandos.
    6. En la línea de comandos de busybox tecleé los siguientes comandos: modprobe ide_generic
      modprobe ide_cd
      modprobe ide_disk
      exit
    7. Esto cargará los módulos necesarios para reconocer los discos duros que tienen este problema. El comando exit terminará la sesión BusyBox y continuará cargando la instalación habitual de Ubuntu.
    8. Instalar Ubuntu con las opciones deseadas (hay infinidad de documentos en la web al respecto, por lo tanto no detallaré este paso).
    9. Una vez finalizada la instalación de Ubuntu, al quitar el CD de instalación de la unidad y reiniciar el equipo intenta arrancar desde el disco duro. Al intentar cargar la instalación del disco duro, fallará, mostrando nuevamente la línea de comandos de BusyBox (de nuevo, se puede consultar el detalle del error en la consola virtual 1 presionando Ctrl-F1).
    Guía para arrancar con la versión de Ubuntu instalada en el disco duro a pesar del mensaje BusyBox:

    1. Repetir los pasos del 1 al 6 de la "Guía para instalar Ubuntu y hacerlo correr a pesar de el mensaje BusyBox".
    2. Una vez cargado en entorno de instalación, se debe abrir una línea de comandos.
    3. En la línea de comandos, escribir los siguientes comandos:
      fdisk -l (Para consultar la partición en donde se instaló Ubuntu, generalmente marcada con la etiqueta Linux en la columna System). La partición debe ser algo como /dev/hda1
      mount /mnt /dev/hda1 /mnt
      (Monta la partición en donde está instalado Linux en el directorio /mnt)
      chroot /mnt (Cambia el directorio raíz de la instalación de Ubuntu por el directorio recién montado)
    4. Una vez que tenemos cargada como raíz / la partición en donde instalamos Ubuntu, debemos actualizar la lista de módulos initramfs. Para hacer esto debemos editar el archivo /etc/initramfs-tools/modules (anteponiendo el comando sudo para editar como usuario root) de manera que agreguemos las siguiente líneas:
      #Agregado para cargar los módulos que nos permiten leer el disco duro que tiene fallos:
      piix
      ide_generic
      ide_cd
      ide_disk
      #Se agrega para evitar que se cargue este el módulo que provoca el error.
      blacklist ata_piix
    5. Actualizar el kernel con los cambios en los módulos. Para hacerlo se debe ejecutar el siguiente comando:
      sudo update-initramfs -u
    6. Reiniciar la PC para cargar el Ubuntu instalado en el disco duro.
    7. ¡¡YA TENEMOS UBUNTU 7.1O (GUTSY) INSTALADO Y FUNCIONANDO!!

    Mayor información:
    https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/153991

    lunes, febrero 21, 2005


    El Software Libre como esquema de negocios

    Ante el avance constante del Software Libre en el panorame mundial, quienes nos dedicamos al desarrollo de Software como medio de vida nos preguntamos en alguna ocasión: ¿Qué puedo / debo hacer?
    Esta pregunta se formula tomando como base al Software Libre como una "competencia desleal" en donde se hace "lo mismo" pero "sin cobrar". Sin embargo, dichas aseveraciones son infundadas. en el presente artículo, voy a explicar porque son infundadas y además, voy a asentar lo que considero son las bases para generar un negocio sustentable con la base en el Software Libre exponiendo algunos ejemplos.

    ¿Es el Software Libre una competencia para el desarrollador de Software?

    Puede llegar a serlo dependiendo de la solución que nosotrtos vayamos a ofrecer como desarrolladores. Pero se puede decir que en la mayoría de los casos NO LO ES en absoluto. Para dar una idea, voy a plantear dos situaciones extremas en donde SI puede ser competencia y en las que NO puede ser competencia.

    Escenario 1:

    En el primer escenario, soy un desarrollador que está planeando construir una hoja de cálculo para venderla en las empresas. En este escenario, porsupuesto que el Software Libre será competencia para mí, porque estoy desarrollando una solición demasiado "abierta" en la que me encontraré competidores muy fuertes y con mucha experiencia en ese campo, no solo Software Libre, también competidores comerciales en donde tengo altísimas probabilidades de fracasar.

    Escenario 2:
    En un segundo escenario, después de observar un poco las tendencias del mercado, el "mapa de software mundial" y mis propias competencias, observo que la industria del Acero (solo por mencionar un ejemplo), carece de un sistema para administrar de manera efectiva negocios medianos a un costo razonable y adecuada a las particularidades de este tipo de negocio. Así que busco afanosamente (sin éxito) algún Software Libre para este tipo de negocio. Incluso a nivel comercial, solo se encuentran algunas soluciones cuyo costo es prohibitivo para el tamaño de negocio al que pretendo dar el servicio. en este último punto, quizás encontraré algunos programas que requerirían de modificaciones para adecuarse a las particularidades del negocio. Aquí es donde se puede desprender el esquema de negocio que se describe abajo.

    El esquema de negocios

    De acuerdo con la filosofía del Software Libre, no es posible cobrar regalías por uso de licencia en el esquema de licenciamiento GNU (qué es el más extendido, y dicho sea de paso, el que da mayor libertad).
    A continuación, se mencionan algunas de las posibilidades de negocios que se pueden llevar a cabo con la utilización del Software Libre.

    Lo primero que debemos hacer es cerciorarnos del tipo de licencia que ostenta el Software que pretendemos utilizar y leerlo detenidametne para saber lo que podemos y lo que NO podemos hacer.

    1. Vender la instalación y configuración. En este esquema, estamos vendiendo nuestros propios conocimientos, aplicados a un área específica. A pesar de que cualquier persona puede aprender a instalar y / o configurar el sistema en cuestión no siempre es conveniente que suceda. Aún en este supuesto (que una persona del negocio requiera aprender a instalar y / o configurar) se puede obtener ua ganancia. Ejemplo: Una empresa desea poner su sitio en internet. Podemos ofrecerle la instalación y configuración de un servidor WEB con Linux y Apache.
    2. Vender capacitación. Nuestro cliente potencial posee algún software instalado pero no posee personal capacitado para administrarlo. Podemos ofrecerle un curso de capacitación para el personal que lo requiera. Ejemplo: La empresa dispone de un servidor web Apache montado en un SO Linux pero no tiene personal con los conocimientos técnicos adecuados para administrar dicho servidor. podemos ofrecer cursos de Linux y cursos de administración de Apache (servidor WEB).
    3. Vender soporte. Es posible que los clientes potenciales tengan software (libre) instalado pero no tienen personal capacitado ni les intresa tenerlo. en este espquema podemos vender servicios de soporte en dos modalidades: por evento (en algún problema) ó en la modalidad de horas de soporte mensual (el cliente decide para que usar las horas fijas de soporte que tiene disponible). Ejemplo: Nuestro cliente potencial tiene la misma instalación de los ejemplos anteriores pero no tiene personal capacitado ni desea capacitar al personal existenta. En un caso así, podemos ofrecerle una póliza de soporte mensual por un número de horas adecuado a los problemas que tenga ó nuestros servicios de soporte técnico por evento.
    4. Rentar las aplicaciones. Probablemente nuestros clientes potenciales no deseen enfrentarse a los problemas que implica tener el software instalado en la infraestructura propia, así que aprovechando las posibilidades que mucho software tiene para funcionar como servidor WEB ó aplicaciones remotas vía Internet (entre otras muchas soluciones para usar el software de manera remota). Podemos ofrecerle la renta de aplicaciones instaladas en nuestra propia infraestructura. Ejemplo: Rentar el webhosting de un servidor Apache montado en un servidor Linux para alojar la página de nuestro cliente.
    5. Desarrollar aplicaciones bajo la licencia GNU y / o con base en licencias GNU. Quizás nuestrro cliente utiliza software libre para administrar su negocio pero no se adecua a las particularidades de su negocio. Tal vez existe software comercial disponible para cubrir sus necesidades pero el costo no está al alcance del negocio. En estos entornos, podemos ofrecerle a nuestro cliente el desarrollo a la medida de una aplicación bajo una licencia GNU, esto nos daría como ventaja, tomar como base algún software existente (bajo licencia GNU también), adecuando el mismo a las peculiaridades del negocio y / o "tropicalizando" la aplicación para que se adecue al esquema de operación de nuestro cliente. Incluso, es factible iniciar el desarrollo de una aplicación con dicho esquema, contando con el apoyo de miles de desarrolladores alrededor del mundo que de manera directa ó indirecta pueden contribuir a nuestro proyecto. En este caso, además podemos ofrecer la venta de otros servicios omo los mencionados con anterioridad.
    Dichas oportunidades de nogocio son las que yo visualizo, por lo que los invito a engrosar la lista y / o a darme sugerencias para modificar la misma.

    En resumen: El Software Libre, puede representar una clara oportunidad de negocios (que ya está en marcha, vease lso negocios propuestos en La Cofradia Digital) por lo que debemos capacitarnos y prepararnos en todos sentidos para afrontar una nueva manera de trabajar. En este mismo orden de ideas, cabe destacar que lo que realmente puede ser un factor que nos diferencie de la competencia es el VALOR AGREGADO en una solución, por lo que no es costeable ofrecer Software, sino SOLUCIONES TECNOLÓGICAS.

    En mi experiencia personal, soy un humilde promotor de Software Libre, sin embargo, tampoco descarto ni descalifico el esquema de Software Comercial (del que por cierto he vivido mucho tiempo) pero estoy suficientemente mentalizado como para trabajar con ambos esquemas de licenciamiento y sobre todo propornerle a mis clientes soluciones acordes a sus necesidades.

    lunes, enero 24, 2005


    Tendencias Tecnológicas

    Un nuevo año transcurre, y cada vez nos sorprenden más los logros tecnológicos del ser humano. En esta interminable carrera, nos preguntamos: ¿hasta donde llegará el ser humano? ¿cómo serán los artefactos tecnológicos dentro de 10 años?

    Pues bien, algunas tendencias y noticias del área, además de mi apreciación personal, me atreveré a formular algunas posibilidades (nota: no las llamo "predicciones") en algunas áreas.

    • En el ámbito general de los artículos tecnológicos de uso personal, continuará la convergencia de diversos usos en un mismo artefacto (relojes con reproductores de MP3, Handheld, almacenamiento de datos, radio, celulares con juegos, reproductores de medios, videocámara, cámaras fotográficas, etc. y sus posibles combinaciones)
    • También continuará la tendencia de dotar a estos dispositivos con conexión inalámbrica entre ellos, además de permitir la conexión a Internet a través de dicha conexión (para la interconexión de dispositivos considero que aún le queda tiempo de vida a los rayos infrarrojos para intercambio de datos entre celulares y handhelds, Bluetooth continuará su expansión lenta pero consistente en el reemplazo de los cables para interconexiones y el conjunto de tecnologías WiFi 802.* y sus sucesores dominarán las conexiones en áreas más extensas y permitirán la conexión de virtualmente cualquier dispositivo a la Red Mundial.
    • El avance de las tecnologías inalámbricas, permitirá que en unos 5 años sea posible conectarse de manera inalámbrica con un conjunto de tecnologías estándar (le apuesto a un sucesor de WiFi 802.*) desde virtualmente cualquier parte en prácticamente cualquier ciudad mediana del mundo, en gran parte de ellas sin costo alguno y a velocidades similares a las que actualmente se encuentran en las redes de área local. Los proveedores de Servicios de Internet (ISP) darán servicio a través de tecnologías de este tipo, lo que disminuirá el costo por transporte de datos a través de terceros (carriers), además permitirá una instalación más rápida en los hogares de los usuarios y un costo menor de infraestructura para los proveedores.

    • En este mismo orden de ideas, la Red Mundial (Internet) soportará velocidades mucho mayores (quizás hasta 10 veces más que la actual) , transportando la mayor parte del tráfico de voz (empaquetada a través de tecnologías Voip) abaratando los servicios de voz hasta un 50% de los costos actuales (quizás más, soy conservador en este sentido). Los servicios de transporte de video y audio, seguirán un lento pero firme avance en áreas específicas en las que son de suma utilidad (como la educación, la medicina, etc.) El avance en la velocidad de la red mundial continuará aumentando las velocidades de conexión hasta el usuario final, ADSL seguirá su avance firme en México, seguido muy de cerca por las tecnologías inalámbricas hasta que finalmente domine el mercado.

    • En el ámbito de las fuentes de poder portátiles, específicamente en el terreno de las de origen químico (baterías), no se esperan cambios sustanciales por los alcances químicos, por lo que nuevas tecnologías como las celdas de combustible (predominantemente) permitirán una mucho mayor duración de la energía portátil (imagina un celular que no requiera recargarse en muchas semanas a un uso continuo).

    • En la industria automotriz, el principal cambio vendrá con la popularización de los motores eléctricos impulsado por los Estados Unidos que están "presionando" a la industria automotriz a cambiar lo más pronto posible los motores de combustión interna por algún método mas "amigable" con el medio ambiente. Quizás también las celdas de combustible se empleen de manera comercial en esta industria, pero en los siguientes 10 años no espero ver más que prototipos con esté tipo de energía.

    • La electrónica seguirá invadiendo todas las partes de los automóviles y de prácticamente cualquier tipo, serán más comunes las suspensiones, frenos, equipo de seguridad, alimentación del motor, etc. controlados por medio de electrónica. Incluso, en vehículos de gama alta, es muy probable que en situaciones de emergencia, computadoras tomen el control de la situación y permitan salvar más vidas, controlando frenos, suspensión, motor, etc. También notificarán a los servicios de emergencia de algún posible accidente y guardarán los datos pertinentes para su análisis (gran parte de esto ya se realiza en la actualidad pero se hará más popular).

    • En la Telefonía Celular seguirán convergiendo las tecnologías y más que dispositivos de comunicación serán: reproductores multimedia, handhelds, etc. Las tecnologías 3G serán la norma, permitiendo el intercambio de información masivo utilizando los teléfonos móviles, enviar información multimedia (como video y audio) serán prácticas comunes. El crecimiento de la telefonía celular en México seguirá comportándose de manera exponencial como hasta hoy lo ha hecho, superando en mucho a otros sectores de los medios de comunicación. Las redes de telefonía celular cubrirán en su mayoría el territorio nacional llegando a lugares en donde otros medios no tienen cobertura. Y como buen deseo: Que las compañías de telefonía celular colaboren entre sí para intercambiar tráfico y brindar una mayor cobertura de manera colaborativa (lo considero muy poco probable, pero es un buen deseo).

    • La Robótica seguirá presentando avances sorprendentes en el campo de la inteligencia artificial, sin embargo, los robots seguirán en los ámbitos de la industria, automatización y demás. Veremos robots "humanoides" solo a nivel de prototipos, dichos prototipos seguirán avanzando en imitar los movimientos de un ser humano, tendrán más capacidad de interacción visual, sensitiva y verbal.

    • En el campo de la Nanotecnología, se vislumbrarán cada vez más aplicaciones en el ámbito médico para diagnosticar enfermedades principalmente, también se verán aplicaciones en el área de la electrónica para aprovechar mejor la energía, miniaturizar aún más los componentes, generar micro-máquinas con cierta autonomía a nivel experimental, se avanzará en el estudio de materiales para la industria, esto quizás permita generar materiales más resistentes a los golpes, la temperatura, etc.

    • El Software Libre continuará su avance en las empresas, ganado terreno principalmente en todo tipo de servidores. Aunque también se esperan avances sustanciales en el uso de los usuarios finales, con mejores interfaces gráficas (mas amigables y sencillas). Los avances en la instalación, configuración, mantenimiento y uso permitirán llegar a usuarios con menores conocimientos en el área de cómputo. Los gobiernos seguirán migrando su plataforma a Software Libre, principalmente por la independencia tecnológica que esto representa. Los centros de estudio quizás por fin volteen su mirada para fometar el uso y la capacitación en Software Libre para generar personal capacitado. Por último, la principal fuente de información al respecto seguiremos siendo los miles y millones de personas que amamos y defendemos la libertad, libertad para decidir, para conecer y compartir nuestros conocimientos a los demás.
    http://www.wi-fi.org/OpenSection/index.asp

    http://www.bluetooth.com/