martes, 20 de septiembre de 2016

SDK Emotiv Educational Edition

En esta ocasión quiero compartirles el SDK en su versión educacional; para trabajar con la diadema electroencefalográfica de la compañía Emotiv.

Fig. 1. Diadema Emotiv Epoc de 14 canales


La diadema electroencefalográfica de Emotiv cuenta con 14 canales para sensar la actividad cerebral. Existen diversos programas para procesar las señales correspondientes, pero estos no funcionan sin la librería de Emotiv, por lo que les dejo a continuación los links donde pueden descargar el SDK:

jueves, 1 de septiembre de 2016

Dev C++ con Allegro en Máquina Virtual

En esta ocasión quiero compartir con ustedes algo que espero les sea de mucha ayuda. Se trata de una máquina virtual, la cual contiene Windows 7 de 32 bits instalado. La particularidad que tiene esta máquina virtual es que ya tiene Dev C++ y Allegro correctamente instalado, listo para empezar a programar. Al final de esta entrada les dejo el vídeo donde explico cómo abrir la máquina virtual.

La máquina virtual está creada para ser ejecutada con VirtualBox, así que deben tener instalado este programa. VirtualBox lo pueden conseguir desde el siguiente link:



También si desean descargar la versión con la cual he probado la ejecución en el vídeo, les dejo este otro link:


Los links de la máquina virtual los he subido a diferentes servidores para que puedan descargar las partes del archivo lo más rápido posible. El peso total de la máquina virtual es de 6.83 GB. Está comprimida en 13 archivos .rar, de aproximadamente 204 MB cada uno. Cuando descarguen todas las partes (no importa si son de un servidor o de otro, todas son iguales), den doble clic al archivo con terminación part01, y descompriman, enseguida se les creará una carpeta donde se encontrará la máquina virtual. A continuación les dejo los links:

NOTA: Al abrir los links, serán redireccionados a una página publicitaria de adfly, solamente esperen 5 segundos, y presionen el botón de SALTAR PUBLICIDAD, enseguida les abrirá la página de descarga del archivo.

MEGA

MediaFire

4Shared

Rapidgator

Uplea

Les dejo el vídeo donde explico cómo abrir la máquina virtual desde VirtualBox.



lunes, 18 de julio de 2016

Instalar Joomla en español con XAMPP

En esta ocasión quiero compartir un material donde explico cómo instalar Joomla usando la aplicación XAMPP, la cual ya contiene un servidor Apache, PHP y MySQL (necesarios para la instalación del gestor de contenidos Joomla.

Cuando utilicé XAMPP para instalar Joomla, tuve ciertos problemas con algunas versiones. Por eso a continuación adjunto el vídeo donde comento precisamente esto.

Los archivos utilizados en el vídeo son los siguientes. XAMPP:

MEGA | One Drive

Joomla 3.3.1 Español:



lunes, 30 de mayo de 2016

Ejemplo de programación con Allegro: Serpiente

Para aquellos interesados en los ejemplo de la librería Allegro, les comparto este juego desarrollado por Nacho Cabanes. Es el famoso juego de la serpiente, totalmente desarrollado en C++ usando la librería Allegro.

Fig. 1. Juego de la serpiente

El código fuente y ejecutable, lo pueden descargar desde los siguientes links:


jueves, 26 de mayo de 2016

Ejemplo de programación con Allegro: Simón dice

En esta ocasión quiero compartirles este ejemplo con Allegro, el cual es autoría de Nacho Cabanes. Es el clásico Simón dice, programado en Dev C++ para la librería Allegro.

Fig. 1. Simon dice

El código fuente lo pueden descargar desde los siguientes enlaces:

miércoles, 27 de enero de 2016

Visualizador de imágenes BMP en C++ y Windows XP

Comparto en esta ocasión un trabajo que realicé hace algunos años. Se trata de un visualizador de imágenes BMP hecho en C++. Este programa corre en Windows XP debido a la compatibilidad de la librería utilizada. Para compilar y ejecutar el código recomiendo se haga con Turbo C++, mismo que les comparto al final de esta entrada.

El código genera un visualizador de imágenes BMP; sólo se puede visualizar una imagen a la vez y con ciertas condiciones, las cuales se describen a continuación:
  • Deben ser imágenes de mapa de bits únicamente (extensión .bmp)
  • Las dimensiones de la imagen deben ser de 320 x 200 pixeles (320 pixeles de ancho por 200 pixeles de alto).
  • La imagen debe ser de 256 colores.
Al abrir el programa con Turbo C++ (se encuentra en la carpeta TC/BIN/TC.EXE), deben ver una pantalla como la que se presenta en la Figura 1.

Figura 1. Turbo C++

Cuando se ejecute el programa, se verá primeramente la imagen predeterminada en color normal, como se muestra en la Figura 2.

Figura 2. Imagen visualizada

Si se presiona enter un par de veces, la imagen pasa por un filtro de escala de grises y es presentada (Figura 3).


Figura 3. Imagen visualizada en escala de grises

Este visualizador es solamente para poner en práctica las bases de la programación gráfica a un nivel un poco más bajo. Actualmente ya existen controles en la mayoría de IDE's que nos permiten visualizar imágenes con sólo pasar la ruta como parámetro de la imagen que deseamos visualizar en pantalla.

Otros ejemplos de imágenes de las mismas características son las siguientes:

Figura 4. Imagen BMP de 320 x 200 y 256 colores

Figura 5. Imagen BMP de 320 x 200 y 256 colores

Figura 6. Imagen BMP de 320 x 200 y 256 colores

Como inicialmente les comenté, recomiendo que ejecuten el código en el programa Turbo C++, bajo Windows XP; comparto la carpeta con Turbo C++, esa carpeta deben colocarla en C, de forma que la ruta sea: C:\TC.

Así mismo, de preferencia pongan la carpeta del visualizador en la unidad C, para que sea más fácil localizarla a través de Turbo C++, ya que, como el programa es algo viejo, el entorno gráfico no es muy amigable.

A continuación les dejo los links para que descarguen el programa Turbo C++:

Turbo C++

El código fuente así como las imágenes de ejemplo las pueden descargar a continuación de cualquiera de los dos servidores:


martes, 15 de diciembre de 2015

Ejemplo de programación con Allegro: Reloj analógico

Para todos aquellos interesados en la programación gráfica con la librería Allegro en C; les comparto este ejemplo en donde se muestra un reloj analógico. Es un ejemplo sencillo que espero pueda servir de utilidad.

Fig. 1. Reloj en Allegro

Les dejo el código fuente y ejecutable en los siguiente repositorios:

viernes, 11 de diciembre de 2015

Ejemplo de programación con Allegro: Esfera

En esta ocasión quiero compartir con ustedes un ejemplo sencillo de programación gráfica con la librería de Allegro para DevC. Se trata de una esfera. La esfera está formada por círculos de diferente diámetro; al final obtenemos una vista 3d de una esfera simple. Desde luego es algo básico, usando sólo una figura geométrica definida en la librería de Allegro. Espero que les sirva a aquellas personas que están iniciándose en la programación gráfica con Allegro, y para las que no, que se animen a programar en esta área que les podrá llevar a la programación de video juegos.

Fig. 1. Esfera con Allegro

El código fuente y ejecutable se encuentran en los siguientes repositorios:

jueves, 10 de diciembre de 2015

PACMAN en Allegro

Hace algunos años empecé un juego en C con Allegro. Sin embargo no logré terminarlo; pero algunas personas me han preguntado si tengo juegos programados. Realmente la programación de videojuegos es muy interesante, pero no es un área en la que me familiarice bastante. De todas formas comparto con ustedes este juego empezado, quizá pueda darles alguna idea o por qué no, terminarlo.

NOTA: Es indispensable que la librería alleg42.dll se encuentre ubicada junto al archivo ejecutable del juego.

Fig. 1. PACMAN con Allegro

El código fuente y ejecutable se encuentran en los siguientes repositorios:


lunes, 23 de noviembre de 2015

Split inverso en Java

Muchos conocemos la función de Split en Java. Split separa una cadena de texto de acuerdo a un delimitador y pone el resultado de esa separación en un arreglo de elementos.

Es decir, si tenemos una cadena como la siguiente:

String cadena = "uno,dos,tres,cuatro,cinco";

Y utilizamos la función split de la siguiente forma:
String cadena = "uno, dos, tres, cuatro, cinco";
String arreglo[] = cadena.split(",");

La variable arreglo[] contendrá los elementos resultado de la división de la cadena mediante el delimitador ",". Esto significa que el arreglo contendrá lo siguiente:
arreglo[0] = "uno"
arreglo[1] = "dos"
arreglo[2] = "tres"
arreglo[3] = "cuatro"
arreglo[4] = "cinco"

Pero en ocasiones tal vez necesitemos llevar a cabo la acción inversa de split; esto es: dado un arreglo de elementos, obtener un cadena con esos elementos, divididos por un delimitador. Teniendo el arreglo anterior, el split inverso nos devolvería una cadena como la siguiente:
cadena = "uno,dos,tres,cuatro,cinco";

Para hacer esta acción inversa tenemos que usar la librería java.util.Arrays; aquí un ejemplo:
import java.util.Arrays;

public class clsReverseSplit {
    public clsReverseSplit() {
    }
    
    public String reverseSplit(String gArreglo[], String delimiter){
        return Arrays.toString(gArreglo).replace(", ", delimiter).replaceAll("[\\[\\]]", "");
    }
    
    public static void main(String args[]){
        clsReverseSplit objeto = new clsReverseSplit();
        String arreglo[] = {"Uno", "Dos", "Tres", "Cuatro", "Cinco"};
        
        /* Imprimimos los elementos del arreglo */
        System.out.println("Elementos: ");
        for(String elemento:arreglo)
            System.out.println(elemento);
            
        /* Obtenemos los valores del arreglo separados por coma */
        System.out.println("Split inverso (separado por comas): ");
        System.out.println(objeto.reverseSplit(arreglo, ","));
        
        /* Obtenemos los valores del arreglo separados por punto y coma */
        System.out.println("Split inverso (separado por punto y coma): ");
        System.out.println(objeto.reverseSplit(arreglo, ";"));
        
        /* Obtenemos los valores del arreglo separados por tabulador */
        System.out.println("Split inverso (separado por tabulador): ");
        System.out.println(objeto.reverseSplit(arreglo, "\t"));
        
        String ac = "uno,dos";
        String arre[] = ac.split(",");
        for(String elemento:arre)
            System.out.println(elemento);
    }
}

Espero pueda ser de utilidad como lo fue para mí. A continuación comparto el archivo de ejemplo:

jueves, 29 de octubre de 2015

Ordenar lista de Strings en Java

Aquí les dejo un ejemplo sencillo de cómo ordenar una lista de Strings en Java.

Fig. 1. Resultado del ordenamiento en Java

El ejemplo de ordenamiento lo implementé directamente sobre el método principal de una clase. Este es el código:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ordenarnombres;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Balam-PC
 */
public class OrdenarNombres {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List<String> nombres = new ArrayList<String>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int opcion = 0;
        int numeroInserciones = 0;
        
        try {
            do{
                System.out.println("============== MENU ==============\n");
                System.out.println("1) Insertar nombres");
                System.out.println("2) Imprimir nombres");
                System.out.println("3) Ordenar nombres");
                System.out.println("4) Salir\n");
                System.out.println("Inserta la opción (1, 2, 3 ó 4): ");
                opcion = Integer.parseInt(br.readLine());
                
                switch(opcion){
                    case 1:
                        System.out.println("¿Cuántos nombres deseas insertar? ");
                        numeroInserciones = Integer.parseInt(br.readLine());
                        for (int i = 0; i < numeroInserciones; i++) {
                            System.out.println("Nombre [" + (i+1) + "]: ");
                            nombres.add(br.readLine());
                        }
                        break;
                    case 2:
                        System.out.println("Nombres:");
                        for (String str : nombres) {
                            System.out.println(str);
                        }
                        System.out.println("Presione enter para continuar...");
                        br.readLine();
                        break;
                    case 3:
                        Collections.sort(nombres);
                        System.out.println("Arreglo ordenado. Presione enter para continuar...");
                        br.readLine();
                        break;
                }
            }while(opcion != 4);
        } catch (IOException ex) {
            Logger.getLogger(OrdenarNombres.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
 
Les dejo el proyecto; está hecho en NetBeans 7.4:


miércoles, 28 de octubre de 2015

Envío de correos electrónicos con PHP y Gmail

En esta ocasión quiero compartir un ejemplo que preparé para el envío de correos electrónicos mediante PHP. Estoy usando la librería phpmailer. La página web principal solamente contiene los elementos como cajas de textos y un botón para enviar la información del usuario a un archivo que llevará a cabo la conexión con una cuenta de Google para poder enviar el correo electrónico. Por lo tanto, voy a centrarme en explicar el archivo que lleva a cabo la tarea del envío del correo electrónico.

Lo primero que requerimos es tener una cuenta en Gmail. Si no contamos con una cuenta en Gmail, habrá que crearla, ya que este ejemplo funciona específicamente con una cuenta de Gmail.

Ahora tendremos que hacer unos ajustes a nuestra cuenta de Gmail para poder enviar correos electrónicos desde nuestra aplicación de PHP. Para esto entramos a nuestra cuenta y en la esquina, donde se muestra nuestro nombre de usuario, damos clic y elegimos Mi cuenta.

Fig. 1. Acceder a mi cuenta de Gmail

A continuación, debemos buscar la opción Cómo acceder a Google

Fig. 2. Cómo acceder a Google

En la pantalla siguiente, debemos buscar y activar la opción Permitir el acceso de aplicaciones menos seguras.

Fig. 3. Permitir el acceso de aplicaciones menos seguras. 

Con esto termina la configuración necesaria de la cuenta de Gmail para poder enviar correos desde nuestra aplicación en PHP.

NOTA: es posible que la primera vez que usemos la aplicación PHP para envío de mensajes con Gmail, la cuenta se bloquee; esto es normal. Para solucionar el problema, deben loguearse nuevamente en la cuenta de Gmail y les pedirá un modo seguro de autenticación (eligen la opción por mensaje). Después de autenticarse deberían poder enviar mensajes desde PHP a través de su cuenta de Gmail.

En el archivo sendMail.php, dentro de la carpeta php (del proyecto que les comparto hasta abajo), encontramos los siguientes datos de configuración:

$mail->SMTPSecure = "tls";            /* El tipo de seguridad será TLS */
$mail->Host       = "smtp.gmail.com"; /* Este es el host smtp de Gmail */
$mail->Port       = 587;              /* Configuramos el puerto, si es TLS el puerto es 587 */
$mail->Username   = "pruebaelrincondelprogramador@gmail.com";  /* Nombre de usuario de la cuenta Gmail que usaremos para envío de mensajes */
$mail->Password   = "prueba12345";                   /* Contraseña de la cuenta de Gmail anterior */

De estos datos, lo único que modificaremos será la propiedad Username y la propiedad Password; que son simplemente el nombre de usuario y la contraseña de nuestra cuenta de Gmail que usaremos como medio para envío de correos electrónicos mediante nuestra aplicación en PHP. Los datos como SMTPSecure, Host y Port, son exclusivos para cuentas de Gmail, si queremos usar una cuenta de Hotmail u otra, habrá que investigar cuál es el host, la seguridad y el puerto de ese tipo de cuenta en específico.

En las siguientes líneas, tendremos que modificar los datos de la propiedad SetFrom; esta propiedad indica quién es el remitente. La propiedad Subject sirve para definir el asunto del mensaje. La propiedad MsgHTML es el cuerpo del mensaje; podemos utilizar código HTML para definir nuestro mensaje. La propiedad AddAddress sirve para configurar el correo y el nombre al que se le va a enviar el correo electrónico.

$mail->SetFrom($correo, $nombre); /* Configuramos los datos que se mostrarán del remitente (el que escribe el mensaje) */
$mail->Subject    = "El asunto del mensaje"; /* Configuramos el asunto que contendrá el mensaje */
$mail->MsgHTML($nombre." escribió:".$comentarios." - Teléfono: ".$telefono." - Correo: ".$correo); /* Configuramos el contenido del mensaje */
$mail->AddAddress($correo, $nombre); /* Configuramos el correo y el nombre a quien se le va a enviar el mensaje (el destinatario) */

Finalmente les dejo los archivos del proyecto completo. También pueden hacer uso de la cuenta de Gmail que dejo en el ejemplo (sólo no abusen de su utilización ya que podrían bloquearla o marcarla como spam).


También si quieren ver la demostración en línea, ingresen al siguiente link: [DEMO]


martes, 6 de octubre de 2015

Nube de palabras con JavaScript y jQCloud

¿Qué es?

Una nube de palabras o nube de etiquetas es una representación visual de las palabras que conforman un texto, en donde el tamaño es mayor para las palabras que aparecen con más frecuencia (wikipedia).

Fig. 1. Nube de palabras

¿Para qué sirve?

Uno de sus usos principales es la virualización de las etiquetas de un sitio web, de modo que los temas más frecuentes en el sitio se muestren con mayor prominencia. Las etiquetas son palabras clave que suelen estar oredenadas alfabéticamente o, en ocasiones, agrupadas semánticamente. La importancia de una etiqueta se muestra con el tamaño de la fuente y/o color.

¿Qué se necesita para hacer una nube de palabras?

En Internet existen librerías diversas para la creación de una nube de palabras. Es algo bastante sencillo; para este caso voy a usar la librería jQCloud, la cuál podrán descargar desde este link.

Primeramente, debemos agregar la librería JQuery entre las etiquetas <head></head> de nuestra (s) página (s) web. Para esto utilizamos la siguiente línea de código:

        <script src="js/jquery.min.js"></script>

Si no contaran con la librería JQuery en su proyecto, pueden agregar la ruta web para descargarla cada vez que entren a la página web:

A continuación, debemos agregar las librerías de jQCloud; para esto copiamos las siguientes líneas de código dentro de la etiquetas <head></head>:

        <script src="jqcloud2/dist/jqcloud.min.js"></script>
        <link rel="stylesheet" href="jqcloud2/dist/jqcloud.min.css">

Una vez hecho lo anterior, es el momento de insertar las palabras y el div donde se va a visualizar nuestra nube de palabras. Para hacer esto, agregamos el código siguiente entre las etiquetas <body> y </body>:

        <div style="width:90%; height: 70%;" id="demo"></div>    
        <script>
            var words = [
                {text: ".NET", weight: 13},
                {text: "C++", weight: 16.5},
                {text: "Java", weight: 9.4},
                {text: "Ruby", weight: 8},
                {text: "Python", weight: 6.2},
                {text: "PHP", weight: 5},
                {text: "Pascal", weight: 5},
                {text: "Javascript", weight: 5},
                {text: "HTML5", weight: 5},
                {text: "Ensamblador", weight: 5},
                {text: "Lorem", weight: 13},
                {text: "Ipsum", weight: 10.5},
                {text: "Dolor", weight: 9.4},
                {text: "Sit", weight: 8},
                {text: "Amet", weight: 6.2},
                {text: "Consectetur", weight: 5},
                {text: "Adipiscing", weight: 5},
                {text: "Java", weight: 9.4},
                {text: "Ruby", weight: 8},
                {text: "Python", weight: 6.2},
                {text: "PHP", weight: 5},
                {text: "Pascal", weight: 5},
                {text: "Javascript", weight: 5},
                {text: "HTML5", weight: 5},
                {text: "Ensamblador", weight: 5}
              /* ... */
            ];

            $('#demo').jQCloud(words);
        </script>

El resultado es el siguiente:

Fig. 2. Nube de palabras con jQCloud

El código completo de la página web es el siguiente:

<html>
    <head>
        <title>
        </title>
        <script src="js/jquery.min.js"></script>
        <script src="jqcloud2/dist/jqcloud.min.js"></script>
        <link rel="stylesheet" href="jqcloud2/dist/jqcloud.min.css">
    </head>
    <body>
        <div style="width:90%; height: 70%;" id="demo"></div>    
        <script>
            var words = [
                {text: ".NET", weight: 13},
                {text: "C++", weight: 16.5},
                {text: "Java", weight: 9.4},
                {text: "Ruby", weight: 8},
                {text: "Python", weight: 6.2},
                {text: "PHP", weight: 5},
                {text: "Pascal", weight: 5},
                {text: "Javascript", weight: 5},
                {text: "HTML5", weight: 5},
                {text: "Ensamblador", weight: 5},
                {text: "Lorem", weight: 13},
                {text: "Ipsum", weight: 10.5},
                {text: "Dolor", weight: 9.4},
                {text: "Sit", weight: 8},
                {text: "Amet", weight: 6.2},
                {text: "Consectetur", weight: 5},
                {text: "Adipiscing", weight: 5},
                {text: "Java", weight: 9.4},
                {text: "Ruby", weight: 8},
                {text: "Python", weight: 6.2},
                {text: "PHP", weight: 5},
                {text: "Pascal", weight: 5},
                {text: "Javascript", weight: 5},
                {text: "HTML5", weight: 5},
                {text: "Ensamblador", weight: 5}
              /* ... */
            ];

            $('#demo').jQCloud(words);
        </script>
    </body>
</html>

Los archivos de este ejemplo pueden descargarlos desde los siguientes links:

MEGA | OneDrive

Para ver la demostración en línea, ingresen al siguiente link: [DEMO]

miércoles, 29 de julio de 2015

Actualización a Windows 10

El día de hoy 29 de Julio de 2015 ya está disponible la actualización a Windows 10 de manera gratuita. Los pasos para reservar la actualización son los siguientes:

Puedes reservar la actualización gratuita en la aplicación Get Windows 10. Para encontrar la aplicación:

  • Haz clic en el icono pequeño (con la figura de una ventana) de Windows ubicado en el extremo derecho de la barra de tareas para comenzar.
  • Haz clic en "Reservar la actualización gratuita" en la ventana de la aplicación.
  • Escribe tu correo electrónico si deseas una confirmación de esta reserva.
  • Todo está listo. Una vez que reserves, Windows 10 se descargará en cuanto esté disponible. No hay obligaciones y puedes cancelar la reserva en cualquier momento.

Requisitos del sistema

Si deseas actualizar tu equipo o tableta a Windows 10, necesitarás esto.

  • Sistema operativo más reciente: Asegúrate de que estás ejecutando la versión más reciente, como Windows 7 SP1 o Windows 8.1 Update.
    • ¿No sabes qué versión estás ejecutando? Consúltalo y descúbrelo aquí.
    • ¿Necesitas descargar la versión más reciente? Haz clic aquí para descargar Windows 7 SP1 o Windows 8.1 Update.
  • Procesador: Procesador o SoC de 1 gigahercio (GHz) o superior
  • RAM: 1 GB para 32 bits o 2 GB para 64 bits
  • Espacio en el disco duro: Sistema operativo de 16 GB para 32 bits y de 20 GB para 64 bits
  • Tarjeta gráfica: Controlador DirectX 9 o posterior con WDDM 1.0 
  • Pantalla: 1024x600

jueves, 7 de mayo de 2015

Patrón de diseño Singleton en Java

En esta ocasión quiero compartir esta implementación del patrón de diseño Singleton en Java. Veamos primeramente qué es un patrón de diseño:

"El patrón de diseño singleton (instancia única) esta diseñado para restringir la creación de objetos pertenedientes a una clase o el valor de un tipo a un único objeto". Fuente: Wikipedia

Como nos indica la definición anterior; el patrón de diseño singleton sólo permite crear un único objeto. Pero vamos a ver el ejemplo de cómo crear un patrón singleton para que quede claro:

1) Vamos crear la clase Futbol:

package equipofutbol;

/**
 *
 * @author Balam-PC
 */
public class clsFutbol {
    private static clsFutbol instance;
    private String equipo;
    
    private clsFutbol(){
    }
    
    public static clsFutbol getinstance(){
        if(instance == null)
            instance = new clsFutbol();
        return instance;
    }
    
    public void setEquipo(String gEquipo){
        equipo = gEquipo;
    }
    
    public String getEquipo(){
        return equipo;
    }
}

La clase clsFutbol va a permitir crear una instancia; si intentamos crear otro objeto, simplemente se vuelve a llamar a la instancia creada anteriormente.

2) Vamos a crear una clase para implementar la clase clsFutbol:

package equipofutbol;

/**
 *
 * @author Balam-PC
 */
public class EquipoFutbol {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        clsFutbol instancia1 = clsFutbol.getinstance();
        
        instancia1.setEquipo("Uruguay");
        System.out.println("Instancia 1: " + instancia1.getEquipo());
        
        clsFutbol instancia2 = clsFutbol.getinstance();
        System.out.println("Instancia 2: " + instancia2.getEquipo());
        
        clsFutbol instancia3 = clsFutbol.getinstance();
        System.out.println("Instancia 3: " + instancia3.getEquipo());
        
        clsFutbol instancia4 = clsFutbol.getinstance();
        System.out.println("Instancia 4: " + instancia4.getEquipo());
    }
}

Como podemos observar, creamos 4 instancias de la clase clsFutbol; sin embargo, en la primera instancia llenamos la clase con el parámetro Uruguay. Las siguientes instancias que se generen no se tratan de instancias diferentes, son la misma instancia; ejemplo de esto es que si imprimimos la variable donde almacenamos el equipo que configuramos en la primera instancia, este es el mismo para cada "objeto" que creamos posteriormente:

Fig. 1. Salida de ejecución de la clase EquipoFutbol.java


El patrón singleton se usa cuando queremos limitar las instancias de una clase a sólo una. Por ejemplo, cuando deseamos que una clase de conexión a una base de datos se tenga que instanciar una sola vez para evitar crear múltiples conexiones a la base de datos.

El ejemplo lo pueden descargar de los siguientes enlaces (desarrollado en NetBeans 7.4):

martes, 28 de abril de 2015

Acceder a "manager webapp" en Tomcat 7

En este vídeo explico cómo acceder al administrador de aplicaciones (manager webapp) de Tomcat 7. Las líneas que se deben agregar al archivo XML que menciono en el vídeo son las siguientes:

<role rolename="manager-gui"></role>
<user username="miusuario" password="mipassword" roles="manager-gui"></user>

jueves, 16 de abril de 2015

Máquina virtual en VirtualBox no inicia por problema con dll en Windows 8

Hoy 16 de Abril por la mañana reinicié mi computadora porque algunas actualizaciones se instalaron por la noche; al intentar iniciar una máquina virtual que tengo en VirtualBox, me mandaba un mensaje de error como el siguiente:

Figura 1. Mensaje de error 1 al intentar iniciar VM

Figura 2. Mensaje de error 2 al intentar iniciar VM

Después de investigar un poco, encontré en un foro que una actualización (de las que se instalaron anoche) en Windows 8 provocó ese error (todavía no saben si es culpa de oracle o de microsoft); sin embargo esa actualización no deja iniciar la máquina virtual de VirtualBox (ninguna). Para solucionar esto (mientras oracle corrige este asunto), será necesario eliminar la actualización que está causando conflicto con VirtualBox; la actualización a eliminar es: Actualización de seguridad para Microsoft Windows (KB3045999). Sólo tienen que entrar a panel de control>Programas y características>Actualizaciones instaladas y ya dentro, desinstalar la actualización mencionada:

Figura 3. Desinstalar la actualización KB3045999

Finalmente, después de desinstalar la actualización KB3045999 la máquina virtual inicia normalmente:

Figura 4. Máquina virtual iniciada correctamente



martes, 14 de abril de 2015

Instalación de PHP 5.2.6 sobre IIS 5.1 en Windows XP 32 bits

En esta ocasión quiero compartir un vídeo donde explico cómo instalar la versión 5.2.6 de PHP sobre el servidor de Microsoft IIS 5.1 en el sistema operativo Windows XP de 32 bits.

Para la instalación de IIS es necesario tener una copia de Windows XP; si no contaran con una, pueden descargar el iso en el siguiente link (o buscar uno en Google). Nota: Esta imagen ISO no la subí yo, es una que encontré en Internet "googleando".


También es necesario contar con un programa para montar imágenes (en caso de que utilicen una imagen ISO de Windows XP 32 bits):


Finalmente, es necesario tener una versión de PHP (source), la versión con la que trabajé (por compatibilidad) fue la 5.2.6, la pueden descargar del siguiente enlace a donde lo he subido:


Ahora sí, aquí está el vídeo y espero les pueda ser de utilidad. Saludos.

lunes, 6 de abril de 2015

Menú ASP.NET no funciona en Google Chrome

Hace unos días estaba desarrollando un sitio web en Visual Studio y me di cuenta que el menú no se veía correctamente en el explorador Chrome de Google, pero sí en Internet Explorer (qué novedad). Así que me di a la tarea de investigar el por qué del problema y rápidamente encontré una solución  (sacada del blog de Soluciones Informáticas Sierra) que me sirvió y fue fácil de implementar. A continuación se las comparto:

1. En el Explorador de Soluciones hacemos clic con el botón derecho sobre nuestro proyecto y añadimos una carpeta de ASP.NET con el nombre App_Browsers.

Fig. 1. Creación de una carpeta en el Explorador de Soluciones

Fig. 2. Carpeta App_Browsers creada

2. Añadimos, dentro de esta carpeta, un nuevo elemento del tipo Archivo de explorador (.browser) y lo llamamos safari.browser.

Fig. 3. Añadir un nuevo elemento a la carpeta App_Browsers

Fig. 4. Crear el elemento del tipo Archivo de Explorador con el nombre safari.browser

Fig. 5. Elemento safari.browser creado

3. Eliminamos TODO el código que se genera por defecto y pegamos lo siguiente:

<browsers>
<browser refID="safari1plus">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.Menu" adapterType="" />
</controlAdapters>
</browser>
</browsers>

Fig. 6. Código del elemento safari.browser

Con estos sencillos pasos deberíamos poder corregir el problema de visualización del menú ASP en Google Chrome. Espero les sirva. Un saludo.




martes, 3 de marzo de 2015

Proyecto contador de pasos para Android

En esta ocasión quiero compartir con ustedes un proyecto que me pareció más que interesante. Este proyecto está desarrollado para la plataforma Android, y yo lo he probado personalmente con la versión 4.1.2, con un Samgung S3 mini y ha funcionado correctamente.
El proyecto contador de pasos o pedometer, fue desarrollado por Levente Bagi y lo compartió con la comunidad a través de GitHub. Pueden descargar este proyecto desde GitHub en el siguiente enlace:


También he subido el proyecto al servidor de MEGA y de OneDrive por si quieren descargarlo; de todas formas no pesa mucho.


Para aquellos que tengan la última versión del ADT (v1.0) será necesaria la conversión; si por alguna razón la conversión resultara errónea aquí les dejo el proyecto ya convertido (sólo para la versión del ADT más nueva v1.0).


Este proyecto para la plataforma Android, cuenta los pasos que damos y mediante algunos cálculos, nos arroja también cuál es el número de millas, pasos por minuto, millas por hora y calorías quemadas que llevamos durante el tiempo que la aplicación se mantiene en ejecución. La licencia es de código abierto así que podemos hacer uso de este proyecto de forma libre. Espero les sirva esta aportación. Saludos.

Fig. 1. Contador de pasos