martes, 2 de junio de 2009

Postear Código Fuente en WORDPRESS

He estado buscando alguna forma de postear código de programas en mi blog de wordpress, me encontrado con muchas cosas, pero no me había percatado de que wordpress, trae incorporado ya un resaltador de código fuente, este se debe poner asi entre dos directivasen la parte visual:



[sourcecode language='java']...[/sourcecode]

Con estas nuestro código aparecerá como el que esta en la parte inferior de este post...

[sourcecode language='java']
       public static void main (String[] args){
             System.out.println("christmo");
       }
[/sourcecode]

Saludos

martes, 26 de mayo de 2009

CRUD de usuarios en el servidor LDAP + JAVA


En esta clase se va a realizar una clase completa para realizar una búsqueda, inserción, eliminación y modificación de los datos de los usuarios de un servidor LDAP desde el lenguaje de programación JAVA, al final de este post se pondrá el link para descargar el proyecto completo para que les quede como referencia de como es que yo lo hice, espero que les sirva, ojala puedan mejorar este código espero que lo compartan para poder ir aprendiendo todos...




[sourcecode language='java']
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPModification;
import com.novell.ldap.LDAPSearchResults;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author christian
*/

public class CRUD {
private Conexion conLDAP = new Conexion();
private LDAPConnection lc = new LDAPConnection();

/**
* Metodo paraañadir un nuevo usuario, la persona que realice esta
* transaccion debe tener los permisos para
* @param strUIDManager
* @param strPass
*/

public void Añadir(String strUIDManager, String strPass) {
try {
LDAPEntry usuario = Datos();
lc = conLDAP.ConexionManager(strUIDManager, strPass);
lc.add(usuario);
conLDAP.CerrarConLDAP(lc);
System.out.println("Usuario
Ingresado Correctamente...");
} catch(LDAPException ex) {
if (ex.getResultCode() == 68) {
System.err.println("ERROR:El Usuario ya se encuentra ingresado...");
}
Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
}
}

/**
* Datos del  usuario a ser Ingresado
* @return LDAPEntry
*/

public LDAPEntry Datos() {
LDAPAttributeSet setAtr = new LDAPAttributeSet();
setAtr.add(new LDAPAttribute("objectclass", new String("person")));
setAtr.add(new LDAPAttribute("objectclass", new String("organizationalPerson")));
setAtr.add(new LDAPAttribute("objectclass", new String("inetOrgPerson")));
setAtr.add(new LDAPAttribute("objectclass", new String("posixAccount")));
setAtr.add(new LDAPAttribute("objectclass", new String("top")));
setAtr.add(new LDAPAttribute("userpassword", new String("newpassword")));
//setAtr.add(new LDAPAttribute("uidnumber", new String("555")));
setAtr.add(new LDAPAttribute("givenname", new String("Jim")));
//setAtr.add(new LDAPAttribute("loginshell", new String("/dev/null")));
//setAtr.add(new LDAPAttribute("gecos", new String("arroyo carvache carlos")));
setAtr.add(new LDAPAttribute("gidNumber", new String("100")));
setAtr.add(new LDAPAttribute("sn", new String("Smith")));
setAtr.add(new LDAPAttribute("cn", new String("Jim Smith")));
setAtr.add(new LDAPAttribute("mail", new String("JSmith@Acme.com")));
//setAtr.add(new LDAPAttribute("homeDirectory", new String("/public/centros/carroyo")));
setAtr.add(new LDAPAttribute("telephonenumber", new String("1 801 555 1212")));
String dn = "uid=jsmith,ou=People,o=utpl,c=ec";
LDAPEntry newEntry = new LDAPEntry(dn, setAtr);
return newEntry;
}

/**
* Metodo para buscar un usuario dentro del servidor LDAP
* Filtro es el username a buscar
* @param LDAPConnection lc
* @param String strFiltro
*/

public void Buscar(String strUser, String strPass, String strFiltro) {
String filtro;
LDAPSearchResults searchResults;
String searchBase = "o=utpl,c=ec";
int searchScope = LDAPConnection.SCOPE_SUB;
filtro = "(uid=" + strFiltro + ")";
try {
lc = conLDAP.ConexionUser(strUser, strPass);
searchResults = lc.search(searchBase, searchScope, filtro, null, false);
//Recorre Todos los Usuarios de la Base
while (searchResults.hasMore()) {
LDAPEntry nextEntry = null;
try {
nextEntry = searchResults.next();
} catch (LDAPException e) {
System.out.println("Error: " + e.toString());
continue;
}
LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
Iterator allAttributes = attributeSet.iterator();
//Recore los atributos del usuario
while (allAttributes.hasNext()) {
LDAPAttribute attribute = (LDAPAttribute) allAttributes.next();
String attributeName = attribute.getName();
Enumeration allValues = attribute.getStringValues();
if (allValues != null) {
while (allValues.hasMoreElements()) {
String value = (String) allValues.nextElement();
System.out.println(attributeName + ": " + value);
}
}
}
System.err.println("------------------------------");
}
conLDAP.CerrarConLDAP(lc);
} catch (LDAPException ex) {
Logger.getLogger(Buscar.class.getName()).log(Level.SEVERE,null, ex);
}
}

/**
* Metodo Para Eliminar un usuario mandando como parametro el "uid"
* @param strUser
* @param strPass
* @param strUIDEliminar
*/

public void EliminarPorUID(String strUser, String strPass, String strUIDEliminar){
String dn = "uid="+ strUIDEliminar + ",ou=People,o=utpl,c=ec";
try {
lc = conLDAP.ConexionManager(strUser, strPass);
lc.delete(dn);
System.out.println("\nEntry: " + dn + " Fue Eliminado Correctamente...");
conLDAP.CerrarConLDAP(lc);
} catch (LDAPException e) {
if (e.getResultCode() == LDAPException.NO_SUCH_OBJECT) {
System.err.println("Error: NO existe ese usuario...");
} else if (e.getResultCode() == LDAPException.INSUFFICIENT_ACCESS_RIGHTS) {
System.err.println("Error: NO tiene permisos suficientes para realizar esta transaccion...");
} else {
System.err.println("Error: " + e.toString());
}
}
}

/**
* Enviar Usuario a Modificar
* @param strUser
* @param strAtributo
*/

public void Modificar(String strUser,String strAtributo) {
try {
LDAPAttribute atrubuto;
lc = conLDAP.ConexionManager("Manager", "ibmlnx");
atrubuto = new LDAPAttribute("mail", strAtributo);
String dn = "uid="+strUser+",ou=People,o=utpl,c=ec";
lc.modify(dn, new LDAPModification (LDAPModification.REPLACE, atrubuto));
System.out.println("Atributo Modificado OK...");
} catch (LDAPException ex) {
if (ex.getResultCode() == LDAPException.INSUFFICIENT_ACCESS_RIGHTS) {
System.err.println("Error: NO tiene permisos suficientes para realizar esta transaccion...");
}
}
}

public boolean ValidarPassWord(String strUser, String strPass) {
boolean correct = false;
String dnc = "uid=+" + strUser + ",ou=People,o=utpl,c=ec";
try {
lc.bind(LDAPConnection.LDAP_V3, dnc, strPass.getBytes("UTF8"));
LDAPAttribute attr = new LDAPAttribute("userPassword", strPass);
correct = lc.compare(dnc, attr);
System.err.println(correct ? "El Password es correcto" : "El Password NO es correcto.\n");
} catch (LDAPException ex) {
Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
}
return correct;
}
}

[/sourcecode]


Vea también:


Conexión al servidor LDAP desde JAVA


Busqueda de usuarios en el servidor LDAP



CRUD de usuarios en el servidor LDAP



Descargar Proyecto JAVA - Netbeans




Busqueda de Usuarios en el Servidor LDAP + JAVA


Continuando con el ejemplo anterior, una ves realizada la conexión en el servidor LDAP, desde nuestra clase java, vamos a probar una clase que nos permita realizar búsquedas de usuarios ingresados en este servidor.



Esta clase seria así:

[sourcecode language='java']

/*
* Clase para Buscar Usuarios el Filtro es el usuario que se desea buscar.
*/

package conexionldap;
import com.novell.ldap.*;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author christian
*/

public class Buscar {
private String searchBase = "o=utpl,c=ec";
private int searchScope = LDAPConnection.SCOPE_SUB;
private String filtro;
private LDAPSearchResults searchResults;

/**
* Metodo para buscar un usuario dentro del servidor LDAP
* @param LDAPConnection lc
* @param String strFiltro
*/

public Buscar(LDAPConnection lc, String strFiltro) {
filtro = "(uid="+ strFiltro + ")";
try {
searchResults = lc.search(searchBase, searchScope, filtro, null, false);
//Recorre Todos los Usuarios de la Base
while (searchResults.hasMore()) {
LDAPEntry nextEntry = null;
try {
nextEntry = searchResults.next();
} catch (LDAPException e) {
System.out.println("Error: " + e.toString());
continue;
}
LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
Iterator allAttributes = attributeSet.iterator();
//Recore los atributos del usuario
while (allAttributes.hasNext()) {
LDAPAttribute attribute = (LDAPAttribute) allAttributes.next();
String attributeName = attribute.getName();
Enumeration allValues = attribute.getStringValues();
if (allValues != null) {
while (allValues.hasMoreElements()) {
String value = (String) allValues.nextElement();
System.out.println(attributeName + ": " + value);
}
}
}
System.out.println("------------------------------");
lc.disconnect();
}
} catch (LDAPException ex) {
Logger.getLogger(Buscar.class.getName()).log(Level.SEVERE,null, ex);
}
}
}

[/sourcecode]


Vea también:


Conexión al servidor LDAP desde JAVA


Busqueda de usuarios en el servidor LDAP



CRUD de usuarios en el servidor LDAP




Descargar Proyecto JAVA - Netbeans

Despertadores en Ubuntu!!!


Son muchas las personas que utilizan el ordenador en su dormitorio la mayor parte del día y lo dejan encendido por la noche descargando cosas. Por tanto no es descabellado pensar que lo podemos utilizar como despertador para levantarnos por las mañanas. A continuación os presento una serie de aplicaciones que pueden servirnos como para este propósito.


El comando sleep


El comando sleep permite que un comando se ejecute transcurrido cierto tiempo, por lo que podemos utilizarlo para lanzar, por ejemplo, nuestro reproductor de música favorito en el momento que le indiquemos. Si abrimos la consola (Aplicaciones/Accesorios/Terminal) y escribimos, por ejemplo:




  • sleep 7h50m30s; vlc /home/Música/sonido.mp3


se abrirá el reproductor vlc transcurridos 7 horas, 50 minutos y 30 segundos, y reproducirá el archivo que le hemos pasado como parámetro (/home/Música/sonido.mp3)


Por supuesto en lugar de vlc podemos ejecutar cualquier otro reproductor que tengamos instalado.




Alarm Clock


Alarm Clock es una aplicación que permite organizar nuestras tareas de forma muy sencilla y crear alarmas con recordatorios de distintas cosas que tengamos que hacer a lo largo del día. Podemos instalar Alarm Clock abriendo la consola y escribiendo:




  • sudo apt-get install alarm-clock


Una vez instalado lo encontraremos en Aplicaciones/Accesorios/Alarm Clock

Para crear nuestro despertador tenemos que pulsar sobre el botón Añadir en la ventana principal y seleccionar “Crear nueva alarma”. En la siguiente ventana especificamos el nombre de la alarma y la hora en la que se ejecutará.


En la pestaña Notificación seleccionamos Reproducir sonido en evento y pulsamos después sobre Preferencias. En la siguiente ventana marcamos Usar archivo de sonido personalizado y seleccionamos el archivo de audio que sonará cada vez que se dispare la alarma.


Alarm Clock también permite ejecutar un comando o aplicación cada vez que se active una alarma, por lo que podemos utilizarlo para abrir nuestro reproductor de música favorito al despertarnos


KAlarm


KAlarm es otra de las aplicaciones que podemos utilizar para crear nuestro propio despertador. Está diseñada para el entorno de escritorio KDE, pero puede instalarse fácilmente en Gnome abriendo la consola y escribiendo:




  • sudo apt-get install kalarm

Timer-applet


Timer-applet es un pequeño applet que se adhiere al panel de Gnome y permite mostrar avisos y crear alarmas que se disparen en el momento que indiquemos.


Para instalar Timer-applet abrimos la consola y escribimos:




  • sudo apt-get install timer-applet


Para añadir timer-applet al panel hacemos clic con el botón derecho sobre el panel y seleccionamos Añadir al panel. A continuación seleccionamos Temporizador en la ventana que aparece.



Veremos entonces que aparece el applet sobre nuestro panel.Para crear una alarma tan sólo hacemos clic sobre el applet y saldrá lo siguiente.


Timer-applet funciona mediante cuenta atrás, por lo que debemos poner que nos avise en X horas, Y minutos y Z segundos. A continuación pulsamos sobre el botón Start Timer, hacemos clic con el botón derecho sobre el applet y seleccionamos Preferencias. En la ventana que aparece marcamos Use custom sound y seleccionamos el archivo de audio que queramos que se reproduzca, que puede ser un archivo mp3.

Visto en: http://www.alejandrox.com

Conexión a Servidor LDAP desde JAVA


Hola en en trabajo me pidieron realizar una conexión a un servidor LDAP desde una aplicación java, esto me pareció algo difícil en un principio ya que no tenía idea de como realizar algo parecido, con algunas sugerencias de parte de mi jefe decidimos usar la librería de novell para java jLDAP, esta librería es muy completa y permite realizar todas las posibles transacciones dentro de un servidor LDAP, novell también tiene bien documentado esto hasta con ejemplos todo el API esta aquí, una ves que te familiarizas con el código vas a ver que todo es muy fácil, pero es esta serie de posts vamos a ejemplificar como se podría hacer un CRUD dentro de nuestro servidor.



Para realizar la conexión aremos lo siguiente:

[sourcecode language='java']

/*
* Clase de Conexion Servidor LDAP
*/

package conexionldap;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author christian
*/

public class Conexion {

private int ldapPort;
private int ldapVersion;
private LDAPConnection lc;
private String login;
private String ldapHost = "172.16.30.162";

public Conexion() {
}

/**
* Este método permite realizar la conexión al servidor de LDAP
* Para el usuario manager
* @param strManager
* @param strPassword
*/

public LDAPConnection ConexionManager(String strManager, String strPassword) {
login = "cn=" + strManager + ",o=utpl,c=ec";
System.out.println("" + login);
ldapPort = LDAPConnection.DEFAULT_PORT;
System.out.println("puerto: " + ldapPort);
ldapVersion = LDAPConnection.LDAP_V3;
System.out.println("Vesion: " + ldapVersion);
System.out.println("HOST: " + ldapHost);
try {
lc = new LDAPConnection();
lc.connect(ldapHost, ldapPort);
System.out.println("====Conectado al Servidor LDAP====");
lc.bind(ldapVersion, login, strPassword.getBytes("UTF8"));
System.out.println("Autenticado en el servidor....");
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
} catch (LDAPException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
}
return lc;
}

/**
* Este metodo permite realizar la conexion al servidor de LDAP
* Para el usuario manager
* @param strUser
* @param strPassword
*/

public LDAPConnection ConexionUser(String strUser, String strPassword) {
login = "uid=" + strUser + ",ou=People,o=utpl,c=ec";
System.out.println("" + login);
ldapPort = LDAPConnection.DEFAULT_PORT;
System.out.println("puerto: " + ldapPort);
ldapVersion = LDAPConnection.LDAP_V3;
System.out.println("Vesion: " + ldapVersion);
System.out.println("HOST: " + ldapHost);
try {
lc = new LDAPConnection();
lc.connect(ldapHost, ldapPort);
System.out.println("====Conectado al Servidor LDAP====");
lc.bind(ldapVersion, login, strPassword.getBytes("UTF8"));
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
} catch (LDAPException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
}
return lc;
}

public void CerrarConLDAP(LDAPConnection lc) {
try {
lc.disconnect();
System.out.println("Conexion Cerrada Correctamente...");
} catch (LDAPException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
}

}

}

[/sourcecode]


Continuar:


Busqueda de usuarios en el servidor LDAP


CRUD de usuarios en el servidor LDAP




Descargar Proyecto JAVA - Netbeans


viernes, 15 de mayo de 2009

La vida de un informático!!!

A más de uno nos pasa esto, ya debemos estar acostumbrandonos...

[youtube=http://www.youtube.com/watch?v=mo5aA8cpeX8&hl=es&fs=1]

Esta muy bueno saludos!!!

La vida de un informático!!!

A más de uno nos pasa esto, ya debemos estar acostumbrandonos...



Esta muy bueno saludos!!!

martes, 7 de abril de 2009

Levantar Glassfish por consola en UBUNTU

Vamos ha ver como se hace para levantar un proyecto web, en el servidor de aplicaciones Glassfish desde la consola, regularmente como desarrolladores nos hemos encontrado con paquetes *.war, los cuales son el empaquetado de toda la aplicación web lista para funcionar, cuando instalamos netbeans también se instala glassfish pero a veces es demasiado pesado arrancar primero el IDE y después levantar el servidor de aplicaciones, para se cuenta con uno practico comando para solo levantar el servidor.

Debemos ir primero a la carpeta donde tenemos instalado glassfish y a bin, algunos lo podemos tener instalado por defecto en esta ruta:

$ cd glassfish-v2ur2/bin/

o

$ cd /usr/local/glassfish/bin/

Allí ponemos:

$ ./asadmin start-domain domain1

y esperamos un momento y ya está:

Ahora solo nos toca abrir un navegador y poner:

http://localhost:4848/

para entrar a la interfaz de administración de glassfish recuerda que cuando se instaló netbeans nos pidió un user y un password allí van, por defecto son "user: admin" y "password: adminadmin", desde allí ya podremos gestionar todos los proyectos *.war que tengamos.

Para detener Glassfish pondremos los mismo solo que con la palabra stop:

$ ./asadmin stop-domain domain1

Eso es todo, por cierto este mismo comando lo podemos usar en Window$ solo debemos ponerlo en la consola dentro de la carpeta bin de glassfish de archivos de programa, espero que les sirva tanto como a mi.

Saludos...

christmo

lunes, 5 de enero de 2009

Montar archivos ISO, BIN, CUE, MDF, NRG, IMG y DAA en Linux

E copiado este post a mi blog, porque lo necesito y como tengo muy mala memoria preferí tenerlo a la mano... saludos!!!!

Linux tiene la posibilidad de montar las imágenes de cd/dvd sin tener que grabarlas. Asumiremos que usas una distribución que usa “apt” para instalar y actualizar paquetes, este es el caso de debian, ubuntu, suse,etc. Asumiremos también que sabes como crear directorios y que sabes qué es “montar” un sistema de ficheros. Vamos al grano.

Con unos cuantos comandos de consola podremos montar distintos tipos de imágenes de CD/DVD fácilmente:

Lo más básico, montar una imagen ISO:
sudo mount -t iso9660 -o loop archivo.iso /directorio/de/montaje

Montando imágenes BIN y CUE:

Para poder montar estos archivos necesitas convertirlos antes a imagen ISO, esto lo puedes hacer con el programa bchunk.

(Si no tienes instalado bchunk)
sudo apt-get install bchunk

(nota: si así no puedes instalarlo puede encontrar el programa aquí: bchunk)

y cuando se haya instalado procederemos a convertir la imagen bin con su archivo cue correspondiente a un solo archivo iso:
bchunk archivo.bin archivo.cue nuevonombre.iso

Ahora ya tendrás un nuevo archivo iso que podrás montar como se explica más arriba.

Montar imágenes NRG (imágenes de Nero Burning Rom):

Las imagenes NRG pueden ser montadas directamente sin necesidad de convertirlas:
mount -t iso9660 -o loop,offset=307200 imagen.nrg /directorio/de/montaje

(gracias Tux)

Si tienes algún problema con ese método o deseas convertir la imagen NRG a ISO deberás usar el programa nrg2iso, para instalarlo haremos:
sudo apt-get install nrg2iso

(nota: si así no puedes instalarlo puede encontrar el programa aquí: Nrg2Iso)
y cuando ya esté instalado, para convertir la imagen:
nrg2iso archivo.nrg nuevoarchivo.iso

y para montar la imagen ISO simplemente debes seguir las instrucciones detalladas más arriba.

Montar imágenes MDF y MDS


De nuevo utilizaremos un programa para convertir antes la imagen mdf a iso. El programa tiene el original nombre de mdf2iso. Para instalarlo:
sudo apt-get install mdf2iso

(nota: si así no puedes instalarlo puede encontrar el programa aquí: Mdf2Iso)
y una vez instalado convertiremos el archivo MDF a ISO:
mdf2iso archivo.mdf nuevaimagen.iso

Montar imágenes IMG

Usaremos el programa CCD2ISO. Este programa no lo he podido descargar desde los repositorios oficiales de Ubuntu pero de todos modos no estaría de más que intentases instalarlo por apt-get así:
sudo apt-get install ccd2iso

Si de este modo no puedes instalarlo puedes seguir las instrucciones de esta página para bajar el paquete deb de ccd2iso e instalarlo facilmente.

Si por cualquier motivo no pudieses conseguir el programa por esos dos métodos siempre puedes descargarlo desde su página: Ccd2Iso (ojo, tendrás que compilarlo)

Para instalarlo de este último modo descargamos el archivo que sera algo así como “ccd2iso-0.2.tar.gz” (puede variar la versión) y primero lo descomprimimos así:
tar -xzvf ccd2iso-0.2.tar.gz

Ahora que tendremos una carpeta llamada “ccd2iso”, hacemos lo siguiente:
cd ccd2iso

./configure

make
make install

Con esto ya tendremos instalado el programa ccd2iso. Finalmente para convertir la imagen ccd a iso hacemos:
ccd2iso imagen.img imagen.iso

Y montaremos la imagen iso recien creada como se explica más arriba en esta misma guía.

Montar imágenes DAA

El formato DAA es un formato que utiliza el programa Poweriso. Durante algún tiempo este formato resultaba muy dificil de utilizar en Linux (no había versión de Poweriso para linux y la emulación con wine no funcionaba). Finalmente los creadores del programa sacaron una versión gratuita de su programa para Linux que además nos sirve para convertir otros formatos.

Pero vamos al grano, para convertir una imagen DAA a ISO primero necesitaremos la versión linux de poweriso que podemos bajar desde esta página (parte de abajo) o bien de esta forma :
wget http://poweriso.com/poweriso.tar.gz

Descomprimimos:
tar -zxvf poweriso.tar.gz

Y convertimos a ISO:
./poweriso convert imagen.daa -o nuevaimagen.iso

(Instrucciones para montar la imagen iso, al principio de esta guía)

viernes, 15 de agosto de 2008

Leer un archivo properties desde un proyecto web + JSF

Hola en este post voy a mostrar como se debe hacer para leer un archivo *.properties de java, puesto dentro de un proyecto web JSF, es interesante mencionar que la forma de llamar a estos archivos difiere un poco de como se lo hace comúnmente en un proyecto swing de escritorio común y corriente,  ya que en este solo se pone el path relativo desde el pack del proyecto y ya, pero en un proyecto web no funciona así, por eso he decidido mostrarlo a continuación, esta es la forma que descubrí para hacerlo y me funcionó, pero si existe una forma mejor o más optima de realizarlo res ruego comentarlo para así aprender todos algo más.


Dentro de nuestro proyecto web se nos crean comunmente las páginas jsp, y su contraparte en código java dentro de un paquete en la carpeta Source Packages, dentro de ese paquete vamos a colocar el archivo .properties, teniendo en cuenta que este se va a llamar igual que la clase que lo va a leer, (por ejemplo: En mi paquete tengo una clase llamada Reportes.java, dentro del mismo paquete pondré un archivo de propiedades llamado reportes.properties), el código para ller este archivo quedaria así:



[sourcecode language='java']
String nombrePROP = Reportes.class.getSimpleName().toLowerCase() + ".properties";
Properties props = new Properties();
props.load(Reportes.class.getResourceAsStream(nombrePROP));
String strPathOrigen = props.getProperty("pathORI");
String strPathXLS = props.getProperty("pathXLS");
[/sourcecode]


Con esto ya podriamos leer las propiesades que se tenga dentro de nuestro archivo properties.


Ahora para poder poner las propiedades sacadas del archivos en variables globales, tendremos que hacer lo siguiente, fuera de cualquier método y dentro de la clase vamos a poner esto, como un método más.



[sourcecode language='java']
private static String strPathOrigen;
private static String strPathXLS;

static {
try {
String nombrePROP = Reportes.class.getSimpleName().toLowerCase() + ".properties";
Properties props = new Properties();
props.load(Reportes.class.getResourceAsStream(nombrePROP));
strPathOrigen = props.getProperty("pathORI");
strPathXLS = props.getProperty("pathXLS");
} catch (IOException ex) {
Logger.getLogger(Reportes.class.getName()).log(Level.SEVERE, null, ex);
}
}
[/sourcecode]

Así todo lo que se saque del archivo properties se almacenará globalmente y se podrá usar dentro de toda la clase si es necesario.


Espero que les haya servido...


Saludos christmo...

Descargar un archivo .XLS o .PDF con JSF

Hola había tenido problemas al tratar de descargar un archivo desde el servidor, para que sea visualizado en los computadores clientes del sistema usando JSF, pero buscando un poco por allí pude encontrar como hacerlo, este método sirve para descargar archivos *.XLS y *.PDF con los que he probado, pero me imagino que debe funcionar para cualquier tipo de archivo, lo importante es reconocer que MIME Type tiene este archivo eso lo podremos encontrar en esta página.



File ficheroXLS = new File(strPathXLS);
FacesContext ctx = FacesContext.getCurrentInstance();
FileInputStream fis = new FileInputStream(ficheroXLS);
byte[] bytes = new byte[1000];
int read = 0;

if (!ctx.getResponseComplete()) {
String fileName = ficheroXLS.getName();
String contentType = "application/vnd.ms-excel";
//String contentType = "application/pdf";
HttpServletResponse response =
(HttpServletResponse) ctx.getExternalContext().getResponse();

response.setContentType(contentType);

response.setHeader("Content-Disposition",
"attachment;filename=\"" + fileName + "\"");

ServletOutputStream out = response.getOutputStream();

while ((read = fis.read(bytes)) != -1) {
out.write(bytes, 0, read);
}

out.flush();
out.close();
System.out.println("\nDescargado\n");
ctx.responseComplete();
}


Saludos y espero que sea de utilidad para ustedes...

martes, 29 de julio de 2008

CLIENTE DE GOOGLE MAPS PARA LOS CENTROS DE LA UTPL UTILIZANDO REST, MYSQL Y NETBEANS 6.1

REST Y APLICACIONES WEB LIGERAS!...

La Transferencia de Estado Representacional (REST),  es una técnica de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web, en la actualidad se utiliza para describir cualquier interfaz web simple que utiliza XML y HTTP.




[caption id="" align="aligncenter" width="485" caption="Transacciones REST"]Tranzacciones REST[/caption]

Un concepto importante en REST es la existencia de recursos que pueden ser accedidos utilizando un Identificador Uniforme de Recurso (URI).  Para manipular estos recursos, los componentes de la red (clientes y servidores) se comunican a través de un interfaz estándar (HTTP) e intercambian representaciones de estos recursos (los ficheros que se descargan y se envían).


La petición puede ser tramitada por cualquier número de conectores (por ejemplo clientes, servidores, cachés, túneles, etc.) pero cada uno lo hace sin "ver más allá" de su propia petición (lo que se conoce como separación en capas, otra restricción de REST, que es un principio común con muchas otras partes de la arquitectura de redes y de la información). Así, una aplicación puede interactuar con un recurso conociendo por la URI y la acción requerida, no necesitando conocer si existen cachés, proxys, cortafuegos, túneles o cualquier otra cosa entre ella y el servidor que guarda la información. La aplicación, sin embargo, debe comprender el formato de la información devuelta (la representación), que es por lo general un documento HTML o XML, aunque también puede ser una imagen o cualquier otro contenido.


Mediante XML, nuestra aplicación hace el consumo del servicio del servidor de Google Maps , se le envía algunos parámetros y el servidor GOOGLE nos devolverá el respectivo mapa ubicando el lugar que se desea localizar.


Ahora que ya tenemos una ligera idea de lo que es REST, vamos ha detallar el proyecto que hemos realizado con esta tecnología:


El proyecto que se ha desarrollado hace uso de varias tecnologías y herramientas que están siendo utilizadas actualmente para el desarrollo de aplicaciones Web, grandes empresas han hecho uso de ellas teniendo un gran éxito en Internet tales como: eBay, Amazon.com, Yahoo, y muchas más; es por ello que hemos creído conveniente emplearlas en nuestro proyecto, el cual será de mucha importancia para nuestro desarrollo intelectual con lo cual nos hemos introducido en el manejo de herramientas Web 2.0. La elaboración de éste proyecto lo hemos conseguido utilizando el servicio de Google Maps, para obtener a partir del: país, provincia y cantón, la ubicación correspondiente a la ciudad en donde se encuentra ubicado cada centro universitario de la UTPL en todo el mundo, la información de cada uno de estos centros, se tiene almacenada en una base de datos elaborada en MySQL, de la cual se extraen los datos para complementarse con la ubicación en el mapa y poder dar una información correspondiente y adecuada de cada centro.



Las herramientas empleadas en el proyecto son:

Netbeans 6.1: en éste IDE, ya viene integrado el plugin para el trabajo con REST, pero es necesario actualizarla, ya que es una versión anterior la que viene integrada de la que se trabajó, en el primer vídeo se muestra como hacer esto.



MySql 5.0: se deberá cargar el scrip con los datos proporcionados en este proyecto para el optimo funcionamiento de la aplicación, en el primer vídeo se muestra como realizar esta operación .

Experiencias Comentarios y Problemas:

Es necesario que trabajen con la versión actualizada del REST (versión 0.7) en Netbeans, por lo que podrían tener problemas al realizar la conexión con el Google Maps, ya que podría cambiar la forma de realizar la conexión al trabajar con la versión anterior.


Es interesante trabajar con este tipo de aplicaciones, ya que con las herramientas que se cuenta actualmente se facilita mucho el trabajo en el desarrollo de éstas.


Vídeo demostrativo, se explica a detalle los pasos para hacer funcionar la aplicación correctamente, también se hace un análisis a a breves rasgos del contenido del proyecto para el uso de REST con nuestro proyecto de Netbeans, también se explica la elaboración del cliente y unión con el proyecto que hace de servidor de recursos mediante los Stubs de Netbeans.


[vimeo 1433197]


Este Video se muestra en si el resultado de todo el proyecto, la aplicación 100% funcional.


[vimeo 1433170]


Aquí tienes las fuentes de consulta utilizadas para hacer este proyecto: http://del.icio.us/christmo/rest


Download Código fuente de la aplicación:



Google Maps Centros UTPL



martes, 22 de julio de 2008

Gráficos para variables cualitativas

Los gráficos más usuales para representar variables de tipo nominal son los siguientes:

Diagramas de barras:
Siguiendo la figura 1.1, representamos en el eje de ordenadas las modalidades y en abscisas las frecuencias absolutas o bien, las frecuencias relativas. Si, mediante el gráfico, se intenta comparar varias poblaciones entre sí, existen otras modalidades, como las mostradas en la figura 1.2. Cuando los tamaños de las dos poblaciones son diferentes, es conveniente utilizar las frecuencias relativas, ya que en otro caso podrían resultar engañosas.


Figura: Diagrama de barras para una variable cualitativa.
\includegraphics[angle=0, width=0.5\textwidth]{fig01-01.eps}


Figura: Diagramas de barras para comparar una variable cualitativa en diferentes poblaciones. Se ha de tener en cuenta que la altura de cada barra es proporcional al número de observaciones (frecuencias relativas).
\includegraphics[angle=-90, width=0.5\textwidth]{fig01-02.eps}

Diagramas de sectores
(también llamados tartas). Se divide un círculo en tantas porciones como clases existan, de modo que a cada clase le corresponde un arco de círculo proporcional a su frecuencia absoluta o relativa (figura 1.3).


Figura: Diagrama de sectores.
\includegraphics[angle=-90, width=0.6\textwidth]{fig01-03.epsi}

El arco de cada porción se calcula usando la regla de tres:

\begin{eqnarray}\html{eqn1}n & \longrightarrow & 360^{\circ} \nonumber \\ n_i & \longrightarrow &x_i = \frac{360 \cdot n_i}{n} \nonumber \end{eqnarray}


Como en la situación anterior, puede interesar comparar dos poblaciones. En este caso también es aconsejable el uso de las frecuencias relativas (porcentajes) de ambas sobre gráficos como los anteriores. Otra posibilidad es comparar las 2 poblaciones usando para cada una de ellas un diagrama semicircular, al igual que en la figura 1.4. Sean $n_1 \leq n_2$ los tamaños respectivos de las 2 poblaciones. La población más pequeña se representa con un semicírculo de radio r1y la mayor con otro de radio r2. La relación existente entre los radios, es la que se obtiene de suponer que la relación entre las areas de las circunferencias es igual a la de los tamaños de las poblaciones respectivas, es decir:


\begin{displaymath}\frac{r_2^2}{r_1^2} = \frac{n_2}{n_1} \Longleftrightarrow r_2 = r_1 \cdot \sqrt{\frac{n_2}{n_1}} \end{displaymath}


Figura: Diagrama de sectores para comparar dos poblaciones
\includegraphics[angle=-90, width=0.6\textwidth]{fig01-04.epsi}

Pictogramas
Expresan con dibujos alusivo al tema de estudio las frecuencias de las modalidades de la variable. Estos gráficos se hacen representado a diferentes escalas un mismo dibujo, como vemos en la figura 1.5.


Figura: Pictograma. Las áreas son proporcionales a las frecuencias.
\includegraphics[angle=0, width=0.5\textwidth]{fig01-05.eps}

El escalamiento de los dibujos debe ser tal que el área1.1 de cada uno de ellos sea proporcional a la frecuencia de la modalidad que representa. Este tipo de gráficos suele usarse en los medios de comunicación, para que sean comprendidos por el público no especializado, sin que sea necesaria una explicación compleja.

Gráficos para variables cualitativas

Los gráficos más usuales para representar variables de tipo nominal son los siguientes:

Diagramas de barras:
Siguiendo la figura 1.1, representamos en el eje de ordenadas las modalidades y en abscisas las frecuencias absolutas o bien, las frecuencias relativas. Si, mediante el gráfico, se intenta comparar varias poblaciones entre sí, existen otras modalidades, como las mostradas en la figura 1.2. Cuando los tamaños de las dos poblaciones son diferentes, es conveniente utilizar las frecuencias relativas, ya que en otro caso podrían resultar engañosas.


Figura: Diagrama de barras para una variable cualitativa.
\includegraphics[angle=0, width=0.5\textwidth]{fig01-01.eps}


Figura: Diagramas de barras para comparar una variable cualitativa en diferentes poblaciones. Se ha de tener en cuenta que la altura de cada barra es proporcional al número de observaciones (frecuencias relativas).
\includegraphics[angle=-90, width=0.5\textwidth]{fig01-02.eps}

Diagramas de sectores
(también llamados tartas). Se divide un círculo en tantas porciones como clases existan, de modo que a cada clase le corresponde un arco de círculo proporcional a su frecuencia absoluta o relativa (figura 1.3).


Figura: Diagrama de sectores.
\includegraphics[angle=-90, width=0.6\textwidth]{fig01-03.epsi}

El arco de cada porción se calcula usando la regla de tres:

\begin{eqnarray}\html{eqn1}n & \longrightarrow & 360^{\circ} \nonumber \\ n_i & \longrightarrow &x_i = \frac{360 \cdot n_i}{n} \nonumber \end{eqnarray}


Como en la situación anterior, puede interesar comparar dos poblaciones. En este caso también es aconsejable el uso de las frecuencias relativas (porcentajes) de ambas sobre gráficos como los anteriores. Otra posibilidad es comparar las 2 poblaciones usando para cada una de ellas un diagrama semicircular, al igual que en la figura 1.4. Sean $n_1 \leq n_2$ los tamaños respectivos de las 2 poblaciones. La población más pequeña se representa con un semicírculo de radio r1y la mayor con otro de radio r2. La relación existente entre los radios, es la que se obtiene de suponer que la relación entre las areas de las circunferencias es igual a la de los tamaños de las poblaciones respectivas, es decir:


\begin{displaymath}\frac{r_2^2}{r_1^2} = \frac{n_2}{n_1} \Longleftrightarrow r_2 = r_1 \cdot \sqrt{\frac{n_2}{n_1}} \end{displaymath}


Figura: Diagrama de sectores para comparar dos poblaciones
\includegraphics[angle=-90, width=0.6\textwidth]{fig01-04.epsi}

Pictogramas
Expresan con dibujos alusivo al tema de estudio las frecuencias de las modalidades de la variable. Estos gráficos se hacen representado a diferentes escalas un mismo dibujo, como vemos en la figura 1.5.


Figura: Pictograma. Las áreas son proporcionales a las frecuencias.
\includegraphics[angle=0, width=0.5\textwidth]{fig01-05.eps}

El escalamiento de los dibujos debe ser tal que el área1.1 de cada uno de ellos sea proporcional a la frecuencia de la modalidad que representa. Este tipo de gráficos suele usarse en los medios de comunicación, para que sean comprendidos por el público no especializado, sin que sea necesaria una explicación compleja.

¿Qué es la estadística?

Cuando coloquialmente se habla de estadística, se suele pensar en una relación de datos numéricos presentada de forma ordenada y sistemática. Esta idea es la consecuencia del concepto popular que existe sobre el término y que cada vez está más extendido debido a la influencia de nuestro entorno, ya que hoy día es casi imposible que cualquier medio de difusión, periódico, radio, televisión, etc, no nos aborde diariamente con cualquier tipo de información estadística sobre accidentes de tráfico, índices de crecimiento de población, turismo, tendencias políticas, etc.

Sólo cuando nos adentramos en un mundo más específico como es el campo de la investigación de las Ciencias Sociales: Medicina, Biología, Psicología, ... empezamos a percibir que la Estadística no sólo es algo más, sino que se convierte en la única herramienta que, hoy por hoy, permite dar luz y obtener resultados, y por tanto beneficios, en cualquier tipo de estudio, cuyos movimientos y relaciones, por su variabilidad intrínseca, no puedan ser abordadas desde la perspectiva de las leyes determistas. Podríamos, desde un punto de vista más amplio, definir la estadística como la ciencia que estudia cómo debe emplearse la información y cómo dar una guía de acción en situaciones prácticas que entrañan incertidumbre.



La Estadística se ocupa de los métodos y procedimientos para recoger, clasificar, resumir, hallar regularidades y analizar los datos, siempre y cuando la variabilidad e incertidumbre sea una causa intrínseca de los mismos; así como de realizar inferencias a partir de ellos, con la finalidad de ayudar a la toma de decisiones y en su caso formular predicciones.


Podríamos por tanto clasificar la Estadística en descriptiva, cuando los resultados del análisis no pretenden ir más allá del conjunto de datos, e inferencial cuando el objetivo del estudio es derivar las conclusiones obtenidas a un conjunto de datos más amplio.



Estadística descriptiva: Describe, analiza y representa un grupo de datos utilizando métodos numéricos y gráficos que resumen y presentan la información contenida en ellos.

Estadística inferencial: Apoyándose en el cálculo de probabilidades y a partir de datos muestrales, efectúa estimaciones, decisiones, predicciones u otras generalizaciones sobre un conjunto mayor de datos.

¿Qué es la estadística?

Cuando coloquialmente se habla de estadística, se suele pensar en una relación de datos numéricos presentada de forma ordenada y sistemática. Esta idea es la consecuencia del concepto popular que existe sobre el término y que cada vez está más extendido debido a la influencia de nuestro entorno, ya que hoy día es casi imposible que cualquier medio de difusión, periódico, radio, televisión, etc, no nos aborde diariamente con cualquier tipo de información estadística sobre accidentes de tráfico, índices de crecimiento de población, turismo, tendencias políticas, etc.

Sólo cuando nos adentramos en un mundo más específico como es el campo de la investigación de las Ciencias Sociales: Medicina, Biología, Psicología, ... empezamos a percibir que la Estadística no sólo es algo más, sino que se convierte en la única herramienta que, hoy por hoy, permite dar luz y obtener resultados, y por tanto beneficios, en cualquier tipo de estudio, cuyos movimientos y relaciones, por su variabilidad intrínseca, no puedan ser abordadas desde la perspectiva de las leyes determistas. Podríamos, desde un punto de vista más amplio, definir la estadística como la ciencia que estudia cómo debe emplearse la información y cómo dar una guía de acción en situaciones prácticas que entrañan incertidumbre.



La Estadística se ocupa de los métodos y procedimientos para recoger, clasificar, resumir, hallar regularidades y analizar los datos, siempre y cuando la variabilidad e incertidumbre sea una causa intrínseca de los mismos; así como de realizar inferencias a partir de ellos, con la finalidad de ayudar a la toma de decisiones y en su caso formular predicciones.


Podríamos por tanto clasificar la Estadística en descriptiva, cuando los resultados del análisis no pretenden ir más allá del conjunto de datos, e inferencial cuando el objetivo del estudio es derivar las conclusiones obtenidas a un conjunto de datos más amplio.



Estadística descriptiva: Describe, analiza y representa un grupo de datos utilizando métodos numéricos y gráficos que resumen y presentan la información contenida en ellos.

Estadística inferencial: Apoyándose en el cálculo de probabilidades y a partir de datos muestrales, efectúa estimaciones, decisiones, predicciones u otras generalizaciones sobre un conjunto mayor de datos.

miércoles, 16 de julio de 2008

CODA File Systems

Coda es un sistema de ficheros distribuido, desarrollado en la Universidad Carnegie Mellon. Coda está basado en una arquitectura cliente/servidor, y ha sido diseñado para proporcionar funcionalidades no existentes en otros sistemas de ficheros distribuidos – por ejemplo NFS – como es el soporte para la movilidad de los clientes.


Las características principales de Coda (según describen los propios desarrolladores) son:





  • Permite operar a los clientes offline, esto es, desconectados del sistema, de manera que pueden realizar cambios locales en los ficheros que se propagan a todo el sistema de ficheros una vez que el cliente en cuestión se reconecta al mismo.



  • Facilita características para mejorar la resistencia a fallos en el sistema, mediante la posibilidad de incluir servidores con réplicas de los datos del sistema, y mecanismos para manejar conflictos entre servidores, para manejar fallos en la red, y para controlar la desconexión de los clientes y los posibles conflictos e inconsistencias que ello puede acarrear. También incorpora mecanismos de backup de los datos del sistema.



  • Proporciona mejoras en el rendimiento, con respecto a otros sistemas de ficheros distribuidos, mediante la utilización de caches locales en los clientes y para la escritura de datos en los servidores.



  • Incorpora características de seguridad basadas fundamentalmente en la autenticación de usuarios, mediante la utilización de listas de control de acceso (ACL’s).



  • El código está disponible de forma libre.


De esta forma, el objetivo principal perseguido con Coda es obtener un sistema de ficheros distribuido con un rendimiento mejorado, menos sensible a posibles indisponibilidades en los servidores o a sobrecargas de la red. Relacionada con esta meta está la provisión de cierto grado de movilidad a los clientes del sistema.


Actualmente existen versiones de Coda para diferentes variantes de Unix (incluido Linux Debian y RedHat) y Windows 95/98 y XP.


Video demostrativo de Configuración de CODA en Ubuntu 8.04


[vimeo 1433271]

martes, 15 de julio de 2008

Conocimiento tácito y explícito



[caption id="attachment_51" align="aligncenter" width="300" caption="Conocimiento"]Conocimiento[/caption]

Hay que analizar los conceptos de conocimiento tácito y Explicito, para así poder asimilar de mejor manera las combinaciones que se pueden dar por medio de estos concepto.


Conocimiento Tácito.- Es aquel que permanece en un nivel “inconsciente”, se encuentra desarticulado y lo implementamos y ejecutamos de una manera mecánica sin darnos cuenta de su contenido, es algo que sabemos pero que nos resulta muy difícil explicarlo.


Conocimiento Explícito.- Es el que sabemos, tenemos y somos plenamente consientes cuando lo ejecutamos, es el más fácil de compartir con los demás ya que se encuentra estructurado y muchas veces esquematizado para facilitar su difusión.



COMBINACIONES DEL CONOCIMIENTO



Existen cuatro tipos de combinaciones:




  1. Socialización

  2. Combinación

  3. Articulación

  4. Internalización


Socialización (conocimiento armonizado)

Conocimiento tácito a conocimiento tácito


En la socialización consiste en compartir experiencias. Se generan habilidades y conocimiento a partir de la observación, imitación y práctica. La parte fundamental para obtener conocimiento tácito es la experiencia. Es también compartir el conocimiento tácito a través de una comunicación cara a cara o de la experiencia compartida. Un ejemplo es el aprendizaje.



Combinación (conocimiento sistémico)

Conocimiento explícito a conocimiento explícito


En la combinación las personas intercambian y combinan el conocimiento a través de distintos medios como por ejemplo: conversaciones por teléfono, documentos, etc. En esta parte se combinan o integran partes de conocimiento explícito y se sintetizan en un nuevo conocimiento. Combinación de varios elementos del conocimiento explícito: la construcción de un prototipo es un ejemplo.


Articulación o Exteriorización (conocimiento conceptual)



Conocimiento tácito a conocimiento explícito
Se articulan los fundamentos del conocimiento tácito individual y se hacen intangibles y fáciles de compartir, para crear nuevo conocimiento. Nonaka considera este proceso como clave en la creación del conocimiento. Desarrollando conceptos, que encajan con el conocimiento tácito combinado. Y que permiten su comunicación.

Internalización o Interiorización (conocimiento operacional)


Conocimiento explícito a conocimiento tácito


En la interiorización se presenta la conversión entre conocimiento explícito en conocimiento tácito, y esto está relacionado con el “aprendiendo haciendo”. Se transmite el nuevo conocimiento explícito y quienes lo reciben lo internalizan para extenderlo, integrarlo y reestructurarlo en su conocimiento tácito.


Se asume entonces que de los cuatro modos descritos, la conversión de conocimiento tácito en explícito es el mecanismo de transformación más rico en la creación de conocimiento.


Cercanamente ligada al aprendizaje en acción, el conocimiento explícitose convierte en parte de la base del conocimiento individual y se convierte en un activo para la organización.


En mi medio de trabajo se aplica en gran media el conocimiento explicito, porque se debe saber lo que se hace para realizarlo, aunque otras se la realiza por simple intuición pero son muy pocas, en los estudios creo que se lleva una comunicación de socialización y se reciben conocimientos explicitos del profesor, los conocimientos tácitos aunque son muy utilis son muy poco utilizados en las actividades que realizo.