domingo, 11 de noviembre de 2012

Microsoft ISA Server

Microsoft define a ISA Server como una solución de seguridad diseñada para ayudar a proteger a las empresas contra amenazas informáticas al mismo tiempo que habilita a sus usuarios a obtener el máximo provecho de su infraestructura y ancho de banda, en general se dice que es un firewall. 

ISA Server utiliza una técnica denominada Web-Caché que guarda y sirve todos los accesos a internet, de modo que el tráfico de la red pueda ser reducido y como consecuencia también provee una carga más rápida de páginas utilizadas con frecuencia.

Al igual que Active Directory, ISA server permite crear políticas para usuarios, grupos, aplicaciones, etc. Está diseñado para trabajar con sistemas operativos Windows Server 2000 o superior.

Viene en dos versiones, Standard y Enterprise la cuál difieren por el número de procesadores que pueden soportar (Enterprise está diseñada para sistemas de gran escala). Se puede ver la instalación de ISA Server en el siguiente video:


domingo, 21 de octubre de 2012

Configuración de Active Directory

Abrir el asistente de configuración del servidor e instalar 'Controlador de dominio (Active Directory)':

 Aparecerá el asistente:


Este controlador será para un dominio nuevo:


Se creará un dominio para un nuevo bosque:


Acá ingresaremos el nombre del dominio que vamos a controlar, para el ejemplo se utilizará el dominio que se creo siguiendo el tutorial previo:


Ahora debemos ingresar el nombre NetBios para el dominio (es importante recordar puesto que es el que se ingresas en las máquinas clientes para agregarlas al dominio):


Dejar la configuración de la ruta del archivo de sucesos por defecto:


Dejar este paso también por default:


Se presentará una pantalla con el resumen de todas las opciones seleccionadas:


 Seleccionar una compatiblidad para servidores Microsoft 2000 - 2003:


Ingresar una contraseña para modo remoto:


El asistente iniciará la configuración:


Al finalizar, el asistente mostrará el diálogo final:


Ahora podremos agregar cuentas de usuario en 'Usuarios y equpos de Active Directory':


Acá al hacer clic derecho podremos agregar 'Unidades Organizativas' (grupos de usuarios) , por ejemplo acá creamos una UO llamada PRACTICAS y se agregará un usuario:


Este usuario podrá iniciar sesión en cualquier equipo perteneciente al dominio, usando el nombre de usuario1:


Para que el usuario pueda iniciar sesión, habrá que agregar computadoras al dominio. Esto se puede hacer en Mi PC -> Propiedades -> Cambiar el nombre del equipo y en este paso seleccionamos dominios e ingresamos el nombre NetBios:


Listo!


domingo, 14 de octubre de 2012

Configuración del DNS con Zona Inversa

Primero hay que hacer click en Inicio -> Administre su Servidor y seleccionar 'Agregar o quitar función'...


Seleccionar el servicio DNS:


Debemos de tener una IP estática, sino la tenemos nos mostrará un asistente para configurarla:


Ingresamos una IP para el servidor DNS (192.168.0.1 por ejemplo) y también la escribimos en donde hay que especificar un servidor DNS preferido, que será el mismo:


Luego se mostrará un asistente para agregar un nuevo dominio:

Elegiremos crear una zona directa y una inversa: (La zona directa se refiere al dominio en sí por ejemplo, la zona de servidor1.com y la zona inversa se refiere a saber dónde está servidor1.com que para este ejemplo estaría en las IP's 192.168.0.x dónde x es cualquier número entre 0 y 255):


La zona inversa se creará después:


Este servidor hará los redireccionamientos:


Finalizar la instalación:

Se procede a crear una zona inversa (para decir que el rango 192.168.0.0 - 192.168.0.255 pertenece a servidor1.com):

La zona debe ser directa:

Ingresar el rango de servidor1.com:


También hay que agregar una zona directa en la cuál hay que definir el dominio 'servidor1.com' que se hace en este mismo administrador.


lunes, 8 de octubre de 2012

Instalar Windows Server

Este tutorial está hecho en una máquina virtual VBox.

El primer paso será montar la ISO en una nueva máquina virtual que tenga al menos 128 MB de RAM.
Cuando cargue saldrá una ventana como esta:



Después se aceptará la licencia de Microsoft, después habrá que elegir una opción de formato de disco, en este tutorial se utilizó un formato NTFS.



Luego del formato aparecerá esta ventana:



Se tendrá que ingresar un nombre para el Administrador y una Organización:


Se debe ingresar un nombre para el equipo y una contraseña:



Para este ejemplo se utilizará una configuración típica, pero de ser necesario que sólo se instalen ciertos componentes, entonces se debe elegir personalizada:


Se ingresa un nombre de grupo de trabajo, si este servidor será el DNS, de otro modo se tendrá que ingresar el nombre del servidor hace las funciones de este:


sábado, 29 de septiembre de 2012

Conceptos Básicos sobre Servidores

¿Qué es Active Directory?


Es un término acuñado por Microsoft para referirse a su implementación de servicio de directorio y políticas de acceso, sobre una red de computadoras, la cuál necesita que antes exista un servidor DNS para que la estructura de red y jerarquía funcione para los usuarios. Active Directory además permite desplegar aplicaciones en los equipos pertenecientes al dominio.

La estructura jerárquica de AD se basa en tres tipos, conocidos como objetos, los cuáles son: recursos, servicios y usuarios. También se define el término de <<bosque>> para referirse al conjunto de los objetos que se integran en un espacio, sin que necesariamente pertenezcan al mismo dominio; cada objeto será a su vez un árbol.


¿Qué es un DNS?


DNS significa Sistema de Nombres de Dominio y funciona como un sistema de nomenclatura jerárquica para objetos de una red (ya sea de internet o red privada). Un DNS resuelve nombres asociados a recursos permitiendo localizar y redireccionar las peticiones sobre ellos. La forma más común de operar de un DNS es sobre direcciones IP, por ejemplo si tenemos un sitio www.ejemplo.net y este se encuentra en la máquina con IP 192.68.0.1, entonces el DNS es capaz de <<traducir>> el nombre en un IP y así poder localizar el recurso.

¿Qué es DHCP?


DHCP es un Protocolo de Configuración Dinámica de Hosts. En general los servidores DHCP asignan IP's dinámicamente a computadoras clientes que forman parte del dominio. Cada vez que un cliente se conecte a un servidor(o si también puede definirse un rango de tiempo) DHCP, este le brinda una IP generada automáticamente y que pertenece a un rango que define el administrador. 

¿Qué es un Servidor FTP?


Es un Protocolo de Transferencia de Archivos. Básicamente un servidor FTP es capaz de compartir archivos con computadoras clientes o recibir archivos de ellas. Es necesario que las computadoras clientes y el servidor se encuentren en una red con TCP. La transferencia de archivos y datos de acceso se realiza como TEXTO PLANO en su totalidad, es por eso que hay que aplicar otros protocolos de seguridad(SSH por ejemplo). La transferencia se realiza por un puerto, que es algo parecido a una tubería por la cuál el cliente se comunica con el servidor.

sábado, 15 de septiembre de 2012

Configuración de AVD en Windows 7

La instalación y configuración del dispositivo virtual Android es un poco compleja. Los requerimientos obligatorios consisten en tener instalado Java y el SDK de Android.

Etapa 1 | Java


1. Se puede descargar del siguiente enlace.
2. Instalar.
3. Además se tendrán que configurar las variables de entorno, para esto se pueden encontrar un manual en el siguiente link.

Etapa 2 | SDK


1. Descargar el SDK Android en el siguiente enlace.
2. Instalar el SDK.
3. Recordar la ruta de la instalación.

Etapa 3 | Obtener un dispositivo Android (AVD)


1. Con los pasos ya completados, hay que abrir el programa: Inicio -> SDK Manager <*Correrlo como administrador>
2. Se presentará una ventana como esta:





3. Ahora vamos a instalar un entorno de desarrollo y emulación para Android, para este ejemplo vamos a seleccionar Android 2.1 y le damos en instalar.

4. Esperar hasta que el proceso termine, luego en el SDK Manager hacer click en Tools -> Manage AVDs...
5. Vamos a crear un nuevo dispositivo al que vamos a llamar 'practicas' para esto hacer click en New.
6. Se configura como se muestra: (se agregó una SD de 200 Mb):

7. Ahora se inicia la AVD en Start, esperar a que cargue y se mostrará:

sábado, 8 de septiembre de 2012

Android y Emuladores

Android


Es un sistema operativo para móviles. La fortaleza de Android radica en que está basado en Linux, por lo qué extiende muchas de sus características que lo hacen más que un simple teléfono celular.

Emulador AVD (Android Virtual Device)


Un dispositivo con OS Android se puede emular en una computadora. Esto es bastante útil en tareas de pruebas para aplicaciones, ya que se comporta exactamente como un teléfono físico. 

El emulador más conocido (probablemente hayan más...) es Dalvik, el cuál viene junto a las librerías y entorno de desarrollo de Android (SDK). En este enlace puede encontrar un tutorial de instalación y uso básico del emulador.




Algunas de las características más robustas en un dispositivo Android es la terminal, la cual se comporta exactamente como el BASH de Linux. Algunos comandos permitidos son ping, ls, cd, entre otros...

Otra característica del AVD es que es posible montar 'memorias SD' virtuales, lo que demuestra su similitud con un dispositivo físico. El emulador se puede conectar con la computadora huésped por medio de la IP 10.0.2.2 (por ejemplo $ping 10.0.2.2) esto se cumple con cualquier AVD.

Para compartir archivos y conexiones a redes el proceso es similar a una conexión Ubuntu-Windows, por ejemplo, ya que es necesario instalar un paquete, por ejemplo Samba Filesharing, ES Explorador de Archivos o Superuser. Se puede encontrar más información en este link y también en este otro.

Los programas para Android vienen empaquetados en archivo '.apk' (como el .exe en Windows). Para instalar sólo tienen que bajar el archivo y abrirlo, o en el mejor de los casos, instalarlo directamente desde Android Market; la cuál tiene un gran número de aplicaciones algunas son de costo y otras son libres. 



sábado, 18 de agosto de 2012

Actividad Jueves 16 - 08 -2012

Se mostró como hacer una instalación del SO Ubuntu en Virtual Box. La actividad se realizó mediante Teamviewer. Todos los compañeros de prácticas iniciales estuvieron presentes. La demostración estuvo a cargo de mi compañero de prácticas intermedias.

sábado, 11 de agosto de 2012

Red Windows-Linux


Receta

  1. Se debe crear una red en Windows, el nombre de la red en este ejemplo será REDCWL.
  2. Ya con la red creada, hay que trabajar sobre el equipo Linux; para este ejemplo Ubuntu 12.04. DEBE DE CONTAR CON CONEXIÓN A INTERNET .
  3. Abrir la terminal e instalar los paquetes samba, samba-client, smbfs y smbclient, para esto se debe ingresar el comando:
    sudo apt-get install samba samba-client smbfs smbclient
  4. Ahora toca configurar el nombre de la red/grupo de trabajo, para esto se necesita editar un archivo y para abrirlo ejecutamos:

     ~$ sudo gedit /etc/samba/smb.conf
  1. En este archivo se debe buscar la línea siguiente:
            workgroup = nombre_de_red

Se sustituye el nombre_de_red por el nuestro, que como dijimos será REDCWL.
  1. Ahora vamos a crear una carpeta para compartir con la red, la cual se llamará 'public' (puede ser cualquier nombre), que estará ubicada en el directorio home:
    sudo mkdir /home/public
  2. A esta carpeta se necesita darle permisos, para esto vamos a usar el siguiente comando:
           ~$ sudo chmod 766 /home/public

Esto significa que el propietario tiene todos los permisos (7), el grupo al que pertenece y todos los demás que accedan a la carpeta sólo tienen permisos de lectura y escritura (66).
  1. Abrir de nuevo el archivo de configuración con el comando del paso 4, y agregar las siguientes líneas hasta el final del documento

    [public]
    comment = La descripción de la carpeta
    path = /home/public
    public = yes
    writable = yes
    browseable = yes
  1. Esta carpeta por defecto tendrá clave, para desactivar esto, en este mismo archivo se busca la línea que diga:

    ; security = user
Y sustituir user por SHARE.
  1. Ahora se debe reiniciar el proceso de Samba, para esto ingresamos:

    ~$ sudo stop smbd && sudo start smbd

  2. Para ver los equipos en la red:
    Ver Red en Ubuntu:
  • Red -> Examinar la red -> Red de Windows -> REDCWL











  1. Ver Red en Windows:
  • Red de Microsoft Windows -> Redcwl



NOTA: Si por algún motivo los equipos no se pueden ver, se debe verificar que ambos equipos se puedan ver mutuamente, para esto se hace lo siguiente, si no funciona trate de reiniciar la PC Ubuntu:
  1. En Ubuntu:
    ~$ ping IP_PCWindows
  1. En Windows:
    > ping IP_PCUbuntu

viernes, 3 de agosto de 2012

Una Introducción a LaTeX

Encabezado

Para un artículo, un encabezado puede ser:
\documentclass[12pt,letterpaper, twocolumn]{article}

Librerías

%Paquete de Idioma
\usepackage[spanish]{babel}

%Codificación Alfabeto
\usepackage[utf8]{inputenc}

%Codificación de Fuente
\usepackage[T1]{fontenc}

%Índice
\usepackage{makeidx}

%Gráficos
\usepackage{graphicx} 


%Nombre de Colores
\usepackage[usenames,dvipsnames]{color}

%Varias Columnas
\usepackage{multicol} 

%Matemática
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb} 

%Estilo de Página Numeración superior 

\pagestyle{headings}

%Hiperlinks -> \href{url}{text}
\usepackage[pdftex]{hyperref}



Viñetas

\begin{itemize}
\item[1.]    9 resistencias 

\item[2.]    Una placa de pruebas. 

\item[3.]    Un multímetro digital 

\item[4.]    4 alambres de conexión 2 (banana - lagarto, negro y rojo) y 2 (lagarto-lagarto). 

\item[5.]    Una fuente de tensión DC variable 
\end{itemize}



Imágenes


begin{centering}
        \begin{figure} [h]
        \centering 

        %El atibuto scale se maneja para anclar imágenes.
        \includegraphics[scale=0.35]{FIGURA.png}  
        \caption{Circuito a analizar en la práctica con nodos A, B, C y D.}
        \label{Figura 1}
        \end{figure}
\end{centering}



Estilos de Texto

Itálica
\begin{it}*En mA\end{it}


Negrita
\textbf{Reporte 5 | Leyes de Kirchoff}


Letras Pequeñas
\small{Facultad de Ingeniería}

Link
 
Acá podrán encontrar un documento de entrada y su salida en Latex.


https://docs.google.com/folder/d/0B-vNDjVM1qwrcFdxM0V5THV3Qjg/edit


jueves, 21 de junio de 2012

Árbol AVL

Este es el código de un árbol AVL, para utilizarlo se debe de sobrecargar el método toString de los clases que se van a insertar <<You should override toString function on your custom classes>>. También se debe usar la clase StringHandler que afina las comparaciones de modo que no existan excepciones por caracteres inválidos o errores por mayúsculas, todo esto se aplica en la sobrecarga del método toString <<Also, you need to use (in toString function) StringHandler class to prevent any exception if a string has a non-valid character (for example ñ,.,é)>>. Este ejemplo incluye un método para obtener la cadena que sirve para graficar en el árbol en Graphviz. <<This example includes a function that returns a string useful to draw AVL Trees using Graphviz>>. De último hay un ejemplo de uso <<At the end, there is a how to use example>>

Archivo: StringHandler.java


package edd;

import java.text.Collator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author julian
 * 
 */
public final class StringHandler {

 public static String clearString(String cadena) {
  return clearTildes(
    clearBlankSpaces(replaceBlankSpaces(clearChars(cadena))))
    .toLowerCase();
 }

 public static String replaceBlankSpaces(String cadena) {
  return cadena.replaceAll("\\s+", "_");
 }

 public static String clearBlankSpaces(String cadena) {
  return cadena.trim();
 }

 public static String clearTildes(String cadena) {
  String cleanString = "";
  Collator comparador = Collator.getInstance();
  comparador.setStrength(Collator.PRIMARY);
  for (int i = 0; i < cadena.length(); i++) {
   String caracter = String.valueOf(cadena.charAt(i));
   if (comparador.compare(caracter, "a") == 0)
    cleanString += "a";
   else if (comparador.compare(caracter, "e") == 0)
    cleanString += "e";
   else if (comparador.compare(caracter, "i") == 0)
    cleanString += "i";
   else if (comparador.compare(caracter, "o") == 0)
    cleanString += "o";
   else if (comparador.compare(caracter, "u") == 0)
    cleanString += "u";
   else
    cleanString += caracter;
  }

  return cleanString;
 }

 public static String clearChars(String cadena) {
  Pattern p = Pattern.compile("\\W+");
  Matcher m = p.matcher(cadena.trim());
  if (m.find()) {
   cadena = m.replaceAll("_");
   return cadena;
  }
  return cadena;
 }

 public static boolean check(String cadena) {
  Pattern p = Pattern.compile("\\W+");
  Matcher m = p.matcher(cadena.trim());
  if (m.find()) {
   cadena = m.replaceAll("_");
   return false;
  }
  return true;
 }
}

Archivo: ArbolAVL.java


package edd;

import java.util.ArrayList;

/**
 * @author julian
 * 
 */
class NodoAVL implements java.io.Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = -5229739760615431800L;
 Object dato;
 ArbolAVL izq;
 ArbolAVL der;
 int altura;

 NodoAVL(Object dato) {
  this.dato = dato;
 }
}

public class ArbolAVL implements java.io.Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = 5154638182557428732L;
 private NodoAVL raiz;
 private final int izq, der;

 public ArbolAVL() {
  // TODO Auto-generated constructor stub
  this.raiz = null;
  izq = -1;
  der = 1;
 }

 private int compare(Object newObj, Object obj) {
  if (obj == null)
   return -1;

  if (obj instanceof Integer && newObj instanceof Integer) {
   int a = Integer.parseInt(newObj.toString());
   int b = Integer.parseInt(obj.toString());
   return a - b;
  } else
   return StringHandler.clearString(newObj.toString()).compareTo(
     StringHandler.clearString(obj.toString()));
 }

 private String getInfo() {
  if (this.raiz.dato == null)
   return "<nulltype>";
  else
   return this.raiz.dato.toString();
 }

 /**
  * Este método setea un árbol left como sub-árbol izquierdo y right como
  * sub-árbol derecho.
  * 
  */
 private void set(Object data, ArbolAVL left, ArbolAVL right) {
  this.raiz = new NodoAVL(data);
  raiz.izq = left;
  raiz.der = right;
 }

 public void limpiar() {
  this.raiz = null;
 }

 public boolean isEmpty() {
  return this.raiz == null;
 }

 /**
  * @return Sub-árbol izquierdo;
  */
 public ArbolAVL getIzq() {
  return this.raiz.izq;
 }

 /**
  * @return Sub-árbol der.
  */
 public ArbolAVL getDer() {
  return this.raiz.der;
 }

 public Object getDatoRaiz() {
  return this.raiz.dato;
 }

 public int getAltura() {
  if (this.isEmpty())
   return -1;
  else
   return raiz.altura;
 }

 /**
  * Este método actualiza la altura del árbol
  */
 public void actualizarAltura() {
  if (!this.isEmpty())
   raiz.altura = (raiz.izq.getAltura() > raiz.der.getAltura() ? raiz.izq
     .getAltura() : raiz.der.getAltura()) + 1;
 }

 private void rotacionSimple(int direccion) {
  ArbolAVL t1 = new ArbolAVL();

  if (direccion == izq && !this.raiz.izq.isEmpty()) {
   t1.raiz = this.raiz.izq.raiz;
   this.raiz.izq.raiz = t1.raiz.der.raiz;
   t1.raiz.der.raiz = this.raiz;
  } else if (!this.raiz.der.isEmpty()) {
   t1.raiz = this.raiz.der.raiz;
   this.raiz.der.raiz = t1.raiz.izq.raiz;
   t1.raiz.izq.raiz = this.raiz;
  }

  this.actualizarAltura();
  t1.actualizarAltura();

  this.raiz = t1.raiz;
 }

 private void rotacionDoble(int hijoARotar) {
  if (hijoARotar == izq) {
   this.raiz.izq.rotacionSimple(der);
   this.rotacionSimple(izq);
  } else {
   this.raiz.der.rotacionSimple(izq);
   this.rotacionSimple(der);
  }
 }

 /**
  * Este método hace cálculos del factor de equilibrio en el árbol.
  */
 private void balancear() {
  if (!this.isEmpty()) {
   if (this.raiz.izq.getAltura() - this.raiz.der.getAltura() == 2)
    if (this.raiz.izq.raiz.izq.getAltura() >= this.raiz.izq.raiz.der
      .getAltura())
     this.rotacionSimple(izq);
    else
     this.rotacionDoble(izq);
   else if (this.raiz.der.getAltura() - this.raiz.izq.getAltura() == 2)
    if (this.raiz.der.raiz.der.getAltura() >= this.raiz.der.raiz.izq
      .getAltura())
     this.rotacionSimple(der);
    else
     this.rotacionDoble(der);
  }
 }

 /**
  * Este método inserta el objeto data en el nodo raíz (root) del árbol
  * 
  * @param dato
  *            La información a insertar.
  */
 public void insertar(Object dato) {
  if (this.isEmpty())
   this.set(dato, new ArbolAVL(), new ArbolAVL());
  else {
   if (this.compare(dato, this.raiz.dato) == 0)
    return;
   else if (this.compare(dato, this.raiz.dato) < 0)
    this.raiz.izq.insertar(dato);
   else if (this.compare(dato, this.raiz.dato) > 0)
    this.raiz.der.insertar(dato);

   this.balancear();
   this.actualizarAltura();
  }
 }

 /**
  * Este método busca el objeto data en el árbol t especificado
  * 
  * @param dato
  *            La información a buscar
  * @param t
  *            El árbol en el que se desea buscar
  * @return El objeto si lo encuentra, o null si no.
  * 
  */
 public Object buscar(Object dato, ArbolAVL t) {
  if (!this.isEmpty())
   if (this.compare(dato, t.raiz.dato) == 0)
    return this.raiz.dato;
  if (this.compare(dato, t.raiz.dato) < 0)
   if (!t.raiz.izq.isEmpty())
    return t.buscar(dato, t.raiz.izq);
  if (this.compare(dato, t.raiz.dato) > 0)
   if (!t.raiz.der.isEmpty())
    return t.buscar(dato, t.raiz.der);

  return null;
 }

 /**
  * Borra el árbol t específicado.
  * 
  * @param data
  *            El dato a borrar.
  * @param t
  *            El árbol donde se desea borrar el nodo.
  */
 public void borrar(Object data, ArbolAVL t) {
  try {
   if (this.compare(data, t.raiz.dato) < 0)
    t.borrar(data, t.raiz.izq);
   else if (this.compare(data, t.raiz.dato) > 0)
    t.borrar(data, t.raiz.der);
   else if (t.raiz.izq.isEmpty() && t.raiz.der.isEmpty())
    t.raiz = new ArbolAVL().raiz;
   else if (t.raiz.izq.isEmpty())
    t.raiz = t.raiz.der.raiz;
   else if (t.raiz.der.isEmpty())
    t.raiz = t.raiz.izq.raiz;
   else
    t.raiz.dato = borrarConPredecesor(t.raiz.der);
   // El caso más pizado hehehe
   t.balancear();
   t.actualizarAltura();
  } catch (NullPointerException e) {
   System.out
     .println("No se borró el nodo porque no existe en el árbol");
  }
 }

 private Object borrarConPredecesor(ArbolAVL t) {
  if (t.isEmpty())
   System.out.println("No se va a borrar nada");
  else if (!t.raiz.izq.isEmpty()) {
   Object data = borrarConPredecesor(t.raiz.izq);
   t.balancear();
   t.actualizarAltura();
   return data;
  } else {
   Object data = t.raiz.dato;
   t.raiz = t.raiz.der.raiz;
   t.balancear();
   t.actualizarAltura();
   return data;
  }

  return null;
 }

 /**
  * Este método imprime los datos en recorrido Pre-Orden
  * 
  * @param t
  *            El arbol a recorrer
  */
 public synchronized void printPreOrden(ArbolAVL t) {
  if (!t.isEmpty()) {
   if (!t.raiz.izq.isEmpty())
    System.out.print(String.format("\n%s -> %s;", t.raiz.dato,
      t.raiz.izq.raiz.dato));
   if (!t.raiz.der.isEmpty())
    System.out.print(String.format("\n%s -> %s;", t.raiz.dato,
      t.raiz.der.raiz.dato));
  }

  if (!t.raiz.izq.isEmpty())
   t.printPreOrden(t.raiz.izq);
  if (!t.raiz.der.isEmpty())
   t.printPreOrden(t.raiz.der);
 }

 String str = "";

 @Override
 public String toString() {
  str = "\n";
  this.getGraphvizString(this);
  if (str.length() == 0)
   return this.getInfo();
  return str;
 }

 /**
  * Este método concatena los datos debe ser usado para sobreecargar
  * toString();
  * 
  * @param t
  *            El arbol a recorrer
  */
 private synchronized void getGraphvizString(ArbolAVL t) {
  if (!t.isEmpty()) {
   if (!t.raiz.izq.isEmpty())
    str += (String.format("%s -> %s;\n", "\"" + t.getInfo() + "\"",
      "\"" + t.raiz.izq.getInfo() + "\" "));

   if (!t.raiz.der.isEmpty())
    str += (String.format("%s -> %s;\n", "\"" + t.getInfo() + "\"",
      "\"" + t.raiz.der.getInfo() + "\" "));

   getGraphvizString(t.raiz.izq);
   getGraphvizString(t.raiz.der);
  }
 }

 /**
  * Agregue todos los nodos a un ArrayList.
  * 
  * @param t
  *            El arbol principal.
  * @param al
  *            Un ArrayList donde hacer las inserciones.
  */
 public void getAlltoList(ArbolAVL t, ArrayList<Object>

al) {
  if (!t.isEmpty()) {
   if (t.raiz.dato != null)
    al.add(t.raiz.dato);

   getAlltoList(t.raiz.izq, al);
   getAlltoList(t.raiz.der, al);
  }
 }
}

Ejemplo de Uso | How to Use

import edd.StringHandler;

public class MyClass {
    private String id; // Es un atributo único **THIS IS A UNIQUE ATTRIBUTE**
        
    public MyClass(String id) {
        this.id = id;
    }

    @Override
    public String toString(){
        return StringHandler.clearString(id);
    }

    public static void main(String[] args) {
        ArbolAVL t = new ArbolAVL();
        t.insertar(new MyClass("Barça"));
        t.insertar(new MyClass("Barça")); //No se agrega ** THIS IS NOT LINKED **
    }
}