Custom Tags en J2EE con NetBeans

Febrero 25th, 2010 No Comments »

La creación de Custom Tags (etiquetas personalizadas) en Java EE con NetBeans es sumamente fácil. Para ello debemos crear un nuevo proyecto desde Archivo -> Nuevo Proyecto y luego seleccionamos la opción Java Web -> Web Application. A continuación especificamos los datos relativos a la ubicación del proyecto en disco y luego sobre el servidor de aplicaciones a utilizar (en nuestro caso Glassfish).

A continuación procedemos a crear un archivo Tag Library Descriptor, que vendría a ser la especificación de las etiquetas que contendrá nuestra librería. Allí iremos agregando las nuevas relaciones a etiquetas que vayamos creado, de forma tal que luego podamos importar este archivo TLD a nuestro JSP para poder comenzar a utilizar sus tags. Para crearlo simplemente seleccionamos Archivo -> Nuevo Archivo y luego la opción Tag Library Descriptor dentro de la carpeta Web. A continación le asignamos un nombre (como ejemplo usaremos funcionesMatematicas) y seleccionamos como localización nuestra carpeta WEB-INF, creada automáticamente por el NetBeans al iniciar el Proyecto.

A continuación veremos creado un archivo como el siguiente:

Archivo: funcionesMatematicas.tld

 
  1.0
  funcionesmatematicas
  /WEB-INF/funcionesMatematicas
  <!-- A validator verifies that the tags are used correctly at JSP
         translation time. Validator entries look like this:
      <validator>
          <validator-class>com.mycompany.TagLibValidator</validator-class>
          <init-param>
<span -name class="mceItemParam"></span>parameter</param-name>
<span -value class="mceItemParam"></span>value</param-value>
	  </init-param>
      </validator>
   -->
  <!-- A tag library can register Servlet Context event listeners in
        case it needs to react to such events. Listener entries look
        like this:
	<listener>
	<listener-class>com.mycompany.TagLibListener</listener-class>
     </listener>
   -->
 
    Suma
    misTags.Suma
    scriptless
 
      a
      true
      true
      int
 
      b
      true
      true
      int

Que no es nada más y nada menos que un archivo XML en el que se describen las características de la librería de etiquetas personalizadas. Dentro de este archivo, dentro de la etiqueta taglib, es que especificaremos nuestras custom tags para vincularlas a métodos de clases que extiendan a Tag (veremos esto a continuación).

Dentro de los paquetes fuente (source packages) creamos uno nuevo llamado misTags. Y dentro de este paquete creamos un nuevo archivo del tipo Tag Handler. A continuación, NetBeans nos solicitará los datos de la etiqueta personalizada a crear, tales como el nombre, la descripción y la clase Tag Support a la que extenderá. De esta selección dependerá la cantidad de métodos que tengamos que redefinir para que nuestra tag funcione, además del control que obtendremos en cuanto a libertad de modificación. Para simplificarlo seleccionamos SimpleTagSupport (por defecto).

En nuestro caso crearemos la etiqueta suma, cuyo objetivo será retornar la suma entre dos números enteros pasados por parámetro. Luego seleccionamos el archivo TLD (descriptor de etiquetas) al cual se vinculará la etiqueta actual, en nuestro caso será funcionesMatematicas.tld. Para finalizar especificaremos los parámetros que utilizará nuestra etiqueta, usando el botón New … en la parte inferior derecha del formulario.

Agregamos dos parámetros, a y b del tipo int, ambos requeridos y seleccionamos Terminar. De esta forma obtendremos una clase Java con un contenido similar al siguiente:

Archivo: Suma.java

package misTags;
 
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
/**
 *
 * @author Joaquin L. Robles
 */
public class Suma extends SimpleTagSupport {
    private int a;
    private int b;
 
    /**
     * Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     */
    @Override
    public void doTag() throws JspException {
        JspWriter out = getJspContext().getOut();
 
        try {
            JspFragment f = getJspBody();
            if (f != null) f.invoke(out);
 
            // NUESTRO CODIGO ACA
 
        } catch (java.io.IOException ex) {
            throw new JspException("Error in Suma tag", ex);
        }
    }
 
    public void setA(int a) {
        this.a = a;
    }
 
    public void setB(int b) {
        this.b = b;
    }
 
}

Simple AJAX Shoutbox para Wordpress en español

Diciembre 4th, 2009 No Comments »

Versión del plugin traducida al español.

Descargar Simple AJAX Shoutbox en español

Flickr Gallery para Wordpress en español

Diciembre 3rd, 2009 No Comments »

Así es, la versión de este excelente plugin para mostrar fotos, galerias y videos de Flickr en Wordpress usando shortcodes está disponible en español.

Descargar Flickr Gallery para Wordpress

Monitor de Servidor en PHP

Noviembre 20th, 2009 10 Comments »

Hace unos días me surgió la necesidad de monitorear el estado de un servidor (si esta UP o DOWN) y recibir notificaciones via e-mail cuando se cayera. Probe un par de servicios gratuitos, pero sólo realizaban comprobaciones cada 30 minutos, por ejemplo.

Entonces se me ocurrió hacerlo por mí mismo, y conseguí realizarlo utilizando un servidor de hosting gratuito como 00webhost realizando comprobaciones cada 5 minutos y notificando las caídas via e-mail al instante.

Acá les muestro cómo hacerlo:

1. Debemos crear una cuenta de usuario gratuita en 00webhost.com. No es necesario que registremos un dominio .com personalizado, simplemente utilizamos un subdominio de los que nos proveen.

2. Una vez creada la cuenta, vamos a generar un archivo PHP llamado monitor.php con el siguiente contenido:

Archivo: monitor.php

<?php
 
	require_once ('Libmail.class.php');
 
	// Function to check response time
	function pingDomain($domain){
		$starttime = microtime(true);
		$file      = fsockopen ($domain, 80, $errno, $errstr, 10);
		$stoptime  = microtime(true);
		$status    = 0;
 
		if (!$file) $status = -1;  // Site is down
		else {
			fclose($file);
			$status = ($stoptime - $starttime) * 1000;
			$status = floor($status);
		}
		return $status;
	}
 
	// notificamos via email
	if (pingDomain('www.cordobalquila.com.ar') < 0) {
		$m= new Mail;
		$m->From("mailDesde@mail.com.ar");
		$m->To("mailPara@mail.com");
		$m->Subject("El sitio www.cordobalquila.com.ar esta caido");
 
		$message= "El sitio esta caido";
		$m->Body($message);
		$m->Send();
	}
?>

Ahora vamos a explicar un poco el código anterior:

require_once ('Libmail.class.php');

Esta es una clase de PHP de distribución gratuita disponible en PHPClasses para modelar el envío de e-mails con PHP, pueden descargarla desde acá.

// Function to check response time
	function pingDomain($domain){
		$starttime = microtime(true);
		$file      = fsockopen ($domain, 80, $errno, $errstr, 10);
		$stoptime  = microtime(true);
		$status    = 0;
 
		if (!$file) $status = -1;  // Site is down
		else {
			fclose($file);
			$status = ($stoptime - $starttime) * 1000;
			$status = floor($status);
		}
		return $status;
	}

Esta funcion devuelve el tiempo de acceso a la URL pasada por parametro (en milisegundos), devolviendo -1 si el sitio está caído (esto nos permitirá comprobar luego el estado).

Y por último:

// notificamos via email
	if (pingDomain('www.cordobalquila.com.ar') < 0) {
		$m= new Mail;
		$m->From("contacto@cordobalquila.com.ar");
		$m->To("joarobles89@gmail.com");
		$m->Subject("El sitio www.cordobalquila.com.ar esta caido");
 
		$message= "El sitio esta caido";
		$m->Body($message);
		$m->Send();
	}

Realizamos una comprobacion si el sitio está caído, en caso positivo notificamos via e-mail a la direccion que corresponda.

Ahora bien, la parte mas importante, planificar la tarea para que el servidor realice esta comprobacion cada cierto período de tiempo. Lo positivo es que 00webhost nos permite planificar tareas hasta en intervalos de 5 minutos, que es lo que considero bastante apropiado.

Desde nuestro panel de administración de la cuenta, vamos a la opción Cron Jobs y asignamos intervalos de 5 minutos a la ejecucion del comando php -f RUTA_DEL_ARCHIVO/monitor.php.

Listo, eso es todo! Ahora bien, podemos jugar un poco con este modelo para comprobar el estado de múltiples sitio, guardar Stats en una base de datos, etc, etc, etc…
Suerte, y hasta la próxima!

MySQL result to KML file output – PHP

Agosto 16th, 2009 No Comments »

Description

This package offers a function called mysqlAKML (resource $mysqlResult, string $documentName=’kml’, string $itemName=’Placemark’); used to output a Mysql result with the following fields:

name: TEXTVALUE – The Name of the marker
description: TEXTVALUE – The description shown in the info window when marker clicked
coordinates: TEXTVALUE as (DOUBLE + ‘, ‘ + DOUBLE) like “longitude, latitude”

Usage

So an easy way to obtain the KML would be:

$qString = "SELECT
markerName AS name,
myText AS description,
CONCAT (latitude, ', ', longitude) AS coordinates
FROM myTable";
 
$result = mysql_query($qString);
$myKML = mysql_KML($result);

A complete example:

File getPoints.php

<?
require ('connetion.php');
require ('mysqlAKML-1.1.php');
 
// obtain the MySQL resutl
$makers = mysql_query($queryString);
 
// KML Content-Type (application/vnd.google-earth.kml+xml)
header ("Content-type: application/vnd.google-earth.kml+xml");
header('Content-Disposition: attachment; filename="markers.kml"');
// Display the file content
echo mysql_KML($markers);
 
mysql_close();
?>

Then, if we want to load this KML in a Google Map with the Google Maps API with JavaScript, we shoul add the following code to our load() function:

// JavaScript
function load() {
...
...
// add Markers fetched from the DB to the map
var geoXml = new GGeoXml(PATH_TO_FILE + 'getPoints.php');
map.addOverlay(geoXml);
...
...
}

Thats all! Feel free to modify the file but remember to leave my name! See the working example in the link below

Working Example

Example

Downloads

Download Package File (mysqlAKML-1.1.php)

Usefull Links

GGeoXML in Google Maps API Reference

wp-polls con opción de ocultar los resultados a los votantes

Julio 20th, 2009 2 Comments »

Introducción

Buscando en Google, no encontré ningún add-on, hack o tip para hacer que mi wp-polls me permitiera ocultar los resultados de las encuestas a los votantes (por ejemplo, para hacer un plebiscito o una votación cerrada) con el objetivo de evitar tendencias…

Así, desarrollé una variación del wp-polls que incluye esta funcionalidad (en inglés todavía para posibilitar la internacionalización luego) incluyendo un par de modificaciones, tanto en la interfaz como en la estructura de la base de datos, agregando un nuevo campo…

Pueden descargarlo desde aquí, su instalación es exactamente igual a la del wp-polls normal… Pueden hacer update si lo desean.

Requisitos

  • Require Wordpress 2.8 al menos.

Downloads

Screenshots

Al agregar una Encuesta

Al agregar una Encuesta

Opciones de la Encuesta

Opciones de la Encuesta

Al votar en una Encuesta con la opción "Ocultar Resultados" activada

Al votar en una Encuesta con la opción "Ocultar Resultados" activada

Pasar resultado MySQL a archivo XML o E4X para AJAX

Julio 16th, 2009 2 Comments »

Gente, acá les acerco una función de mi autoría que convierte un resultado de consulta MySQL en un archivo XML, veamos un ejemplo:

Si tuvieramos la siguiente tabla usuarios:

id nombre email



1 Pablo pablo@mail.com
2 Marcos marcos@mail.com

Con la consulta SQL dada por:

SELECT * FROM usuarios;

Y queremos obtener el siguiente archivo XML:

<?xml version="1.0" encoding="UTF-8"?>
<resultados>
<item>
<id>1</id>
<nombre>Pablo</nombre>
<mail>pablo@mail.com</mail>
</item>
<item>
<id>2</id>
<nombre>Marcos</nombre>
<mail>marcos@mail.com</mail>
</item>

Simplemente debemos ejecutar la siguiente instrucción en PHP:

<?
require ('conexion.php');
require ('mysqlAXML-1.0.php');
 
header("Content-type: text/xml");
 
$consulta = "SELECT * FROM usuarios";
if (!$resultado = mysql_query($consulta))
	die ("Error en '$consulta' &lt;br /&gt;".mysql_error());
 
echo mysql_XML($resultado);
?>

O para obtener el resultado en formato E4X:

<?
echo mysql_E4X($resultado);
?>

La sintaxis general es la siguiente:

<?
mysql_XML($resultado, [ $nombreDoc='resultados', $nombreItem='item' ]);
?>

Pueden descargar el archivo ZIP con la libreria desde aquí: mysqlaxml-1.0

Función Factorial en una sola línea de código – Python

Julio 2nd, 2009 2 Comments »

Utilizando funciones integradas y reduce:

def facto(n): return reduce(operator.mul, range(1, n+1))

Utilizando definición por operadores:

def fact(x): return (1 if x==0 else x * fact(x-1))

Resumen de performance en http://importantshock.wordpress.com/2006/11/03/one-line-factorial-function-in-python/

Paginar Vector de Resultados en PHP

Mayo 12th, 2009 No Comments »

Hace un tiempo me surgió el problema de paginar un vector (Array) de resultados de una búsqueda, por lo que busqué la forma de crear una función que me permitiera listar los items correspondientes, pasandole por parámetros el vector en cuestión, el límite de resultados a mostrar y la página solicitada.

He aquí mi solución (es una base, que necesita ser pulida, eso les dejo a ustedes ;) )

paginar.php

Código :

function paginar($v$l$p) {

Primero que nada definimos la función junto con las variables que se han de pasar como parámetro, ahora bien, necesitamos saber cuales son las condiciones de inicio de nuestro paginador, tales como la cantidad de páginas a mostrar, en función de la longitud del vector y del límite de items a desplegar:

Código :

// DEFINIMOS LA CANTIDAD DE PÁGINAS 
$paginas = ceil(count($v) / $l);

Ahora bien, si queremos mostrar cada item del vector $v necesitaremos recorrerlo con un bucle, pero… ¿desde dónde empezaríamos a mostrar y hasta dónde? Para ello necesitamos definir las condiciones de nuestro bucle recorredor como sigue:

Código :

// CONDICION DE INICIO 
$inicio = ($p-1)*$l// CONDICION DE FINAL 
$final = $p*$l;

Y ya estamos listos para empezar a recorrer el vector mostrando cada resultado dentro de un div de id=”item” dentro del div de resultados. Debemos tener en cuenta que, si no existiera el item i-ésimo dentro del vector $v tenemos que dejar de listar items:

Código :

// MOSTRAMOS LOS ITEMS RESPECTIVOS 
      echo '<div id="resultados">'; 
      for ($i=$inicio$i<$final$i++) { 
         if (isset($v[$i])) 
            echo "<div id=\"item\">$i.- $v[$i]</div>"; 
         else  
            break; 
      } 
      echo '</div>';

Listo, tenemos los resultados correspondientes a la página $p, pero necesitaríamos mostrar el total de páginas a modo de menú de hipervínculos para poder navegar entre los ítems. Para ello comprobaremos si nos encontramos en la primera pagina para no mostrar “Página anterior” o en la última para no mostrar “Página siguiente”, además de no crear un vínculo a la misma página:

Código :

// LISTAMOS LAS PÁGINAS 
      echo '<div id="paginas">'; 
      if ($p>1) 
         echo "<a href=\"index.php?p=" . ($p-1) . "\">P&aacute;gina Anterior</a>&nbsp;-&nbsp;"; 

      for ($i=1$i<=$paginas$i++) { 
         if ($i == $p) 
            echo "<strong>$i</strong>&nbsp;"; 
         else  
            echo "<a href=\"index.php?p=$i\">$i</a>&nbsp;"; 
      } 

      if ($p<$paginas) 
         echo "&nbsp;-&nbsp;<a href=\"index.php?p=" . ($p+1) . "\">P&aacute;gina Siguiente&nbsp;</a>"; 
      echo '</div>'return; 
   }

Eso sería todo, para llamar a la función simplemente realizamos:

index.php

Código :

<?php     $vector = array("hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau""hola""chau" );     require ("paginar.php");     if (isset($_GET[p]))        $p = $_GET[p];     else         $p=1;     paginar($vector10$p);  ?>

Espero que les sirva de base para un desarrollo más complejo, saludos!

Pueden ver el ejemplo funcionando en http://www.reweb.com.ar/labs/paginarVector/

Powered By Wordpress - Theme Provided By Wordpress Theme - No Credit Auto Loan