El lenguaje de programación Dart será estándar Cuando Google anunció su lenguaje orientado a objetos para la escritura de aplicaciones web complejas lo hizo con bastantes miras de futuro. Y es que, según explicaba en su momento la compañía de Mountain View, Dart cuenta con una veloz máquina virtual capaz de superar a la competencia en ciertos benchmarks. Aunque para garantizar su pervivencia no basta con lanzar dicho lenguaje a la calle y confiar en su evolución, sino que tiene que ser respaldado por la comunidad. Algo que acaba de conseguir ahora que la organización dedicada a la elaboración de normas Ecma ha formado un comité para publicar una especificación estándar del mismo. Así lo han confirmado los propios responsables del proyecto, que se muestran “entusiasmados” con este logro, ya que es la base para “un futuro en el que Dart se ejecute de forma nativa en los navegadores web“. “La aplicaciones Dart pueden ser rápidas cuando se compilan para JavaScript”, añaden, “pero una Dart VM incorporada permite un rendimiento aún mejor”. Dart alcanzó la versión 1.0 hace un mes, lo que implica que tras dos años de vida por fin está listo para que los desarrolladores web creen aplicaciones basándose en su código. Entre otras características, el kit de Dart 1.0 incluye el entorno de desarrollo Dart Editor, su propia versión de Chromium bautizada como Dartium, el traductor dart2js con JavaScript mejorado y el gestor de paquetes Pub.
Documentación en Java – Javadoc
Tanto la biblioteca estándar de Java como la de la ACM son muy extensas – Multitud de clases – Multitud de métodos Es imposible conocerlos todos con detalle suficiente como para utilizarlos
correctamente Por ello es muy importante disponer de una muy buena documentación. Es por ello que los diseñadores de Java, definieron un método sencillo para generar la documentación de las clases y métodos: – La documentación se inserta en el mismo fichero que el código (en forma de comentarios) • De esta manera es más fácil que evolucione con él – La herramienta javadoc extrae esos comentarios especiales y genera páginas html para ser vistas desde el navegador • De esta manera facilitamos poder navegar de una clase a otra. Añadiendo comentarios javadoc • Añadir documentación es tan simple como poner un comentario que empiece por /** y acabe con */ • Para poder estructurar mejor los comentarios dentro del comentario usaremos las marcas @param y @return para describir con detalle los parámetros y el resultado. • Hay muchas marcas interesantes como por ejemplo @author, @version, @since, @throws, etc. Cómo generarlo • Generar la documentación en Netbeans es tan fácil como, desde el proyecto, marcar en el menú contextual la opción “Generar javadoc” • Una vez generada, nos abrirá el navegador para acceder a ella. Accediendo al javadoc • Los ficheros generados los encontraréis en el subdirectorio dist/javadoc dentro del proyecto.
www.asociacionaepi.es
Manejo de sesión con Asp.Net En este tutorial veremos el manejo de la sesión con ASP.NET, pero de una forma diferente, generalmente cuando se crean paginas con cierta seguridad se requiere al uso del Session[], una vez que este se llena la forma convencional de preguntar si el usuario esta o no logueado es en el page load del archivo .cs if (Session["idusuariobs"] == null) { Response.Redirect("Default.aspx"); }
Con esta sentencia se evita que los usuarios puedan acceder a paginas restringidas sin la correspondiente autenticacion. Lo tedioso de ello es que si tenemos una aplicación muy grande debemos colocar lo mismo tantas veces como paginas con restricciones allá. Para evitar esto podemos desarrollar una clase que contenga la clase base Page y sobrescribir el evento OnInit public abstract class clsPaginaSegura : Page { protected override void OnInit(EventArgs e) { base.OnInit(e); clsSesionPersona clsPersona = clsSesionPersona.ObtenerUsuarioSesion(); if (clsPersona == null) Response.Redirect("~/Login.aspx"); else this.Persona = clsPersona; } }
Como vemos se pregunta por el objeto clsPersona, dicho objeto puede servir incluso para guardar ciertos datos de la persona que se quiere autenticar, que por lo general se guardar en variables generalmente en la misma pagina login de la siguiente manera: Session[idUsuario]; Session[nombresUsuario] entre otros datos, para evitar esto podemos crear una clase que almacene el objeto usuario en un objeto de sesión de la siguiente manera:
public clsSesionPersona(int intIdUsuario, string strLogin, string strNombre, string strApellido, int intIdPerfil) { IdUsuario = intIdUsuario; Login = strLogin; Nombre = strNombre; Apellido = strApellido; Perfil = intIdPerfil; }
public
static
clsSesionPersona
HttpContext.Current.Session[strKEY]
public
static
void
as
ObtenerUsuarioSesion() clsSesionPersona;
=
Persona;
return
}
CrearSesionUsuario(clsSesionPersona
HttpContext.Current.Session[strKEY]
{
Persona)
{
}
Si observamos tenemos un método constructor donde llegan los datos de usuario y dos métodos estáticos uno para crear la sesión del usuario y otro para obtenerla, se usa el objeto HttpContext.Current.Session[strKEY], que sirve para usarlo dentro de la
clase. Hasta aqui tenemos una clase que nos permitira evitar preguntar con un if en cada pagina que requiera autenticacion. Ahora de una manera mucho mas sencilla solo colocamos el nombre de la clase que contiene obtener usuario sesion. Como funciona esto?, al momento de cargar la pagina la clase clsPaginaSegura pregunta por el metodo clsSesionPersona.ObtenerUsuarioSesion(); al instanciarlo en clsSesionPersona clsPersona = clsSesionPersona.ObtenerUsuarioSesion(), se procede a preguntar si viene vacio if (clsPersona == null)
Response.Redirect("~/Login.aspx");
else
this.Persona =
clsPersona;
Si el objeto viene vacío se procede a redireccionar o a realizar cualquier otro evento que se desee, de lo contrario se puede navegar en la pagina que estuvo restringida Aqui vemos que con tan solo sustituir el System.Web.UI.Page por clsPaginaSegura ya tenemos una pagina que evita el acceso no permitido. public partial class Administracion_Seguridad : clsPaginaSegura { }
www.asociacionaepi.es
Mini curso de Log4j – Segunda parte Paso 3: Personalizando los mensajes
Veremos un ejemplo más avanzado para ilustrar estos conceptos. Modifiquemos el archivo .properties para que tenga el siguiente contenido:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.Append=false
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Destallaremos cada línea de esta configuración:
log4j.rootLogger=debug, stdout, R Aquí estamos definiendo que nuestro Logger serán stdout y R. Ambos serán para atender el nivel debug.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender En esta línea el appender stdout será de tipo ConsoleAppender. Esta clase se encargará de mostrar los mensajes a la pantalla.
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
La clase “PatternLayout” nos permite configurar nuestro appender por una cadena. En el API del framework podemos ver más detalle de estas clases.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n Aquí ya estamos definiendo nuestro formato el cual consiste en mostrar en un espacio de 5 caracteres (%5) el nivel del mensaje (p). Luego sigue de un espacio. Entre llaves mostrará el hilo que generó el mensaje (%t). Luego de un espacio, entre paréntesis el nombre del archivo fuente (%F) y después de dos puntos muestra la línea dentro del código fuente (%L). Después sigue un guión y luego muestra el mensaje que se ha mandado desde el programa. Finaliza con un salto de línea. Tenemos otro appender que es el R. Este es de clase RollingFileAppender. Esta clase permite agregar a un archivo y si este llega a un límite especificado es renombrado y el registro seguirá en un archivo nuevo. Esto es muy útil si queremos mantener todos los registros de eventos partidos en archivos de un tamaño manejable.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.Append=false
Aquí estamos diciendo que el archivo que creará será “example.log”y que sobreescriba los mensajes cada vez que se ejecute la aplicación.
log4j.appender.R.MaxFileSize=100KB Que tendrá un tamaño máximo de 100KB
log4j.appender.R.MaxBackupIndex=2 Y cuantos backups deberá crear antes de que el más antiguo deba borrarse.
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Aquí estamos definiendo el formato de salida que tendrá: la prioridad del evento (%p) seguido del nombre del thread que generó el evento (%t), el nombre completo de la clase incluyendo el paquete (%c) seguido de un guión y luego mensaje. Termina con una línea nueva. Por último, agregaremos estas líneas a la configuración para enviar un email cuando suceda un error.
log4j.rootLogger=debug, stdout, R,email
....
log4j.appender.email.Threshold=error
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.SMTPHost=smtp.provider.com
[email protected]
[email protected]
log4j.appender.email.Subject=Mensaje de Log4j!
log4j.appender.email.layout=org.apache.log4j.PatternLayout
log4j.appender.email.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
Para que este funcione deberemos de agregar la biblioteca de JavaMail.
Conclusiones
Cómo hemos visto, el cambio de la manera de registrar los eventos fue solo en el archivo .properties y no en nuestro programa. Muchas aplicaciones hechas en java que utilizamos – como el Tomcat – utilizan este framework de registro de mensajes. Puedes personalizar sus mensajes de acuerdo a tus exigencias.
www.asociacionaepi.es
Mini curso de Log4j – Primera parte Quién no ha utilizado System.out.println() para saber qué está haciendo en ese momento el programa, a veces ponemos mensajes mostrando el valor que tiene una variable, un array, etc. El problema sucede cuando el programa tiene que estar en producción y estos mensajes pueden resultar incómodos. Se torna una tarea tediosa buscar estas instrucciones para “comentarlas”. Y si hay error después ¿dónde está? ¡voy a tener que editar y recompilar el código para ver lo que pasa!. Afortunadamente programadores como nosotros han tenido el mismo problema y han desarrollado un framework que permite administrar estos mensajes – en inglés el término utilizado es logging – de tal manera que nuestros programas no tengan que pasar por el quirófano cada vez que esté “enfermo”. Este framework es Log4j. Log4j permite registrar eventos de nuestro programa sin necesidad de modificar el código a cada instante. Estos eventos (o logs) pueden ser mostrados en pantalla, guardados en un archivo, enviados por correo electrónico, etc. Por ejemplo, cuando nuestra aplicación web se levantó correctamente deseamos que se guarde en un log la hora y fecha con un mensaje “SUCCESS”, pero cuando nuestra misma aplicación que atiende a más quinientos mil usuarios al día tenga un error crítico queremos que nos avise por correo electrónico a nuestro celular. Todo esto puede ser posible gracias a Log4j.
Desarrollaremos un ejemplo y a medida que lo hagamos iremos explicando cada parte del Log4j. Paso 1: Obteniendo, instalando y configurando
Naturalmente para poder utilizar Log4j debemos obtenerlo de algún lado. Este framework se encuentra enhttp://logging.apache.org/. Descomprimimos su contenido en un directorio. Al descomprimir se habrá creado un subdirectorio con un nombre como logging-log4j-1.2.12. Este subdirectorio tiene otros subdirectorios que incluye la documentación, ejemplos, el código fuente y las bibliotecas necesarias. Dentro del subdirectorio “dist/lib” hay un archivo .jar que no pesa más de 400KB. Este es un nuestro framework que usaremos en nuestros programas. Para usarlo recomiendo crear una biblioteca en nuestro IDE para así poderlo reutilizar en otros proyectos. Solo bastaría con agregar a nuestra biblioteca el archivo .jar del framework. Recordemos que al crear un proyecto con nuestro IDE favorito, este crea una estructura de directorios especial. Generalmente crea el directorio src donde estarán todos los .java, un directorio class para nuestras .class, y un directorio build donde está la aplicación lista para ejecutar. Esto varía dependiendo de nuestro IDE. Paso 2: Construyendo nuestro ejemplo.
Crearemos la clase demolog4j.Main (es decir, la clase Main dentro del paquete demolog4j) package demolog4j; import org.apache.log4j.Logger; public class Main { static final Logger log = Logger.getLogger(Main.class); public static void main(String[] args) { log.info("iniciando aplicación"); for (int i = 10; i >= ; i--) { try { double n = 100 / i * 1.0; log.debug("el valor de n=" + n); } catch (Exception ex) { log.error(ex); } } } }
Es un ejemplo bastante forzado para mostrar tres de los cinco niveles de mensajes: info, debug y error. El nivel más detallado es el debug, que nos será de mucha utilidad al momento de depuración. Esto sirve, por ejemplo, para mostrar el nuevo valor de una variable. No debería estar activado cuando se encuentre el producción.
El siguiente nivel es info. Este nivel es para informarnos de cosas que ya se hizo algo concreto, tal como haberse conectado a la base de datos, el inicio satisfactorio de un servlet o un thread, etc. Es similar al modo “verbose” de las aplicaciones. El siguiente nivel es el warn. Este es para advertir de eventos que no necesariamente pueda ser un error. Por ejemplo el que no haya definido un archivo de configuración pero se puede cargar valores por omisión, El nivel error está relacionado para informar errores. Y un nivel mucho más crítico es el fatal. Este es para informar de eventos que no tienen solución. Por ejemplo cuando una aplicación está a punto de cerrarse a causa de un error. Para que nuestro ejemplo funcione crearemos un archivo llamado log4j.properties que debe estar en la raíz de los código fuente. Es decir, en el directorio src de nuestro proyecto. Debe encontrarse aquí ya que cada vez que el IDE construya el proyecto se copiará al directorio junto con las .classes. El archivo log4j.properties deberá tener el siguiente contenido: log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n Y ejecutamos el programa. Lo que mostrará es algo similar a esto: 0 15 15 15 15 15 15 15 15 15 15 15
[main] [main] [main] [main] [main] [main] [main] [main] [main] [main] [main] [main]
INFO DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG ERROR
demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main demolog4j.Main
-
iniciando aplicación el valor de n=10.0 el valor de n=11.0 el valor de n=12.0 el valor de n=14.0 el valor de n=16.0 el valor de n=20.0 el valor de n=25.0 el valor de n=33.0 el valor de n=50.0 el valor de n=100.0 java.lang.ArithmeticException:
Puedes editar la primera línea del log4.properties cambiando el texto “debug” por alguno de los demás niveles: info, warn, error o fatal para ver los resultados.
Estructura de Log4j.
Log4j tiene tres componentes principales: tres tipos de componentes trabajan juntos registrar mensajes según el tipo y nivel de ejecución para mostrarlos de acuerdo a
loggers, appenders y layouts. Estos para permitir a los desarrolladores de estos, y controlarlos en tiempo un formato que le especifiquemos.
Loggers
La principal ventaja del Log4j comparado con el tradicional System.out.println() es su capacidad para habilitar o deshabilitar los registradores de mensajes sin afectar a los demás. Un registrador de mensajes (Logger) son entidades autónomas con configuración independiente, de tal manera que uno tenga cierta funcionalidad que otro no lo tenga. Los nombres de los loggers son sensibles a mayúsculas. Appenders
La habilidad para activar o desactivar cualquier logger es solo una parte de Log4j. El framework permite registrar los eventos en varios destinos. Para Log4j una salida (pantalla, archivo, etc) es un appender. Actualmente, existe appenders para consola (como hemos visto), archivos, componentes visuales, servidores de sockets, JMS, Registro de Eventos de NT, y demonios de registro Unix. Layouts
El layout es el responsable de formatear los mensajes de acuerdo a criterio del programador. Existen dos tipos de Layout: SimpleLayout, que básicamente muestra el nivel del mensaje y el mensaje en sí, y el PatternLayout que consiste en formatear la salida. Muchas gracias a los que nos habéis leído y a los que no también, en breve continuaremos con la siguiente parte. www.asociacionaepi.es