viernes, 24 de junio de 2011

Eclipse IAM: Instalación para Eclipse Helios

Hay dos formas generales de usar Maven:
  • "A lo macho" a punta de comandos.
  • O a lo no tan macho usando un plugin de Maven.
Si no se quiere gastar neuronas recordando comandos de Maven, entonces la solución óptima es usar un itermediador, que en mi caso particular el que utilizo es un plugin de Maven para Eclipse llamado IAM (Integración de Apache Maven).

Es muy sencillo de instalar en la versión Helios de Eclipse:

1. Copiar el URL de actualización del sitio:
http://q4e.googlecode.com/svn/trunk/updatesite-iam/


2. Ir a la opción de menú: "Ayuda->Instalar Nuevo Software"


3. Pegar el URL en la opción de "Agregar Sitio". Dar clic a "Siguiente"


4. Seleccionar los paquetes deseados. Preferiblemente elegirlos todos para menos complicación.




5. Después de reiniciar el eclipse probar el plugin creando un nuevo proyecto Maven.




6. Seleccionar el checkbox de crear un proyecto simple de Java.



7. Si examinamos el archivo pom.xml observamos que se agregó una dependencia de JUnit.




8. Podemos probar la integración de la dependencia al proyecto corriendo la clase de prueba que se generó de ejemplo: "AppTest".




viernes, 17 de junio de 2011

PHP: Leer un XML usando DOMDocument

Dejo a disposición un ejemplo sencillo de como leer un XML con la clase DOMDocument.

XML:

<catalog>
<catalog-name>My Favorite Music</catalog-name>
<cd id="cd-001">
<title value="Empire Burlesque" />
<artist value="Bob Dylan" />
<country value="USA" />
<company value="Columbia" />
<price value="10.90" />
<year value="1985" />
</cd>
<cd id="cd-002">
<title value="Hide your heart" />
<artist value="Bonnie Tyler" />
<country value="UK" />
<company value="CBS Records" />
<price value="9.90" />
<year value="1988" />
</cd>
<cd id="cd-003">
<title value="Greatest Hits" />
<artist value="Dolly Parton" />
<country value="USA" />
<company value="RCA" />
<price value="9.90" />
<year value="1982" />
</cd>
</catalog>

Código:

<?php
$cdCatalogXMLReader = new CDCatalogXMLReader();
$cdCatalogXMLReader->showCatalogAsTable('cd-catalog.xml');

class CDCatalogXMLReader {
public function showCatalogAsTable($xmlPath) {
// Loads XML.
$doc = new DOMDocument();
$doc->load($xmlPath);

// Reading tag's value.
$title = $doc->getElementsByTagName("catalog-name")
->item(0)->nodeValue;

echo "<h1>$title</h1>";

// Reading all elements with tag name="cd".
$cds = $doc->getElementsByTagName( "cd" );
echo '<table border="1">';
echo '<tr><th>ID</th><th>Title</th><th>Artist</th><th>Country</th><th>Company</th><th>Price</th><th>Year</th></tr>';

foreach ($cds as $cd) {
echo '<tr>';
// Reading attributes.
echo '<td>' . $cd->getAttribute('id') . '</td>';
echo '<td>' . $cd->getElementsByTagName("title")->item(0)->getAttribute('value') . '</td>';
echo '<td>' . $cd->getElementsByTagName("artist")->item(0)->getAttribute('value') . '</td>';
echo '<td>' . $cd->getElementsByTagName("country")->item(0)->getAttribute('value') . '</td>';
echo '<td>' . $cd->getElementsByTagName("company")->item(0)->getAttribute('value') . '</td>';
echo '<td>' . $cd->getElementsByTagName("price")->item(0)->getAttribute('value') . '</td>';
echo '<td>' . $cd->getElementsByTagName("year")->item(0)->getAttribute('value') . '</td>';
echo '</tr>';
}
echo '</table>';
}
}
?>

Salida:

My Favorite Music

IDTitleArtistCountryCompanyPriceYear
cd-001Empire BurlesqueBob DylanUSAColumbia10.901985
cd-002Hide your heartBonnie TylerUKCBS Records9.901988
cd-003Greatest HitsDolly PartonUSARCA9.901982

lunes, 13 de junio de 2011

Patrón de diseño: Prototype


Estuve estudiando este patrón de diseño para enseñarlo en una clase. Este patrón en resumen permite crear nuevos objetos al hacer una copia exacta de un objeto prototípico.

El principal uso que le encuentro al patrón, al menos de primera impresión ya que los patrones se van digiriendo con el tiempo, es el ahorro que se logra en casos donde la instanciación de un objeto es costoso en términos de recursos del sistema (memoria, tiempo, procesamiento, etc).

En el ejemplo de abajo simulo esta aplicación. La clase Sheep (oveja) cuando se instancia require la construcción de su cadena de ADN; este es el supuesto proceso pesado. Java ya incluye una interface llamada "Cloneable" que cuando se implementa en una clase, las instancias de la clase se pueden clonar. Cuando hablamos de clonar nos referimos a crear una copia exacta de un objeto al dejar los mismos valores de sus atributos de clases en una instancia aparte.

La clase Sheep implementa por tanto esta interface con lo cual crear otra oveja similar es asunto simplemente de llamar el método "clone()".

public class Sheep implements Cloneable {

protected String dna;
protected final char [] DNA_ALPHABET = {'A','C','T','G'};

public String getDNA() {
return dna;
}

public Sheep() {
// Simulates extremely long process to create a sheep.
StringBuilder dnaBuilder = new StringBuilder();

for(int i=0; i < 30; i++) {
int alphabetIndex = (int) (Math.random() * 10 % 4);
dnaBuilder.append(DNA_ALPHABET[alphabetIndex]);
}
dna = dnaBuilder.toString();
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public static void main(String[] args) {
Sheep dolly = new Sheep();
System.out.println("Dolly was born: " + dolly.getDNA());

try {
Sheep dollyClon = (Sheep) dolly.clone();
System.out.println("Dolly Clon: " + dollyClon.getDNA());

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

Resultado:

Dolly was born: CAAACGGGACACTTATACTTGTTCGCCCAT
Dolly Clon: CAAACGGGACACTTATACTTGTTCGCCCAT

viernes, 10 de junio de 2011

Siguiendo la ruta de los redireccionamientos

Hay ocasiones en que me ha tocado utilizar servicios externos donde una dirección llama otra, después se devuelve y al final redirecciona a otro sitio. Como todo eso sucede en centésimas de segundo, es imposible darle seguimiento a que URLs viaga o cuáles son los parámetros que se envían en cada viaje. Firebug no nos ayuda mucho, porque a pesar de que tiene una sección de red donde se puden ver las distintas solicitudes de HTTP, estas se borran en cada redireccionamiento.

Para poder darle seguimiento a los distintos requests, recomiendo cualquiera de las dos siguientes herramientas: HTTPWatch y HTTPFox. La primera funciona en todos los navegadores y es la que yo uso en particular. La segunda es un plugin de Firefox. En los screenshots de abajo ejemplifico como uno puede observar el típico redireccionamiento del sitio de google.com, a la versión respectiva del país de origen de la solicitud.

HTTPWatch


HTTPFox