lunes, 31 de enero de 2011

Joomla: Crear una nueva página

En esta corta guía pretendo mostrar rápidamente como agregar una nueva página en Joomla.

1. En el menú de contenido seleccionamos la opción de administrador de artículos. Ahí hacemos clic en el botón de nuevo o "New".


2. Agregamos el contenido de la página usando el editor o usando código HTML de manera directa.

3. Ahora vamos al administrador de menús, seleccionamos el menú donde vamos agregar la nueva opción para enlazar a nuestra nueva página. Una vez que seleccionamos el menú damos clic en nuevo o "new".


4. Nos va aparecer una nueva ventana para elegir el tipo de menú, del cual elegimos la opción de diseño de artículo ("article layout").



5. Después escogemos en las opciones de la derecha el artículo que queremos enlazar.


Y finalmente solo nos resta examinar la página para ver como queda.

martes, 25 de enero de 2011

3 Razones por las cuales uno no debería crear un perfil nuevo en Facebook para una organización, empresa, grupo, etc...



Es típico encontrarse en Facebook, no sé si sucedera en otras redes sociales, que personas queriendo aprovechar la riqueza comunicativa, y por tanto mercadológica, de esta red, crean perfiles nuevos para sus negocios, organizaciones, grupos, etc. Así que no es atípico abrir el correo electrónico y ver en la bandeja un nuevo mensaje titulado: "Restaurant El Pollito Feliz quiere ser tu amigo en Facebook". Usualmente al menos que sea una persona bastante cercana, ignoro estas invitaciones porque me parece un uso incorrecto de lo que es un amigo o contacto en Facebook. Claro que la principal razón de esta práctica es la ignorancia de los usuarios de las otras herramientas que ofrece Facebook como lo son los grupos y páginas. También está el otro motivo del cual sospecho, sin tener ninguna prueba alguna aclaro, de que a la gente le parece mucho más atractivo la relación con la etiqueta "amigo" vs "fan" o "les gusta".

Pero analicemos tres razones por las cuales no se debería crear un perfil nuevo para una organización, empresa, grupo, etc:

1. Muchas personas no están enteradas de este dato, pero Facebook solo te permite tener un máximo de 5,000 amigos. ¿Quién quiere más después de todo? Y es que con toda razón nadie en la realidad puede tener más que eso. Así que si el dueño del Restaurant El Pollito Feliz está emocionado porque se esta acercando a los 4,900 amigos y sueña con ser el restaurant de pollos con más amigos en Facebook del país, pues recibirá un baldazo de agua fría cuando se de cuenta que va tener que crear una página si quiere seguir creciendo, y tendrá que mudar a todos sus amigos a su nueva página.

2. Esas tediosas confirmaciones de amigo. No estoy seguro si en la configuración de un perfil, uno puede deshabilitar la confirmación de seguridad cuando alguien solicita ser tu amigo, pero por defecto esto siempre está habilitado. Así que nuestro amigo de El Pollito Feliz tiene todos los días que dedicar unos minutos para confirmar solicitudes de amigos. Si tuviera la página no tendría que hacer esta tediosa labor pues en teoría no necesita filtrar a nadie. El necesita agregar la máxima cantidad de contactos sin examinar quién es la persona. Esto además ensucia las actualizaciones de titulares o noticias con el usual: "Restaurant El Pollito Feliz ahora es amigo de Juan de Los Palotes". Como si eso realmente a uno le interesara conocer.

3. Si no tienes una página no disfrutaras de las funcionalidades agregadas como lo son las estadísticas. Esto es lo más cercano que uno podría tener a saber quién exactamente visita tu perfil. Entre otras cosas se puede saber qué tipo de poblaciones siguen tu página ,segmentado por ejemplo por sexo, país, idioma y ciudad.




Así que mi estimado amigo del Pollito Feliz, si apenas has creado tu perfil nuevo y tienes solo 30 amigos, te sugiero te deshagas de ese perfil y crea una página en Facebook. De lo contrario, luego tendrás que botar todo ese gran esfuerzo y empeño cuando te des cuenta que has pegado con cerca.

lunes, 24 de enero de 2011

Patrón de Diseño: Decorator

Como leía en un libro, asimilar patrones de diseño es como tener varios expertos sentados a tu lado mientras programas. Quize en esta ocasión agregar un experto más a mi lado comprendiendo el patrón "Decorator" (o Decorador en español). En especial llamó mi atención este patrón, porque leyendo un libro mencionaron que las operaciones en Java de I/O streaming utilizan este patrón por detrás para asignar funcionalidad en tiempo de ejecución.


File file = new File("c:/temp");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);


En muy resumidad palabras, el uso del patrón Decorator es más flexible que el uso de herencia, en el sentido de que la herencia asigna responsabilidad a clases en tiempo de compilación, mientras que el patrón Decorator las asigna en tiempo de ejecución ("runtime"). Como en casi todo patrón de diseño lo más sencillo es explicarlo directamente con código.

En el siguiente código de ejemplo vamos utilizar una aplicación hipotéctica de una academia de ingeniería de software. En dicha aplicación existe la entidad estudiante de ingeniería de software ("SoftwareEngineerStudent"), a la cual se le puede aplicar N decoradores para simular el proceso de aprendizaje durante su carrera. He aquí el patrón aplicado en UML:




El SoftwareEngineerStudent es representado con una interface donde el método que vamos a decorar en otras clases es el showCurriculum():


package patterns.decorator;

public interface SoftwareEngineerStudent {

/**
* Shows students curriculum.
*/
public void showCurriculum();
}


Seguidamente tenemos la clase que implementa nuestra anterior interface, el "SimpleSoftwareEngineerStudent". La única funcionalidad agregada es que imprimimos en consola que "Soy un estudiante de Ingeniería de Software":


package patterns.decorator;

public class SimpleSoftwareEngineer implements SoftwareEngineerStudent{

public void showCurriculum() {
System.out.println("I'm a software engineer student");
}

}


Ahora definimos nuestra clase decoradora base con el objetivo de permitir el poliformismo a la hora de entrenar (decorar) a los futuros estudiantes:


package patterns.decorator;

/**
* The Base decorator class.
*
*/
public abstract class SoftwareEngineerDecorator implements SoftwareEngineerStudent{

protected SoftwareEngineerStudent softwareEngineerStudent;

/**
* Constructor must receive an instance of SoftwareEngineerStudent so it can decorates
* something.
*/
public SoftwareEngineerDecorator(SoftwareEngineerStudent softwareEngineerStudent) {
this.softwareEngineerStudent = softwareEngineerStudent;
}

/**
* The operation that will be decorated by subclasses.
*/
public void showCurriculum() {
this.softwareEngineerStudent.showCurriculum();
}
}


Seguidamente creamos nuestras clases decoradoras extendiendo de la clase base SoftwareEngineerDecorator. Nótese que lo único que se hace es sobre escribir el método "showCurriculum()" para imprimir el conocimiento anterior junto con el nuevo (o decorado):


package patterns.decorator;

public class JavaProgrammingDecorator extends SoftwareEngineerDecorator {

public JavaProgrammingDecorator(
SoftwareEngineerStudent softwareEngineerStudent) {
super(softwareEngineerStudent);
}

public void showCurriculum() {
super.showCurriculum();
System.out.println("I have some basic knowledge in Java language.");
}

}

public class DesignPatternsDecorator extends SoftwareEngineerDecorator{

public DesignPatternsDecorator(
SoftwareEngineerStudent softwareEngineerStudent) {
super(softwareEngineerStudent);
}

public void showCurriculum() {
super.showCurriculum();
System.out.println("I know how to apply the most common design patterns");
}
}


public class DatabasesDecorator extends SoftwareEngineerDecorator {

public DatabasesDecorator(SoftwareEngineerStudent softwareEngineerStudent) {
super(softwareEngineerStudent);
}

public void showCurriculum() {
super.showCurriculum();
System.out.println("I can design ER databases.");
System.out.println("I know SQL.");
}
}



Por último tenemos la clase "SoftwareEngineerAcademy" para mostrar la aplicación de los decoradores. En el método principal se instancian dos estudiantes los cuales toman diferentes caminos en sus carreras. Los métodos trainIn...() toman la instancia del estudiante y le aplican un decorador que es retornado al final. Este mecanismo podría mejorarse aplicando un poco de reflection, pero vamos a dejarlo así para simplificar la explicación.



package patterns.decorator;

public class SoftwareEngineerAcademy {

public static SoftwareEngineerStudent trainInJava(
SoftwareEngineerStudent softwareEngineerStudent) {
SoftwareEngineerStudent studentTrainedInJava =
new JavaProgrammingDecorator(softwareEngineerStudent);
return studentTrainedInJava;
}

public static SoftwareEngineerStudent trainInDatabases(
SoftwareEngineerStudent softwareEngineerStudent) {
SoftwareEngineerStudent studentTrainedInDatabases =
new DatabasesDecorator(softwareEngineerStudent);
return studentTrainedInDatabases;
}

public static SoftwareEngineerStudent trainInDesignPatterns(
SoftwareEngineerStudent softwareEngineerStudent) {
SoftwareEngineerStudent studentTrainedInDesignPatterns =
new DesignPatternsDecorator(softwareEngineerStudent);
return studentTrainedInDesignPatterns;
}

public static void main(String[] args) {
SoftwareEngineerStudent studentA = new SimpleSoftwareEngineer();
studentA = SoftwareEngineerAcademy.trainInJava(studentA);
studentA = SoftwareEngineerAcademy.trainInDatabases(studentA);
System.out.println("**********************");
System.out.println("Student A Curriculum: ");
System.out.println("**********************");
studentA.showCurriculum();

SoftwareEngineerStudent studentB = new SimpleSoftwareEngineer();
studentB = SoftwareEngineerAcademy.trainInJava(studentB);
studentB = SoftwareEngineerAcademy.trainInDesignPatterns(studentB);
System.out.println("**********************");
System.out.println("Student B Curriculum: ");
System.out.println("**********************");
studentB.showCurriculum();
}
}


Cuando corremos el programa vemos que efectivamente cuando se aplicaron los decoradores, al final el estudiante muestra el curriculum correctamente:


**********************
Student A Curriculum:
**********************
I'm a software engineer student
I have some basic knowledge in Java language.
I can design ER databases.
I know SQL.
**********************
Student B Curriculum:
**********************
I'm a software engineer student
I have some basic knowledge in Java language.
I know how to apply the most common design patterns

miércoles, 19 de enero de 2011

Cascarones UML para patrones de diseño



Hasta hace poco descubrí que la herramienta de código abierto StarUML para edición de diagramas UML, tenía una opción tipo wizard para generar cascarones de los patrones de diseño más conocidos.

1. Clic derecho en el diagrama - > Apply Pattern...


2. En la siguiente ventana aparecen dos grupos de patrones: EJB y los clásicos GoF ("Gang of Four"). Elegimos el que deseamos:



3. En la ventana de parámetros podemos cambiar el nombre de las clases que forman el patrón o incluso escoger clases que ya existen en nuestro proyecto.


En este ejemplo agregue 4 patrones de diseño de esta forma al diagrama.

jueves, 6 de enero de 2011

Java Portable




Es útil conocer que tenemos la posibilidad de llevar Java con nosotros para poder ejecutar programas en computadoreas donde no tenemos instalado el runtime (JRE). Hace poco estabamos corriendo en el equipo porque uno de los desarrolladores no configuró bien el ambiente y terminó desarrollando la aplicación para Java 6 cuando tenía que hacerlo para Java 5. El servidor donde iba correr la aplicación de escritorio solo tiene instalado Java 5 (por razones de "seguridad" solo permiten esa versión).

Así que estabamos apresurados porque se utilizaron clases de Swing que solo están disponibles en Java 6. Nos dimos cuenta porque cuando ejecutabamos el JAR nos aparecía el típico java.lang.NoClassDefFoundError. Después de un rato de andar corriendo para cambiar las clases me acordé que hay versiones de Java portable. Busqué la versión portable de Java 6, descargué también la utilidad de Java Portable Launcher y listo, estaba ejecutando en el servidor la aplicación compilada en Java 6.

Solo hay que seguir estos pasos:

  1. Descargamos la versión portable de Java.
  2. Descargamos Java Portable Launcher.
  3. Para que JLauncher funcione necesitamos tener la siguiente estructura de carpetas:


Con esta configuración inclusive podemos llevar OpenOffice en una llave y poder ejecutarlo en cualquier máquina sin mayor problema (al menos teóricamente hablando).

miércoles, 5 de enero de 2011

Herramienta de sincronización: DirSync Pro

Una programa más para mi caja de herramientas. DirSync Pro es una utilidad que permite en pocas palabras, syncronizar archivos y carpetas. En el pasado ya había experimentado con algunos programas gratuitos de sincronización, pero DirSync Pro barre con todos.

Voy a ilustrarlo con un ejemplo. Por cuestiones de un proyecto en particular que estaba trabajando, necesitaba tener dos carpetas diferentes versionadas con SVN usando dos servidores de SVN diferentes.

+ La carpeta A estaba versionada con el servidor del cliente
+ La carpeta B estaba versionada con el servidor local de la empresa.

¿Por qué no usamos solo el servidor del cliente? Por una cuestión de priviliegios que solo permitía a dos personas específicas tener acceso al servidor del cliente. Como teníamos varios desarrolladores y ocupabamos mantener la integridad del trabajo, versionamos el proyecto localmente. Al final siempre teníamos que reflejar los cambios hechos en el servidor de SVN del cliente.

Es ahí donde DirSync Pro facilitó la tarea. En este ejemplo configuro una sincronización de B hacia A con la siguiente configuración:
  • Copie todos los archivos y carpetas nuevos y modificados.
  • Borre los archivos y carpetas que aparecen en A pero no en B.
  • No tome en cuenta las carpetas que se llaman ".svn" (estas no son carpetas del proyecto sino carpetas de SVN para el control de versiones)..


Los filtros en las opciones de la utilidad fueron de mucha ayuda para evitar causar conflictos con SVN por arrastrar los ".SVN". Además la herramienta permite hacer otro tipo de copiados los cuales no he explorado mucho, pero agregan una gran flexibilidad para el usuario.