últimoartículo

Chuletas, chuletas y más chuletas

19.12.2006

ChuletasEl Diccionario de la Real Academia de la Lengua Española define CHULETA (3ª acepción) como entre estudiantes, nota o papelito que se lleva oculto para consultarlo disimuladamente en los exámenes.

He visto muchos tipos de chuleta como estudiante y como docente… pero nunca olvidaré una en forma de bolígrafo.

Hace tiempo nuestro amigo eMe publicó varios artículos dedicado a este tema:

Ahora que no se encuentra entre nosotros este fantástico diseñador, tomo su testigo para continuar publicando una relación de chuletas que he descubierto en Smashing Magazine:

Actionscript

Ajax

Apache

ASCII Character Codes

ASP

C# and VB.NET

CSS

CVS

C++

Django

Firefox

Google

HTML/XHTML

Java

JavaScript

LaTeX

Microformats

Misc

MySQL

Oracle

Perl

Photoshop/Gimp

PHP

Python

Regular Expressions

Ruby

Unix/Linux

Weblog

Windows

XML

Pensé que sería buena idea bajarse todos los pdf’s y subirlos comprimidos para facilitar la descarga ¿No? ;)

artículosanteriores


Borrar ficheros temporales automáticamente

18.11.2005

Seguro que alguna vez habéis tenido que trabajar usando ficheros de uso temporal ó registros de base de datos que dependen de una fecha y cuando esta caduca, quedan inservibles y hay que eliminarlos de la tabla correspondiente.

Para el primer caso se suele solucionar fácilmente usando el objeto MemoryStream en lugar de un FileStream, pero a mi me ha pasado ya varias veces que, en determinados casos, no me sirve el MemoryStream. También recuerdo el caso en el que tenía que mandar ficheros a un recurso compartido, dejarlos allí por dos semanas para que lo usaran los usuarios y pasado ese tiempo borrarlos.

Para el segundo caso se soluciona usando un DTS. A mi particularmente no me gustan los DTS porque cada vez que tiene algún problema el servidor y hay que reiniciarlo, indefectiblemente fallan los DTS… sí, sí, les tengo manía.

Está claro que siempre hay más de una solución para un mismo problema pues os voy a presentar una alternativa, que además de ser muy sencilla, es realmente efectiva: utilizar los eventos del Global.asax para eliminar datos temporales de manera automática y sin la intervención de DTS, ni scripts que borren ficheros: En los eventos Session_End y Application_Start se coloca el codigo necesario para borrar los ficheros o registros de base de datos que queramos. En el ejemplo que puse anteriormente lo que hacía era borrar todos los ficheros contenidos en un directorio cuya fecha de creación fuera superior a 2 semanas.

La explicación es muy sencilla, cada vez que finaliza la sesión de un usuario en el servidor web, se comprueba si hay algún fichero o registro que cumpla las condiciones que hemos especificado en código para que sean eliminados. Este codigo se incluye también al comienzo de la aplicación porque si el servidor fuera reiniciado se perderían las sesiones actuales, con lo que al volver a iniciarse la aplicación realizaría otra vez la comprobación. Esto último no es estrictamente necesario, ya que en el momento en el que pierda otro usuario la sesion se realizará otra vez el escaneo, pero a mi me deja más tranquilo.

S3rGy0.

Certificado MCAD

02.09.2005

Recientemente acabo de sacarme (por fin) el certificado Microsoft Certified Application Developer, razón principal por lo que últimamente he estado tan poco participativo en este blog :(. Después de mi experiencia quería comentar en este post como me ha ido por si alguien le interesa y quiere saber con qué se va a encontrar.

En primer lugar, para obtener el certificado hay que aprobar 3 exámenes, correspondiendose cada examen con un bloque: el primero será el bloque de aplicaciones con interfaz (por llamarlo de alguna manera), el segundo serían servicios web y el tercero sería un examen a elegir entre varias materias, algo parecido a lo que sería una asignatura optativa de la carrera:

Primer bloque:

- Exam 70–305: Developing and Implementing Web Applications with Microsoft Visual Basic® .NET and Microsoft Visual Studio® .NET.

- Exam 70–306*: Developing and Implementing Windows-based Applications with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET.

- Exam 70–315*: Developing and Implementing Web Applications with Microsoft Visual C#™ .NET and Microsoft Visual Studio .NET.

Exam 70–316*: Developing and Implementing Windows-based Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET.

En mi caso he hecho el 70-305 de desarrollo de aplicaciones Web mediante Visual Basic.

Segundo bloque:

- Exam 70–310*: Developing XML Web Services and Server Components with Microsoft Visual Basic .NET and the Microsoft .NET Framework.

- Exam 70–320*: Developing XML Web Services and Server Components with Microsoft Visual C# and the Microsoft .NET Framework.

En mi caso hice el 70-310, ya que el primero lo había hecho con Visual Basic .NET en lugar de C#.

Tercer bloque:

- Exam 70–229: Designing and Implementing Databases with Microsoft SQL Server™ 2000 Enterprise Edition.

- Exam 70–230: Designing and Implementing Solutions with Microsoft BizTalk Server® 2000 Enterprise Edition.

- Exam 70–234: Designing and Implementing Solutions with Microsoft Commerce Server 2000.

- Exam 70-305*, 70-306*, 70-315*, or 70-316*

If you use Exam 70-305 or 70-315 to satisfy the core exam requirement, you may use either Exam 70-306 or 70-316 as an elective.

If you use Exam 70-306 or 70-316 to satisfy the core exam requirement, you may use either Exam 70-305 or 70-315 as an elective.

- Exam 70–330: Implementing Security for Applications with Microsoft Visual Basic .NET.

- Exam 70–340: Implementing Security for Applications with Microsoft Visual C# .NET.

En mi caso elegí el 70-229.

Para cada examen hay que pagar un derecho de examen de 175 € más IVA y sólo se pueden realizar en centros acreditados. En mi caso tuve que hacer los dos primeros en Sevilla porque hasta Julio no había ningún centro en Córdoba :(.

El examen puedes hacerlo en español ó inglés, en mi caso lo he hecho en inglés porque, leyendo en los grupos de noticias de microsoft especializados, comentaban que las traducciones a español de los exámenes no eran muy buenas y podían generar muchas dudas a la hora de hacer el examen.

A la hora de estudiar hay muchísimo material, obviamente el oficial hay que comprarlo (no lo va a regalar microsoft), por lo que directamente pasé de él. Yo os recomiendo que os busqueis los libros oficiales en versión electrónica (pdf, chm, doc, etc…), y sobre todo, material de TestKing.

Esta web se dedica a vender exámenes de práctica, que resultan ser exactamente las mismas preguntas que ya han caído en otros exámenes anteriores. Dado que para hacer el examen te conectas a un servidor que tiene una lista de preguntas y, a partir de estas, genera un examen (tipo test), el 95% de las preguntas ya están plasmadas en los TestKing. No hará falta que diga lo interesante que resulta pillarse estos exámenes.

También me ha gustado mucho los exámenes de prueba de uCertify, que aunque no son exactos como los TestKing, son bastante parecidos y sobre todo te explican muy bien la respuesta y las opciones incorrectas.

Todo esto lo podéis encontrar fácilmente en el eMule. Además, para los TestKing he encontrado una página muy buena: examcollection. Esta página te permite descargar gratuitamente exámenes de TestKing en formato VCE. Este formato corresponde a un programa llamado Virtual CertExam (también disponible en eMule :)) que simula el mismo formato que el examen original. Esto es mucho más comodo que ir leyendo una lista de preguntas en un PDF, que es el formato que proporciona TestKing.

Con esto hay material pa jartarse y si queréis más información sólo tenéis que preguntar en esta web :). Ya sólo queda estudiar como locos y echarle muchas ganas.

S3rGy0.

Mostrar capa teniendo en cuenta el scroll

20.06.2005

El otro día estaba tratando de mostrar una capa al pasar el puntero del ratón sobre una imagen, de manera que la capa apareciera justo debajo del puntero del ratón. Al principio sólo tuve que mostrarla cuando se lanzará el evento onmouseover, pero a medida que iba añadiendo controles a la página ésta se iba haciendo más grande hasta que apareció el maldito scroll. Lo que ocurrió entonces es que la capa no me salía justo debajo del puntero del ratón sino que se desplazaba arriba o abajo. Después de un rato mirando el código me di cuenta que el desplazamiento que se producía era equivalente al desplazamiento que tenía la barra de scroll, por lo tanto, para solucionarlo tuve que sumarle a la posición actual del ratón, el desplazamiento de la barra de scroll:

document.getElementById(”divObservaciones”).style.left=event.clientX + document.body.scrollLeft;
document.getElementById(”divObservaciones”).style.top=event.clientY + document.body.scrollTop;

Esto se debe a que event.clientX y su homólogo en el eje Y toman una posición relativa a la pantalla, mientras que las propiedades left y top toman medidas absolutas, por lo que se produce un desfase. Si a la posición del puntero del ratón le sumamos los desplazamientos, tanto horizontal como vertical del scroll, obtendremos las posiciones absolutas que demandan las propiedades left y top.

Con esto la capa siempre se muestra donde yo quiero, aunque haya un scroll de por medio.

S3rGy0.

Validación de un formulario mediante JavaScript

15.06.2005

Una de las novedades que ha introducido ASP.NET con respecto a ASP 3.0 ha sido los controles de validación de los controles de un formulario. A mi particularmente no me gustan nada, ya que me parece que son muy poco flexibles y bastante feos. Por ejemplo, tienes que crear chorrocientos mil controles, uno para cada input ó select y terminas con la vista de diseño petada.

Yo lo que hago es utilizar una función javascript que valide los controles de forma personalizada. Esto a priori puede parecer más costoso que arrastrar los Validators en la vista de diseño, pero en realidad sólo tienes que escribir el código la primera vez, el resto es prácticamente copiar y pegar.

La única complicación que tiene esto (por llamarlo de alguna forma ;)) es parar la ejecución de la aplicación cuando se encuentre un error y que no llegue a ejecutarse la parte servidora. para ello debemos llamar a la función en el onclick del control de esta manera:

<input id=cmdGuardar type=button runat=server onclick=”if(!validarDatos()) return;”>

De esta forma si se recibe un false no continúa la ejecución de la página en el servidor.

A continuación hay que crear la función jscript. Aquí os pongo una de ejemplo:

function validarDatos()
{
var resultado=true;
var errores=”";

Form1.imgTitulo.style.visibility=”hidden”;

//Campos obligatorios

if(document.getElementById(”txtTitulo”).value==”")
{
errores=errores+”n - Debe introducir el Título.”;
Form1.imgTitulo.style.visibility=”visible”;
resultado=false;
}

if(resultado==false)
{
errores=”Se han encontrado los siguientes errores: n” + errores;
alert(errores);
}

return resultado;
}

El funcionamiento es el siguiente: Se declaran dos variables donde se va a ir almacenando el resultado de la validación (true ó false) y la descripción de los errores (para no madar un alert por cada error, sino que se manda uno solo). La siguiente sentencia es opcional. Lo que hace es ocultar al inicio de la validación una imagen que irá a la derecha de cada control; se trata de un gif animado con una señal de admiración que parpadea, para indicar al usuario dónde se ha producido el error. Es opcional, si no queréis usarla, pues omitar las líneas que hagan referencia a este control.

Seguidamente se valida el control. En el ejemplo se comprueba que se haya introducido algo en él, ya que se trata de un control obligatorio. En el caso de encontrarse un error se concatena el error a los posibles errores previos, se muestra el gif que parpadea y se pone como resultado false.

Por último, si el resultado es negativo, se muestra el error y se devuelve el resultado de la validación.

Como veis es lo más simple del mundo y sin embargo permite una mayor flexibilidad a la hora de validad todo tipo de datos. Por supuesto seguro que habrá muchos que sigan prefiriendo los Validators, pero aquí tenéis una alternativa.

S3rGy0.

Mostrar confirmación en ASP.NET

25.05.2005

Ya hemos visto como mostrar el equivalente a un Msgbox utilizando un script en la parte cliente, pues algo parecido, aunque un poco más complicado es mostrar una confirmación. El mecanismo es el mismo, pero además hay que crear todo lo necesario para que, si la confirmación es positiva, no se pare la ejecución de la aplicación y siga ejecutando lo que debiera hacer tras pulsar afirmativamente.

En primer lugar debemos crar un textbox y un botón ocultos:

<input id=txtConfirmacion runat=server type=text style=”DISPLAY: none”>
<input id=cmdAccion runat=server type=button style=”DISPLAY: none”>

De esta manera cuando queramos mostrar una confirmación escribiremos en el código servidor:

txtConfirmacion.value=”¿Está usted seguro de que quiere reventar la base de datos?”
Exit Sub

Se generará un postback tras ejecutarse Exit Sub y se recargará la página, por lo que en <body> debemos añadir un script que se cargue en el onload y que tenga este código:

function mostrarConfirmacion()
{
var resultado;

if(document.getElementById(”txtConfirmacion”).value != “”)
{
resultado=confirm(document.getElementById(”txtConfirmacion”).value);
document.getElementById(”txtConfirmacion”).value=”";

if(resultado==true)
document.getElementById(”cmdAccion”).click();
else
return false;
}
}

Por último hay que implementar el código pertinente en el evento Server_Click del botón cmdAccion.

Si os habéis dado cuenta esto es muy util cuando queréis realizar una confirmación en medio del código servidor, por ejemplo, realizáis desde el servidor una validación de un fichero y una vez terminada queréis enviar el fichero por correo electrónico con una confirmación previa por parte del usuario. Al terminar de validar el fichero no hay ningún evento que lance la confirmación, por eso hacemos una simulación en el onload y en caso de ser afirmativa, se hace click automáticamente sobre el botón oculto. Este click nos llevará a un código servidor que mandará un correo electrónico con el fichero adjunto.

Espero haberme explicado con este ejemplo, pero si tenéis alguna duda dejad un comentario y os responderé en cuanto me sea posible.

S3rGy0.

Splash Screen en ASP.Net

27.04.2005

Algo que puede resultar muy útil para realizar la presentación de una página ó cuando se carga una página muy pesada es utilizar una Splash Screen ó página de presentación. En mi caso sólo las uso para poner un mensaje del tipo “Cargando, espere por favor…” cuando tengo que cargar una página muy pesada.

Esto era algo fácil de realizar en ASP, pero la cosa cambia en ASP.Net, ya que siempre carga primero el código servidor cuando se está cargando la página y por lo tanto no podemos colocar una capa con un mensaje en la parte cliente. Para poder realizar esto debemos usar Response.Flush(), cuya función es enviar al cliente el código servidor que hay almacenado en el Buffer. La cuestión es que se puede usar para cargar datos del cliente de la siguiente manera:

Se coloca al inicio del una capita con un mensaje de espera:

<body>
<div id=splashScreen style=…>
Cargando datos, espere por favor . . .
</div>
<% Response.Flush() %>

De esta manera antes que empiece la carga de la página se mostrará al usuario el contenido de la capa.

A continuación debemos ocultar la capa cuando termine la carga:

<script language=javascript>
document.getElementById(”splashScreen”).style.display=”none”;
</script>
</body>

Con este se mostrará el mensaje “Cargando datos, espere por favor” mientras se carga toda la página, incluyendo el procesamiento que se realice en el servidor.

Esto se puede embellecer con un gif animado o cualquier otra cosa que se nos ocurra.

S3rGy0.

Crear PDFs en ASP.NET

06.04.2005

La vía “estandar” para crear documentos pdf en asp.net es mediante Crystal Reports, que yo, particularmente, odio hasta la muerte, ya que no he visto nada que falle tanto desde Windows ME. En este post quiero presentar una alternativa gratuita para crear pdfs sin necesidad de pegarse “cornás” con Crystal Reports.

Se trata de Report.NET, un proyecto donde se ha desarrollado una magnífica librería que contiene clases con las que podemos crear fácilmente un pdf desde el código servidor. Trae una ayuda con muchos ejemplos que hace que usarlo sea bastante sencillo. Otra característica resaltable es que permite la inserción de imágenes, opción que puede llegar a ser verdaderamente útil (doy fe de ello).

Aún no lo he investigado a fondo y hasta ahora sólo lo uso para pdfs relativamente sencillos donde no tengo que crear tablas ni realizar consultas muy complicadas, pero me está resultando especialmente útil para crear formularios simples (con simples me refiero a que sólo se obtienen datos de una única tabla y con clave única), ya que para los más complicados sigo usando Crystal Reports, aunque todo esto, por supuesto, depende del gusto de cada uno.

Por cierto, tiene licencia LGPL (creo que es la primera librería para .NET que he visto que no cueste dinero) y está escrita en C#.

S3rGy0.

Servicios Web dinámicos

04.04.2005

Una opción de los servicios web es hacer que sean dinámicos. Esto es muy útil cuando tenemos servicios webs que se actualizan con frecuencia ya que es más sencillo actualizar sus referencias.

Para ello lo único que tenemos que hacer es irnos a las propiedades del servicio web (me refiero a la referencia web que hacemos en la aplicación web, no en el código del servicio web) y cambiar la propiedad “Comportamiento” a dinámico. Al hacer esto la URL del servicio se escribirá en el Web.Config, por lo que cuando subamos la aplicación a producción y vayamos a cambiar las URL del servicio web (se supone que al estar en Debug hemos estado usando servicios webs situados en un servidor de desarrollo) para que apunten a producción, basta con editar el fichero Web.Config de la aplicación y sustituir la URL por la dirección donde se encuentra el servicio web en producción.

Por defecto, al crear una referencia web, lo hace con comportamiento Estático. La ventaja principal del dinámico sobre el estático es que para modificar la URL del servicio web en modo estático hay que utilizar la interfaz gráfica de Visual Studio .NET, sin embargo, si es en modo dinámico sólo hay que editar el Web.Config con el Bloc de Notas y sustituir la URL del servicio web de desarrollo por la del servicio web de producción.

S3rGy0.

Aplicación ASP.NET en Release

14.03.2005

Quisiera escribir este post a modo de aviso, ya que hasta hace unos meses, pensaba que para compilar una aplicación asp.net en Release bastaba con poner la pestañita en “Release” y generar el proyecto. Al parecer no es suficiente (leer el documento de MSDN donde se explica el elemento compilation: “<compilation> Element”), también hay que cambiar en el Web.Config la línea:

<compilation defaultLanguage=”vb” debug=”true”/>

y sustituir por:

<compilation defaultLanguage=”vb” debug=”false”/>

De esta manera estaremos seguros de tener una versión Release en nuestro servidor de producción que no guarda ningún tipo de información de depuración.

S3rGy0

Simular multiples conexiones a una Web

11.03.2005

Cuando creamos una nueva aplicación web, nos sería muy útil saber como va a reaccionar frente a distintas cargas de trabajo. Para ello, lo mejor es utilizar una aplicación que simule estas situaciones, os propongo Microsoft Application Stress. Es muy fácil de configurar y nos da la posibilidad, muy fácilmente, de realizar múltiples peticiones a nuestra página como si desde muchos clientes se tratara. Podremos crear manualmente una tarea (por ejemplo escribiendo la dirección de Internet a la que tiene que acceder) o bien hacer una simulación en nuestro explorador, realizando determinadas acciones. Una vez que tenemos definido lo que queremos simular, sólo nos queda ejecutar la pila de llamadas.

El producto es totalmente gratuito (¿pero no era de Microsoft? ;) jeje) y podemos descargarlo desde aquí.

Espero que os sea de ayuda.

Enviar E-Mail cuando se produce un error en Asp.NET

18.01.2005

Algo muy útil a la hora de desarrollar páginas web con Asp.NET es que te llegue un correo cada vez que se produzca un error en el código servidor (código visual basic). Para realizar esto lo primero que se te viene a la cabeza es colocar el código susceptible de generar errores dentro de un try & catch. Esto está bien con una aplicación pequeña, pero cuando estamos escribiendo una web con muchos accesos a base de datos o a servicios webs es un auténtico coñazo tener que colocar try & catch por doquier para terminar mostrando el mismo mensaje (un mensaje estandar que no sea tan feo como el que tiene Asp.NET por defecto)

Una forma más simple de enviarnos un e-mail cada vez que se produzca un error es utilizando la función Application_Error del Global.asax. Cada vez que se produce un error en la parte servidora la aplicación se va a esta función para comprobar que hay código. Pues bien, aquí colocaremos la sentencia:

server.transfer(”FormularioDeErrores.aspx”)

Dos observaciones:

1.- Como podéis ver se llama a un “formulario de errores”. De esta manera cada vez que se produzca un error el usuario verá siempre el mismo error, que procuraremos que sea más bonito que la que tiene Asp.NET por defecto ;). Mientras el usuario ve este bonito error y se acuerda de nuestra familia, internamente este formulario nos enviará un correo indicandonos qué usuario a realizado la acción que produjo el error, la descripción del error, etc …

2.- Si os fijáis he utilizado server.transfer en lugar de response.redirect, esto es porque usando el segundo se pierde la información que se tenga previamente (como la descripción del error, que al fin y al cabo, es lo que nos interesa ;), mientras que con server.transfer esa información se guarda para ser mandada posteriormente por e-mail.

Además de esto hay que modificar el fichero Web.Config, sustituir:

< customerrors mode=”default” / >

por:

< customerrors mode=”Off” / >

De esta manera se mostrará la descripción del error al usuario, pero como este error lo vamos a capturar para ser posteriormente enviado por e-mail, el usuario seguirá viendo el hermoso mensaje de error y acordándose (como siempre) de nuestra familia. Si no especificamos esto, no habrá ningún mensaje que se pueda mandar por correo.

Algo opcional es irnos a “Servicios de Internet Information Server” dentro del panel de control (Herramientas Administrativas) y pinchar en las propiedades de nuestra aplicación; pinchamos en la pestaña “Seguridad de directorios” y pulsamos sobre “Modificar”. Desmarcamos la casilla “Acceso anónimo”. Esto no es necesario para que el proceso se efectúe correctamente, sólo se utilizará si queremos saber qué usuario ha producido el error.

El último paso es irnos al formulario de errores y en el page_load del código servidor mandar un e-mail cuyo cuerpo sea la descripción del error. Todo esto se puede ampliar con la información que queramos: por ejemplo, algo que utilizo mucho introducir en una variable de session cadenas SQL que pienso que puedan ser sensibles a errores. Esta variable la mando también en el correo y así puedo saber por qué se produjo el error. Sólo es cuestión de echarle imaginación.

Espero que haya quedado más o menos claro, si tenéis alguna duda preguntad sin miedo.

Saludos.

Utilizar objetos COM en Asp.NET

16.12.2004

Es bastante normal que queramos utilizar objetos COM de nuestras aplicaciones en ASP 3.0 por estar acostumbrados a ellos, o simplemente porque no hay aún ninguna versión en .NET del mismo. Por ejemplo, hace un tiempo, estuve utilizando una DLL de Adobe para crear PDFs, ya que era un informe estático y no tenía necesidad de pringarme con Crystal Reports. Cuando fui a descargarme esta DLL descubrí que no tenían versión en .NET (assembly) sino que era un objeto COM (DLL).

Si no se usan correctamente estos objetos pueden llegar a saturar el servidor en el que están alojados, ya que no liberan memoria y llega un momento en el que el servidor se satura. Esto se debe a que por defecto, el Framework ejecuta los objetos en MultiThread, ya que los assemblys están preparados para ello, pero los objetos COM no. Para utilizarlos correctamente tenemos que ejecutar nuestra página aspx en SingleThread. Para ello abrimos la página donde se hace referencia al objeto COM, nos vamos al código HTML y en la primera línea veremos algo como esto:

&lt%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”Inicio.aspx.vb” Inherits=”Prueba.WebForm1″%&gt

Pues bien, al final de esta línea añadiremos:

&lt%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”Inicio.aspx.vb” Inherits=”Prueba.WebForm1″ AspCompat=”True”%&gt

Con la expresión AspCompat=”True” se ejecutará la página en SingleThread y nos ahorraremos muchos problemas de consumo de recursos.

Saludos

Cómo conocer el consumo de recursos de tu aplicación ASP.NET

13.12.2004

Seguramente a todo el que programe con Asp.NET le habrá pasado alguna vez que se ha encontrado al terminar la aplicación con un resultado no esperado en lo relativo a la eficiencia. Esta ineficiencia de la aplicación puede venir dada por una multitud de motivos y, por lo tanto, no suele ser fácil encontrar el problema. En este post quiero presentar una aplicación desarrollada por Microsoft con la que podréis ver la memoria que consumo vuestra aplicación objeto a objeto: CLR Profiler. Este fichero contiene también los fuentes por si queréis realizar alguna modificación.

El paquete contiene además un manual completísimo sobre su manejo, donde se explica el sifnificado de todos los gráficos que contiene la aplicación, su funcionamiento y los errores más comunes de ineficiencia que puede dar esta aplicación.

Como experiencia personal os comentaré que una vez la utilicé porque tenía una aplicación que abría un fichero, lo leía y eliminaba los saltos de línea que tenía, para posteriormente enviarlo a un servidor. Al ejecutar la aplicación sobre ficheros de 30 kb aproximadamente me tardaba un minuto y medio en ejecutarse, lo cual me resultó muy extraño y tras repasar el código no pude distinguir ningún error a simple vista, por lo que decidí usar esta aplicación. Al pasarle el CLR Profiler me di cuenta que la aplicación reservaba una cantidad de memoria descomunal para variables de tipo String (5Mb) para la cantidad de datos que manejaba (30kb). A partir de esto busqué por internet y en un artículo de Microsoft recomendaban el uso de StringBuilder en lugar de String cuando se fueran a concatenar grandes cantidades de datos(en mi caso, iba concatenando caracteres y si encontraba un salto de línea lo obviaba). Lo probé y la memoria reservada bajó a 38kb!!!! y el programa pasó a ejecutarse en apenas 2 o 3 segundos.

En resumen, esta aplicación puede resultar muy útil para sacarnos de más de un problema que aparentemente no tiene solución.

Saludos.

MsgBox en ASP.NET

14.09.2004

Este es un pequeño truco para poder mostrar lo que sería el equivalente del MsgBox de Visual Basic en una página ASP.NET. Quizá esto lo sepáis ya más de uno pero para el que esté empezando con ASP.NET le va a resultar muy útil.

Por defecto no se puede poner en el código servidor una sentencia como esta: MsgBox(”Hola Mundo”) ya que esto se va a ejecutar en parte servidora y el resultado va al servidor y no al cliente que es el que debería de verlo. La única manera de mostrar este tipo de mensajes es con la función alert de javascript.

Para ello debemos crear un input oculto al que se tenga acceso a la parte servidora, por ejemplo así:

<input id=”txtMensajes” runat=”server” style=”DISPLAY:none; WIDTH: 10px”>

El estilo con width a 10 pixels es sólo una cuestión estética, porque si tenéis 10 textbox ocultos ocupan mucho espacio en el diseñador.

En este textbox oculto es donde vamos a almacenar los mensajes que queramos mostrar. El funcionamiento será el siguiente: En este textbox ponemos el mensaje que queramos mostrar y cuando el servidor devuelva el resultado al cliente éste se recargará y, mediante un evento onload, utilizaremos una función para mostrar el contenido del textbox. Para ello escribiremos en la cabecera de la página html:

function mostrarMensaje()
{
if(document.getElementById(”txtMensajes”).value != “”)
{
alert(document.getElementById(”txtMensajes”).value);
document.getElementById(”txtMensajes”).value=”";
}
}
Notad que después de mostrar el mensaje se inicializa el textbox a cadena vacía. Si no hiciéramos esto se mostraría el mensaje cada vez que se recargue la página.

Por último tenemos que llamar a la función desde el evento onload del documento:

<body onload=”mostrarMensaje();”>

Ahora nos vamos al código servidor y si, por ejemplo, en una parte del código se puede producir un error, pondremos:

txtMensaje.value=”Error de la muerte”

Ventajas de este truquito: Si necesitamos ir concatenando mensajes de error lo podemos hacer fácilmente almacenando la cadena concatenada en el textbox, al igual que se puede hacer en Win32.

Inconvenientes: Hay que esperar a que se ejecute el código servidor para que aparezca el mensaje, por lo tanto es poco recomendable para líneas de bajo ancho de banda.

Salu2.