Welcome to MSDN Blogs Sign in | Join | Help

\\Brain\Backup

...Developer Evangelism stuff and sirocco wind effects...
Cazadores de Mitos : Firefox desarrollará un plugin para tumbar IE

Halaaaaaa... vengaaaaa.. quién da mas?

Este tipo de comentarios que se ven últimamente en internet son el efecto bola de nieve en su máxima expressión, en la medida en la que pueda intentaré ir matando alguno de esos mitos, el problema es que lleva muy poco tiempo postear el mito y agrandarlo, pero bastante el buscar las fuentes y contrastarlo :_)

A lo que vamos.

La especificación de HTML 5 propone una serie de nuevos elementos dentro de HTML, entre ellos, el Canvas. Si bien el grupo de IE8 ha hecho grandes avances en cuanto a la adopción de estándares en internet, pasa el ACID2, ha subido 2524 nuevos casos de prueba adicionales para CSS2.1.. etcétera...Por ahora el grupo de IE no ha hecho público ningún comentario sobre la adopción o no de este elemento. Están trabajando en la beta 2 de IE.

Parece ser que hay un proyecto para adaptar la implementación del Canvas de Mozilla y poder ejecutarlo en IE, Vladimir Vukicevic [1] esta trabajando en ello. COmo comentario adicional, dice que aun teniendo la implementación del Canvas, éste es solo una pieza y que puede que algun sitio no funcione porque puede echar de menos otras piezas presentes en el mundo mozilla que no esten en IE.

Para darle un contexto de ejecución controlado al canvas y que no se encuentre "sólo" hace referencia al proyecto "mono gritón" [2] que consiste en integrar un motor de javascript diferente dentro de IE, este motor sería el del proyecto Tamarin [3]. Como véis en los sitios (pq espero que no os estéis creyendo mi post y estéis contrastando fuentes) son proyectos en curso.

Siguiendo con su idea/proyecto del canvas, Vladimir comenta tb que hay que trabajar en la forma de distribución, que la experiencia de que sea un ActiveX con una infobar y que haya que aceptar no le parece adecuada.

Y ahora la parte del bulo.. en un website (arstechnica.com) [0] el autor de la noticia comenta, que si adobe arrimase el hombro al proyecto de Vladimir, todo sería más fácil porque podría ayudar con la distribución... copio textualmente:

"...This is purely speculation, but If Adobe decided to ship Screaming Monkey and the Canvas functionality as part of the next major iteration of the Flash plugin, it would rapidly accelerate adoption and get it onto lots of computers..."

Os habéis fijado en la parte de "this is purely speculation" ? :) si? perfecto entonces. Parece ser que por ahora Firefox y adobe no intentan tumbar a nadie.

Conclusión ( en mi opinión personal e intransferible ):

Me encanta que se desarrolle algo tan genial para IE, cualquiera de los dos proyectos, tanto el de canvas como el de poder meter otros motores de Javascript. Al fin de al cabo, lo que todos queremos como usuarios finales es que las cosas funcionen lo mejor posible,no?

Ahora bien... con lo centrado que esta el equipo de IE8 actualmente en los estándares dudo que no tengan en proyecto la implemenación de los elementos de HTML5.

Algunos recursos:

[0] http://arstechnica.com/news.ars/post/20080819-mozilla-drags-ie-into-the-future-with-canvas-element-plugin.html

[1] http://blog.vlad1.com/2008/07/30/no-browser-left-behind/

[2] https://wiki.mozilla.org/Tamarin:ScreamingMonkey

[3] http://www.mozilla.org/projects/tamarin/

(si... mis cuentas empiezan en 9)

Happy Hunting!

Las dichosas Cross Domain Calls

 

Si desarrollas para la web, seguro que alguna vez te has enfrentadoa  una Cross Domain Call :) En este post vamos a ver en que consisten, por qué existen y si hay algún metodo para evitarlas.

¿Qué es una Cross Domain Call?

Es un mecanismo de seguridad de las comunicaciones en navegadores actuales. Evitan que un script (XMLHttpRequest de AJAX) o una aplicación (Flash, Silverlight) de una página web puedan acceder a un servidor web diferente del que residen.

¿Por qué existe?

Intentan ayudar a evitar dos formas habituales de sabotaje en internet, el (1) Cross Site Request Forgery (XSRF o session riding)  y el (2) Cross Site Scripting (XSS).

(1) Un sitio web malicioso y con mala baba suplanta al usuario que esta navegando y accede a otra aplicación en su nombre. Por ejemplo, yo navego a una página malvada y ésta utiliza las cookies de mi navegador para acceder a mi flickr o banca online (o lo que sea) utilizando mis contexto ( http://migaleria/borrar?photoId=3 ).

(2) Un sitio web malicioso y promíscuo me roba información y la envía a un sitio de terceros. XSS Implica que tiene que haber una inyección de Javascript.  Por ejemplo, abro un mensaje malicioso en la intranet y este lee información de mi contexto y la envía a un tercero.

De XSS sabe bastante PHPNuke, debido a la importancia que adquirió el producto hace algunos años, todos los malotes de internet se dedicaron a intentar explotarlo para acceder a sitios en internet. Por desgracia le encontraron fallos de XSS y muchos sitios fueron comprometidos.... coders del mundo!!! que la seguridad no es un añadido, que es un requisito!!

¿Hay formas de evitarlas?

Bien es cierto que aunque sean un mecanismo de protección para el usuario final, a los desarrolladores nos tocan un poquito las narices, no? Pero como dicen las canas... no nos  preocupemos, que menos la muerte, todo tiene solución :) ( hay mashups por ahi, no? )

Tenemos varias opciones para acceder a ese contenido alojado en otro servidor desde el browser donde se ejecuta nuestra aplicación, veamos las más habituales:

Proxy

Hacemos que el script o la aplicación llamen a un proxy del servicio remoto que hemos puesto en nuestro servidor web. De modo que si yo quiero información de twitter, en lugar de llamar desde Silverlight al servicio de twitter, lo que haré será llamar a un servicio web que esté en mi servidor y desde este servicio web alojado en el backend, llamar al servicio de twitter.

CrossDomain.xml   y ClientAccessPolicy.xml

Son archivos que van a indicar que el servidor ajeno a nuestra aplicación confía en las llamadas. De modo que siguiendo con lo de twitter... si estos archivos están presentes en el sevidor de twitter, y permiten acceso a nuestro dominio, podremos acceder desde las aplicaciones cliente, por ejemplo

twitter.com/crossdomain.xml  - static.flickr.com/crossdomain.xml

Para Silverlight en MSDN How to- Make a Service Available Across Domain Boundaries

En otro post veremos ejemplos específicos a Silverlight y ASP.NET AJAX :)

Más información sobre las Cross Domain Calls en MSDN ( Client Side Cross-Domain Security )

http://code.msdn.microsoft.com/xdsecuritywp/Release/ProjectReleases.aspx?ReleaseId=1157

Hapy Hacking!!

  Ds

Olimpiada de cursos online MSDN

ok, si, de acuerdo, es un título horrible... pero por estas fechas algo hay que decir de los Juegos Olímpicos, no? x)  Me encantan y es una verdadera pena que sean cada tanto tiempo, aunque no creo que sea yo solo verdad?  o acaso,  a alguien lo le gusta ver los 100m lisos? o venga, que levante la mano el que no se quede embobado mirando a los de saltos sincronizados o a los gimnastas en las anillas.

Me pego verdaderas jornadas maratonianas viviendo los diferidos con toda la pasión del más puro directo, eso sí.. con la certeza de cómo están las medallas asignadas pero con la curiosidad de cómo se ha llegado a ese resultado ( habéis visto el españa china en blanoncesto??? ese último cuarto y esa prorroga? mira que sabía que ganábamos pero me estaba comiendo los dedos en el diferido ).

Por otro lado, además del interés que nos pueda suscitar una u otra disciplina deportiva, hemos de reconocer que también es una manera de pasar el tiempo, no?  ( las pruebas de ciclismo en ruta, contrarreloj, marcha ... anda que no pasamos minutos embobados entre que pasa y no pasa algo)  Este tiempo invertido en los Juegos Olímpicos nos plantea un problema....qué haremos cuando se acaben?

>>>Horror, pánico.... sudor frío... q será de nuestro tiempo libre?

Pues yo os tengo una propuesta O=)  al igual que el año pasado, aprovecho esta temporada que para muchos es más relajada laboralmente hablando, para recordaros la disponibilidad de los cursos online gratuitos de formación en MSDN. Seguro que encontráis alguno que os puede ayudar en vuestro día a día o en vuestro plan de carrera.

Por ejemplo:

Curso de Expression Web

Curso de Silverlight

Curso de Servicios Web

...

Veréis que hay algunos que estan con la versión 2005 de Visual Studio, estamos en proceso de actualizarlos a VS2008 y .NET 3.5 Iremos avisando por aquí de la disponibilidad de esos cursos.

Os lo recuerdo... adoramos el feedback, es la única manera que tenemos de mejorar y de intentar ayudaros con lo que necesitéis, a si que hacednos llegar cualquier comentario de los cursos, esta habilitado el contacto en el blog para lo que necesitéis.

Espero que os sirvan de ayuda ;)

Disfrutad de las merecidas vacaciones, de los juegos, de la cerveza con limón y happy hacking!!

Estudiante y viviendo en Madrid ( España ) ???

Al igual que el año pasado, volvemos a la carga para ver si algún estudiante se anima a venirse con nosotros de becari@ de comunidades técnicas  :)

¿Estudiante de qué?

Preferiblemente estudios Universitarios en carrera técnica. Antes de que lo mencionéis en los comentarios, ya sabemos que no es lo más justo... hay otros estudios igual de válidos, hay personas que sin haber hecho estudios universitarios son muy válidos para el puesto y personas que acaban estudios de informática sin haber tirado una línea o tocado un cable de red, pero las condiciones de la beca son esas y dependen de recursos humanos :_) Lo sentimos.

¿Con quién trabajarías?

El departamento de Desarrollo y Plataforma de Microsoft. Somos unas 20 personas entre 'evangelistas', marketing, especialistas de producto y un par de managers :)  Algunos nombres que igual has leído por inet o visto en presentaciones por ahi.... David Carmona, Aurelio Porras, Ethel García-Simón, Alfonso Rodriguez, Beatriz Ordoñez, Milagros Moreno, Elisa Garcia, Isabel Gómez...

¿Qué es lo que vas a hacer si te unes al equipo?

Uf... puedes hacer de todo un poco y dependiendo del perfil que tengas... desde tirar líneas, ayudar en una campaña de marketing, trabajar con contenido multimedia, diseñar, trabajar con cosas de sistemas, acompañarnos a eventos / reuniones... todo depende de una combinación de lo que te apetezca hacer y lo que tengamos que hacer por guión. Nuestro departamento es un pequeño Microsoft en sí mismo y hacemos de todo un poco.

¿Hay que ser un semidios de .net para unirse al equipo?

No hace falta ser un guru de tecnología .NET / MS, además de que es un puesto para aprender (ninguno nacemos enseñado) también hay que hacer trabajo en otras áreas: diseño, multimedia, sistemas, desarrollo en otros entornos como php, java, ruby... no solo de programar en C# vive el hombre. Tú cuéntanos que es lo que sabes y que es lo que quieres aprender y vemos como cuadrarlo todo ;)

¿Dónde es la beca?

Es una beca de media jornada en las oficinas de Microsoft en Pozuelo de Alarcón en Madrid.

Si tienesn cualquier otra duda o quieres enviar el CV...

 image

Happy Hacking!

~DS

ASP.NET AJAX UpdatePanel vs ASP.NET PageMethod

He de aclarar antes de empezar que este post no intenta ahuyentar a programadores que estén trabajando o evaluando ASP.NET AJAX, simplemente pretende atraer atención sobre el hecho de que hay que tener cuidado con lo que se hace con los UpdatePanels y no usarlos para todo ;)

Pongamos una simple página ASP.NET AJAX con un botón, al hacer click tendremos una llamada AJAX al servidor para actualizar la hora que se muestra en pantalla.

Ésta es la parte relevante del código

<asp:UpdatePanel ID="up1" runat="server">
    <ContentTemplate>
        <asp:Label ID="l1" runat="server" /> 
        <asp:Button ID="b1" runat="server" OnClick="actualizar" Text="Actualizar"/>
    </ContentTemplate>
</asp:UpdatePanel>       

... el .aspx.cs ...

protected void actualizar(object sender, EventArgs ea)
{
    l1.Text = System.DateTime.Now.ToLongTimeString();
}

Cada vez que se pide la información al servidor estamos haciendo una petición de este tipo

ctl02=up1%7Cb1&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE1NzUzNjc2NjNkZPprXRC88qjwsppC6ijFSkTPpJOl

&__EVENTVALIDATION=%2FwEWAgLmpKatCgK%2B7%2BbtDMzDEjpVzHzhiCikPAfrk6sPE4AT&b1=Actualizar

y recibiendo una respuesta como esta...

129|updatePanel|up1|
            <span id="l1">16:43:17</span> 
            <input type="submit" name="b1" value="Actualizar" id="b1" />
        |112|hiddenField|__VIEWSTATE|/wEPDwULLTE1NzUzNjc2NjMPZBYCAgM
PZBYCAgMPZBYCZg9kFgICAQ8PFgIeBFRleHQFCDE2OjQzOjE3ZGRk+JnW9
BNv8dIcJmqvxt10mIGvh4w=|48|hiddenField|__EVENTVALIDATION|/wEW
AgL38IziBAK+7+btDLtfoq6BnTLgLznM9KGlIW/BK1GH|0|asyncPostBackControlIDs||
|0|postBackControlIDs|||4|updatePanelIDs||tup1|0|childUpdatePanelIDs|||3|
panelsToRefreshIDs||up1|2|asyncPostBackTimeout||90|12|formAction||Default.aspx
|27|pageTitle||Update Panel vs PageMethods|

...y teniendo en cuenta que sólo nos importa la parte en negrita... pues... como que es bastante.... El resto de información es:

En la petición... va la información del viewstate de la página, para que desde el aspx.cs podamos acceder a los controles de servidor y tomar decisiones en base a los valores (además de información de parámetros, eventos...)

En la respuesta...va la información para reconstruir gráficamente la parte de la página afectada por la operación

Pero además de la sobrecarga de tráfico generada, cuando el postback causado por la petición AJAX llega al servidor, con la información del viewstate se recrea la clase Page, se ejecutan los eventos de página, etcétera....lo cual es una sobrecarga para el servidor.

Esto no es malo, siempre y cuando vayamos a trabajar con estado nos hace falta regenerar la clase para poder tomar decisiones en base a los controles y el estado en curso. Pero en el caso que nos ocupa (obtener una fecha/dato independiente) todo esto es excesivo :)

Vamos a ver una alternativa que consume menos ancho de banda y menos recursos en el servidor

ASP.NET AJAX UpdatePanel vs PageMethods

Pero... que es un PageMethod???

Teniendo en cuenta que un aspx internamente es una clase System.web.Page. Un PageMethod es un método dentro de esa clase Page que cumple dos requisitos... es static y esta decorado con el atributo WebMethod. Lo que nos permiten es que podamos llamar desde javascript a un método específico de una página web aspx.

Si tenemos en cuenta que estamos obteniendo una funcionalidad concreta a través de una llamada desde Javascript, podemos decir que es algo """parecido""" a un webservice.

La diferencia fundamental radica en que el PageMethod vive dentro de la página y ésta es el único cliente que puede consumirlo, mientras que el webservice es una funcionalidad que reside en un servicio accesible desde cualquier cliente, es un concepto mucho más amplio :)

En este ejemplo concreto podríamos llamar a un WebService en lugar a un PageMethod, conceptualmente nos da igual.

Vamos al lío....para llamar al pagemethod modificamos un poco el código cliente

Es necesario que habilitemos el trabajo con PageMethods estableciendo el valor de un flag del ScriptManager: <asp:ScriptManager runat="server" id="s1" EnablePageMethods="true" />

Esto va a crearnos un objeto Javascript que se llama PageMethods y que nos va a dar acceso a los metodos "especiales" de la página:

    <script type="text/javascript">
    function actualizar()
    {
        PageMethods.actualizar (actualizarOK, actualizarFAIL); 
    }
    function actualizarOK(result)
    {       
        $get('l1').innerHTML = result;           
    }

    function actualizarFAIL(error)
    {
        $get('l1').innerHTML = "Intentelo mas tarde";
    }
</script>   

Habéis observado que es más incómodo para el desarrollador que el UpdatePanel, dado que ahora somos nosotros los que tenemos que navegar por el DOM para actualizar la parte cliente.

En el lado cliente sólo nos falta modificar los controles ASP.NET para que apunten al Javascript

<asp:Label ID="l1" runat="server" /> 
<input type="button" id="b1" onclick="actualizar();" value="Actualizar"/>

y el servidor... configurar el método como PageMethod

using System.Web.Services;

....

[WebMethod]
public static string actualizar()
{
    return System.DateTime.Now.ToLongTimeString();
}

Lo ejecutamos.....y...vemos que se envía menos información

( De hecho en el cuerpo no va nada... vemos que la petición al servidor es un post a http://server/website/default.aspx/actualizar para invocar al servicio )

y definitivamente vuelve menos información

{"d":"15:56:53"}

Porqué un PageMethod y no un WebService?

A ojo de buen cubero...si dudáis... encapsulad esa información en un webservice, así estará accesible desde más puntos..obviamente habría que ver el caso concreto para ver si realmente no merece la pena tener un webservice, esto sería si la funcionalidad va a ser específica a esa página, en ese caso tiraríamos por un PageMethod

 

Lo dicho al principio

Este post no es para desanimar a nadie en el trabajo con UpdatePanels y AJAX, es para que penséis un segundo antes de liaros la manta a la cabeza y poner updatepanels por todas partes. Funcionar....funcionará, pero... a qué coste? :) 

Happy hacking!

 

David Salgado

RIA y páginas con estado

Como usuarios de internet tenemos patrones de comportamiento adquiridos... imagina que estas navegando por un sitio y has llegado a un punto que no te convence. Llegados a este punto tienes básicamente 3 opciones:

1 - Hacer click en el menú de navegación e ir al paso anterior

2 - Hacer click en el típico logo para volver hasta el principio y empezar de nuevo

3 - Hacer click en el botón de atrás del navegador

Las dos primeras opciones están más trabajadas desde un punto de vista de desarrollo, pero desde un punto de vista de usabilidad, depende de cómo hayas hecho esos enlaces y dónde los hayas puesto para que el usuario los perciba o no. De accesibilidad hablaremos en otro post. La opción 3 estamos acostumbrados a que nunca falle... nos lleva a la página anterior, que conlleva tradicionalmente el estado anterior y listo!

Claro... que si estamos trabajando con aplicaciones p.ej AJAX... no esta tan claro que cada página se corresponda con un estado en la navegación por el sitio web. Al trabajar con Javascript, la parte cliente puede variar tanto como para poder considerar que ha pasado pro diferentes estados.

Esto nos puede afectar tanto a nivel de navegación, como a nivel de guardar un determinado estado en favoritos del navegador.

Imaginemos que tenemos una galería de fotos en Javascript, al hacer click en una foto la mostramos mas grande. Podríamos considerar que tenemos 2 estados diferentes, la galería y la vista detalle; pero al haber estado trabajando con Javascript, las acciones se han realizado en la misma página, de modo que cuando estamos viendo la foto en detalle, no podemos dar atrás en el navegador para ver la vista galería ni guardar la foto en favoritos. No hay un estado que podamos almacenar.

¿ Entonces ?

Bien, entonces lo que nos toca es ser capaces de serializar el estado de una página y almacenarlo de alguna forma que podamos acceder a ella. Y teniendo en cuenta las diferencias que tenemos entre navegadores... fácil, no?  x)

Para ilustrar el post he creado una pequeña aplicación de ejemplo que os podéis descargar en este enlace

Creando el estado

El estado pueden ser infinidad de cosas... cómo se esta mostrando la página, que valores tienen los controles... lo primero que debemos tener claro es qué es un estado y qué lo forma.

En el ejemplo que tenemos, el estado va a implicar una u otra foto en primer plano, de modo que lo que hemos de preservar es la dirección de la foto a mostrar.

 Almacenando el estado

Aqui es donde la matan x)  Lo más fácil a día de hoy para programadores .NET es utilizar las asp.net 3.5 extensions preview, el Microsoft.Ajax.js ha sido actualizado con unos prototipos para el manejo del estado. Tiene como ventaja que podemos trabajar con el estado tanto desde el cliente como desde el servidor.

Si os habéis descargado los laboratorios que comentaba en un post anterior, tenéis los siguientes proyectos para practicar y echarle un primer vistazo

NETFramework35Enhancements_TrainingKit\Labs\AspNetAjaxHistory

Hoy... por ser miércoles... vamos a hacerlo con la parte cliente de la librería.

Lo primero y muy importante ...

En el scriptmanager de la página poned la propiedad EnableHistory a true

<asp:ScriptManager ID="ScriptManager1" runat="server" EnableHistory="true" >

Esto va a añadir un iframe a la página cliente para poder hacer los trucos Javascript que tendríamos que hacer nosotros a mano, si echaís un vistazo al fuente de la página en el cliente...

<iframe id="__historyFrame" src="/WebSite1/ScriptResource.axd?d=mfsa1_YluC_H6UGgoZq8xp82Y2Fwlt3V_nmPLNbI8rE1" style="display:none;">

;)

Una vez hemos habilitado el iframe, vamos a trabajar con los nuevos objetos en javascript para manejar el historial. Primero vamos a subscribirnos al evento de navegación, así tendremos control sobre lo que pasa cuando el usuario navega

function pageLoad()
{
    Sys.Application.add_navigate(onNavegar);
}

function onNavegar(sender ,e)
{
    if (userNavigated)
    {
        restaurarEstado(e.get_state());
    }
}

La variable userNavigated nos va a ayudar a discernir entre una navegación provocada por el usuario o una provocada por nosotros desde desarrollo. Tras implementar estas funciones, sabemos que cuando el usuario navegue se va a llamar a nuestra función restaurarEstado

Como hemos dicho antes, en esta aplicación sencilla el estado va a consistir en la dirección de la imagen a mostrar, de modo que para restaurar el estado sólo hay que recuperar la imagen guardada y mostrarla

function restaurarEstado ( estado )
{
    var RutaImagen = estado.RutaImagen;
    if ( RutaImagen == null || RutaImagen == "")
    {
        RutaImagen = ImagenXDefecto;
    }
    $get("fotoGrande").src = RutaImagen;
}

La variable estado la cargamos y la almacenamos nosotros cada vez que queramos almacenar un estado nuevo.

Llegados a este punto ya tenemos una aplicación que es capaz de recuperar un estado grabado y mostrarlo en la página. Lo único que nos falta es saber cómo almacenar el estado. Si miramos el código HTML, vemos que cada vez que se hace click se llama a un método que muestra la foto

<li><img src="imgs/VisitaBilbao01.JPG" alt="Vacas" id="i1" onclick="MostrarFoto(1)"/></li>

Dada la naturaleza de la aplicación de ejemplo, esta es la acción que va a implicar que queramos almacenar un nuevo estado, porque así el usuario podrá navegar atrás y adelante por las fotos con los botones del navegador. Vamos a ver la implementación

function MostrarFoto(id)
{
    var img = "imgs/" + fotos[--id];
    $get("fotoGrande").src = img;
    almacenarEstado(img);
}

function almacenarEstado( img )
{
    var pageState = { "RutaImagen" : img };
    Sys.Application.addHistoryPoint(pageState,img);
    userNavigated = true;
}

Es muy sencillo, creamos un objeto con el estado de la página (pageState) y se lo pasamos como parámetro a Sys.Application.addHistoryPoint. El segundo parámetro que recibe es el nombre con el que se va a almacenar ese estado en el historial. El echo de añadir un nuevo estado, internamente va a trabajar contra el iframe y va a provocar una navegación, para diferenciar esta navegación de una iniciada por el usuario, marcamos el userNavigated a true.

y listo :)

 

Otras opciones

Como comentaba más arriba, podéis utilizar infinidad de frameworks javascript o controles descargados de internet para que os gestionen el estado, de hecho si os animáis podéis programaros el vuestro propio...

<bricomania> mantenéis un hashtable indice/estado, cada vez que haya un nuevo estado, se marca la url con el índice nuevo y se añade el nuevo estado al hashtable. Cuando el indice de la url no se corresponda con el indice actual, recuperáis del hashtable con el índice de la url como base y establecéis el nuevo estado en la página.... </bricomania>

...bien.. no es tan fácil... hay que lidiar con las diferencias entre navegadores, ver cuándo cambia la url y en base a qué, tener en cuenta navegación hacia atrás y hacia adelante... realmente un framework os ahorrará bastante tiempo :)

Happy Hacking

Ds

Lectura interesante sobre el tema de almacenar y recuperar estado

http://yuiblog.com/blog/2007/02/21/browser-history-manager/
http://weblogs.asp.net/bleroy/archive/2007/09/07/how-to-build-a-cross-browser-history-management-system.aspx

Un poco de windbg aplicado...

Ayer Rodrigo planteó un problema curioso en su blog, dios que rabia me dio no tener las herramientas instaladas en el portatil que tenía en casa!!!  sólo tenía ie y una tarjeta 3G para navegar por la red, a si que ni si quiera pude bajármelas :_)

Pero esta mañana me he puesto con ello en cuanto he llegado a la oficina :P

Ahí va la aproximación que yo he seguido para intentar atajar el problema.

(Nota: Por si alguien lo intenta resolver... tened en cuenta que las direcciones de memoria vana  variar siempre y tenéis que buscar las que os apliquen a vosotros)

Empezando con el problema

Como es Rodrigo quien dice que la aplicación pierde memoria, pues me lo creo y listo, así que asumo que una vez la ejecute va a empezar a crecer la memoria. Hay un montón de herramientas para ver cómo crece la memoria, que tipo de memoria es la que crece, etcétera... una de las alternativas es adjuntar un depurador al proceso y pararlo cada X tiempo para ver como esta la memoria del proceso.

Herramientas

Como depurador he utilizado el WinDBG, diponible en las debugging tools for windows

Depurando el proceso

Compilamos y ejecutamos el ejemplo que nos pone Rodrigo.

Arrancamos WinDBG y Vamos a File .. Attach To Process y escogemos el proceso que acabamos de arrancar (buscad el pid adecuado).

image 

En la ventana de command del depurador vemos información del proceso, esta parado esperando a que introduzcamos alguna orden.

image

Por ahora no vamos a hacer nada... vamos a volver a activar el proceso para que siga corriendo un rato y empiece a cargarse la memoria, de modo que en la ventana de comandos, introducimos el comando g y damos a intro

image

Al de un minuto (por ejemplo) pulsamos ctrl + break ... asi pararemos el proceso e inspeccionaremos su estado actual. Dado que Rodrigo nos ha dicho que es un problema de memory leak... vamos a tiro hecho y buscamos información sobre objetos que se acumulan en el managed heap (normalmente no es tan fácil y hay que invertir tiempo en determinar a que tipo de problema de memoria te enfrentas)

Obteniendo la información de referencia

Lo primero que vamos a hacer es cargar la SOS.dll. Esta librería es una extensión del depurador que nos va a permitir movernos por estructuras de datos manejadas por el CLR, de modo que nos facilita la depuración de código .net. Para cargarla ejecutamos este comando

.loadby sos mscorwks

Una vez esta cargada la extensión podemos usar sus comandos. Vamos a ver cuales son los objetos que hay en el managed heap

!dumpheap -stat

De la salida del comando nos quedamos con las últimas líneas (mayor número de objetos en memoria) y guardamos los números para poder compararlos en la próxima parada

790fd8c4     5632       345980 System.String
003ec570       18       4064392      Free
7912d8f8     2514      4291592 System.Object[]
79104c38   771803    12348848 System.WeakReference

Una vez apuntado, volvemos a ejecutar el comando g y dejamos que el proceso corra durante otro rato, para ver si varían los números.

.... ( minutos musicales mientras el proceso corre ) ...

Volvemos a pararlo de nuevo con ctrl + break y volvemos a mostrar los objetos en el managed heap como antes

790fd8c4     5632       345980 System.String
003ec570       19      8258724      Free
7912d8f8     3678      8516160 System.Object[]
79104c38  1308060     20928960 System.WeakReference

Vemos que los Strings se han conservado, pero las WeakReferences han crecido ( 12348848 vs 20928960 ). Es recomendable hacer este proceso unas cuantas veces para tener mas muestras y poder establecer una tendencia :)

Una vez vemos que las weakreferences crecen, hemos de saber porqué.... a si que entramos en modo diagnostico diferencial de house...

house> ¿por qué no se liberan?

chase> será lupus?

cameron> no creo.. puede ser que alguien mantenga una referencia a ellos y por eso no los recoja el GC

house> ok.. analitica completa, TAC, rajadlo y mira las referencias que apuntan a los objetos weakreference

Para mirar las referencias, primero necesitamos saber la dirección en memoria de los objetos. Tomemos la salida del comando !dumpheap -stat, si nos fijamos en la fila relativa a las wekreferences

79104c38  1308060     20928960 System.WeakReference

El primer valor es la MethodTable del tipo, ahora que la conocemos, podemos ejecutar un comando que vuelca todos los objetos de una determinada method table

!dumpheap -mt  79104c38 

(el resultado hara scroll en pantalla varias veces, podéis pararlo con Ctr+break) Ahí tenemos todos los objetos del tipo, vamos a ver quién les esta referenciando y manteniéndolos vivos. La salida del comando tiene el siguiente formato: Dir.Objeto Dir.MethodTable Tamaño

Tomamos unas cuantas direcciones de objeto y ejecutamos el siguiente comando sobre ellas

!GCRoot dir del Objeto

Nos muestra la relación de referencias que mantienen vivo al objeto. Vemos al volcar unas cuantas que hay System.Collections.Generic.List que las referencia

0:003> !GCRoot 02497570
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread 179c
Scan Thread 2 OSTHread 1624
DOMAIN(003E4AC0):HANDLE(Pinned):a13f0:Root:02df3030(System.Object[])->
01df4300(System.Collections.Generic.List`1[[System.WeakReference, mscorlib]])->
035d52e0(System.Object[])->
02497570(System.WeakReference)

Para seguir asegurando...

Volcamos la genericList y vemos su tamaño

!do 01df4300

79102290  40009c8        c         System.Int32  1 instance  1308060 _size

dejamos correr un rato al proceso ( g ) y volvemos a comprobar el tamaño del objeto ( ejecutamos el mismo comando )

79102290  40009c8        c         System.Int32  1 instance  1524568 _size

BINGO!!!  va creciendo woooooohoooooo

Si estuviésemos en un proyecto grande habría que localizar el assembly y volcar el código para ver que pasa.... como estamos en un ejemplo pequeño es fácil... no hay ningun array en nuestro código.. a si que con ayuda de reflector miramos la clase TraceSwitch... que nos lleva a Switch... y al siguiente código (resumido)

   lock (switches)

   {

       switches.Add(new WeakReference(this));

   }

El array switches crece indefinidamente y no se liberan las weakReferences (se liberan los strings a los que apuntan las weakreferences pero no estas en sí)

y ahora qué?

Pues he estado mirando por la web y no puedo decir aun si es un bug o si hay alguna consideración que nos hayamos saltado a la hora de trabajar con el TraceSwitch, en cuanto lo sepa os lo cuento

 

<update 28/4/08>
Tenemos respuesta del grupo de producto, es un bug corregido para la próxima major relase de .net :)
</update 28/4/08>

Happy Hacking!

David Salgado

.NET 3.5 Enhancements training kit

 

Hola a todos,

Si bien no me gusta hacerme eco de noticias  que salen por otros blogs, esta es una ocasion especial. Creemos que esta puede resultar de interés. Se ha publicado el .net 3.5 Extensions Training Kit. Es un recurso de formación (demos, hands-on-labs, doc... update 21/04/08 Por ahora solo 6 hands on labs) que cubre las siguientes tecnologías:

ADO.NET Data Services

ADO.NET Entity Framework

ASP.NET AJAX History

ASP.NET Dynamic Data

ASP.NET MVC

ASP.NET Silverlight Controls

Os recuerdo que por ahora estas APIs no vienen por defecto con .net 3.5 y se instalan aparte. Espero que os sirva de ayuda, aquí os dejo el enlace al post original

HappyHacking!

David Salgado

MIX Essentials Madrid se retrasa a Octubre

Hola a todos!

Extraña noticia, no? Sobre todo teniendo en cuenta el último post donde comentaba que la agenda se estaba cociendo y que solo faltaba poco más de un mes x)

La decisión viene motivada por un motivo fundamental... y es que este verano van a pasar algunas cosas en el entorno Microsoft  <aclaración> no, no puedo hablar claro :D prefiero conservar mi trabajo :P </aclaración> De modo que cubriremos el contenido del MIX de Las Vegas y las cositas que pasen en verano en el MIX en Octubre.

Os iremos avisando a través del MSDN Flash y de este blog de las novedades en cuanto al MIX, ponentes, agenda, posible concurso }=P según se acerque más la fecha....

¿Por qué no antes? .. porque la mayoría estáis de vacaciones y no queremos darnos la charla para nosotros solos :)

¿Y mientras tanto que? .. No os preocupéis, si bien no vamos a tener ahora en mayo el evento presencial que habíamos previsto en un principio, ya le hemos estado dando al coco para ver algo de contenido de otras formas ;)

¿Grabaremos el evento? .. Si, nuestra intención es cada vez ir grabando más contenidos en diferentes formatos (evento, screencast, entrevistas, webcast... ) y ponerlos disponibles en la red.

¿? 42

Lo siento si alguno de vosotr@s estaba planificando ya el viaje, a mi tb me hacía ilusión tener un evento grande ahora... pero confío en hacer algo grande en Octubre, además así tenemos más tiempo para ver/hacer más cosas :)

happy hacking

David Salgado

Se esta cociendo: MIX Essentials 2008 - 20/5 - Kinepolis Madrid

Algunos conocéis el MIX 08 de Las Vegas, el año pasado hicimos un evento similar en españa, el ReMIX. Este año volvemos a la carga, por causas de guión, este año se llamará MIX Essentials :)

Estamos intentando construir una agenda de lo más completa posible para todos... pero os preguntaréis  ¿quienes son todos?  El evento está destinado a desarrolladores de escritorio, desarrolladores web, creativos, diseñadores web, agencias de publicidad... De modo que habrá contenidos de todo tipo, tanto de tecnología, como producto, como tendencias.

Algunos cotilleos...

- Para asegurarnos de que hay contenidos para todos, tenemos 3 salas de Kinepolis en paralelo, aproximadamente unas 15 sesiones en un día!!  Ya podéis veniros con la agenda pensada de casa ;)

- Habrá un concurso curioso online

Por ahora no os podemos adelantar nada más. Al más puro estilo de Scott Guttrie, iré publicando más información sobre el evento en los próximos días. 

ciao!

Post-Lanzamiento Pre-Roadshow :)

De vuelta al frente!!!!! ;)

Gracias a todos por pasaros por el Evolution Show / Lanzamiento / Developer Day / lo que pasó la semana pasada en Madrid, espero que os lo pasaseis la mitad de bien que yo...y eso que a penas pude pasarme un rato por cada una de las sesiones que quería ver :_)

Feedback...No os imagináis como de importante es el feedback que nos dais en estos eventos, nos ayuda a cambiarlos para intentar que os gusten más la próxima vez, os pasaremos una encuesta a los que vinieron por si queréis contribuir a mejorar los eventos que tengamos con vosotros en el futuro. De todos modos.. si tenéis cualquier comentario...o bien ponedlo en los comentarios o mandadlo a devlanzamiento2008 en hotmail.com

Por mi parte...Aquí tenéis los enlaces a las sesiones que impartí en el Lanzamiento, colgaré un screencast con las demos (uno de vosotros me dio el correo para que se las enviase pero por ahora no lo encuentro! lo enviaré en cuanto lo encuentre)

Vs08 y .net 3.5 para desarrolladores Windows

Frameworks Web

El resto de contenidos del evento...Estamos esperando todas las sesiones de todos los ponentes antes de publicarlo, además también grabamos las sesiones principales del auditorio B, de modo que en cuanto las saquemos de la camara, codifiquemos, colguemos...os lo notificaremos

A los que NO pudisteis pasaros... no os preocupéis,...vamos a por vosotros! :) Obviamente no vamos a poder tener un evento de dos días como el que tuvimos en Madrid, pero estamos preparando el contenido para reproducirlo por otras ciudades en el Visual Studio 2008 on tour


El tour oficial lo haremos por estas 5 ciudades, por favor recordad que aunque seamos Microsoft, no tenemos recursos ilimitados para ir a todos los sitios que nos gustaría :_)

Barcelona ( 11 de Marzo )

Valencia ( 13 de Marzo )

Sevilla ( 25 de Marzo )

Bilbao ( 27 de Marzo )

Coruña ( 01 de Abril )

También existe la posibilidad de acudir a los eventos que están realizando los grupos de usuarios. Algunos están organizando eventos para reproducir parte del contenido de las sesiones que se dieron en el Evolution Show/Lanzamiento/Developer Day... Por ejemplo, el grupo de usuarios de Baleares tiene previsto celebrar su aniversario el 28 de Marzo. Y tienen contenidos de las novedades de VS08 y .NET 3.5, si no me traicionan los aviones allí andaré yo también.

 

Happy Hacking!

tienes dudas??

Este miércoles 6 de Febrero salgo hacia estados unidos a un evento de Microsoft para empleados, el TechReady. Durante una semana tenemos sesiones por parte de grupos de Microsoft y compañeros para formarnos en cómo están las cosas y hacia donde van.

NO penséis que es un sitio de secretos de estado, personalmente no he tenido ninguna gran revelación en los Techready que no haya visto antes por internet :)

Normalmente las sesiones son muy parecidas a las del Teched / ITForum, con los mismos ponentes, pero podemos aprovechar a conocer a otros compañeros para ayudarnos a lo largo del año.

El evento es del 11 al 15 de Febrero, pero yo me voy antes para tener reuniones con algunos grupos de producto. Algunas de estas reuniones son en tono informal, donde me gusta poder dar feedback del producto o preguntar alguna cosa que nos haya pasado con el.

El caso es que me voy a ver con los chic@s de Data Programability y del Garbage Collector, de modo que si tenéis cualquier duda (Garbage Collector, Entity Framework, Sync Services ) por favor hacedmela llegar que yo intentaré volver con una respuesta

Para no convertir los comentarios del blog en un foro de discusión os agradecería que enviaseis las dudas a este correo: devlanzamiento2008 en live.com  (si es el que di para el call for papers, pero ahora lo reutilizo para esto )

Gracias!!

Happy Hacking!

...a ver si en los aviones y en los momentos de jetlag acabo la serie de posts que os tengo preparados ;)

...prometo documento fotográfico exhaustivo y crónica mediante twitter

...http://xkcd.com/378/  -=)

Sobre 30 sesiones para escoger durante 2 dias!

 

Se están acabando de cocer los Microsoft TechDays, de ahi lo de ... sobre 30 sesiones... lo que hasta ahora se llamaba 'evento de lanzamiento de Windows Server 2008, SQL Server 2008 y Visual Studio 2008 ' ya tiene nombre oficial.

Será durante el 26 y 27 de Febrero del 2008, en el Palacio de Congresos de Madrid en IFEMA, y a lo que vamos.... los desarrolladores tendremos sobre 30 sesiones técnicas donde intentaremos que podáis ver información a todos los niveles sobre el nuevo producto y las mejoras en la plataforma de desarrollo.

Por ejemplo:

WCF a fondo, WF Services, Sharepoint como plataforma de desarrollo, Evolución en la plataforma de acceso a datos, Silverlight a fondo, Acelera el desarrollo con Frameworks... muahahahah }=)

Aquí tenéis la Web oficial (nos falta actualizar la agenda final y la página de héroes)

Un documento gráfico de que estamos manos a la obra con el evento ;)

Os dejo con unas palabras de Antonio Gómez, PM de Visual Studio ;)

update 11/03/08 ... ya lo he quitado pq pasó su momento :)

Happy hacking!

Para los locos de los atajos de taclado

 

Los que hayáis estado en alguna sesión conmigo ya sabéis que me encantan los atajos de teclado, que si alt + shift + F10 para ayudas de contexto, que si Shift + F7 para cambiar de vista...si...como suelo comentar..lo típico para abrir conversación con el sexo opuesto un sábado por la noche x)

En los TechEd solía haber unos papeles donde podíamos ver los atajos de teclado para Visual C# y VB. Ayer por la noche en un momento de inspiración escribí un correo a Karen Liu (Program Manager de Managed Languages) y le pedí que me pasase una referencia para poder imprimirlo para algún evento.

Esta mañana tenía en mi correo un enlace para descargarnos el poster de keybinings de C# en pdf :D  wohoooo!!!

http://www.microsoft.com/downloads/details.aspx?FamilyID=e5f902a8-5bb5-4cc6-907e-472809749973&DisplayLang=en?

Happy Hacking!!

habemus demos....

Hola a tod@s!

En los útimos eventos que hemos tenido os he ido comentando que subiría las demos al Blog...bien..por fin ha llegado ese dia!! Creedme que no he estado parado, pero subir las demos requiere comprobarlas, recopilarlas...y no era capaz de reservar una horilla para hacerlo todo. Bien... qué podéis encontrar por aqui

 

Demos de PureCode

En este evento tratábamos de que la gente que no trabaja con .NET o con tecnología Microsoft pudiese aprovechar ciertas partes de nuestra plataforma. En concreto veíamos como sacarle partido a ASP.NET AJAX desde PHP. En estas demos, vamos transformando una página PHP tradicional en una página que utiliza el framework de ASP.NET AJAX y phpmsajax (una iniciativa de Steve Marx alojada en CodePlex), para lograr la misma funcionalidad, pero asíncrona, con componentes de UI y consumiendo un objeto JSON que encapsula los servicios.

Enlace a las demos

Enlace a la presentación de ASP.NET AJAX

Enlace a la presentacion de Windows Live

 

Demos de talleres de ASP.NET AJAX utilizado desde Visual Studio y .NET

Esto esta totalmente orientado a desarrollos .NET. Hemos visto en varias cuidades algunas cosillas sobre como mejorar el trabajo con UpdatePanels (diferencia entre cnditional y always), truquillos con la libreria de AJAX en cliente (WebRequest, Debug, JSON, Encapsulación) y el PageRequestManager para controlar el ciclo de eventos en cliente, consumo de servicios web...

Enlace a las demos de AJAX y alguna de Windows Live  (No incluye demos con el toolkit de WL para Visual Studio)

Enlace al ASP.NET AJAX control toolkit

 

Demo de como incluir messenger en tu página / blog para que te contacten

Es bien sencillo, pero dada la expectación que levanta en las sesiones, vamos a ver en detalle como incluir en tu página web una ventana de messenger para que un visitante de la web te contacte sin ser un contacto de tu lista. En MSDN esta la correspondiente página donde se explica el API (presencia e IM control).

El hecho de que se pueda abrir desde cualquier página web una conversación de messenger a un usuario que esta logueado en su máquina es una combinación de dos APIs. Por un lado esta la Presence API, es la encargada de exponer el estado de un usuario dentro de la red de messenger. Y por otro lado está el IM Control que es una especie de Widget (en el desarrollo para los servicios de Windows Live, el término Widget no está muy presente, se utiliza más WebControl) que muestra una ventana para contactar con el usuario que ha expuesto su presencia.

Primero has de ir al siguiente sitio web para indicar que efectivamente, quieres permitir que cualquier persona en internet pueda saber si estas o no online en tu messenger

Enlace a aplicación web para exponer nuestro estado en messenger

Una vez hemos expuesto nuestro estado, en la sección de Create HTML podemos copiar code snippets para pegar en nuestra web, pero nosotros vamos a consultarlo a mano. En la zona de Create HTML échale un vistazo a que ID te ha asignado messenger, será algo de este estilo...

         XXXXXXXXXXXXXXXXXX@apps.messenger.live.com

Ahora incluye una sección de script en tu página web susituyendo las XXXXXXXXX por tu ID

<script type="text/javascript" src=http://applications.messenger.live.com/users/XXXXXXXXX@apps.messenger.live.com/presence/?cb=funcionCallback>

Véis que pasamos como parámetro una funcion de callback, en esta vamos a recibir un objeto JSON con el siguiente payload

 "status": "Online", 
  "statusText": "Online", 
  "id": "XXXXXXXXXXXXX@apps.messenger.live.com", 
  "displayName": “David Salgado", 
  "icon": {    "url":"http://settings.messenger.live.com/Conversation/img/Status_Online.gif",     "width": 16, 
   "weight": 16 
  }

De modo que en la función, podemos ver si la persona esta online y si es así incluimos el IM Control para que la persona sea contactable

function checkpresence(presence)
{
if (presence.statusText == "Online")
 {
 $get("msngform").innerHTML = "<iframe  src=\http://settings.messenger.live.com/Conversation/IMMe.aspx?invitee=XXXXXXXXXX%40apps.messenger.live.com&mkt=en-US\ width=\"300\" height=\"300\" style=\"border: solid 1px black; width: 300px; height: 300px;\" frameborder=\"0\"></iframe>";
 }
}

Hala! ahora os toca probarlo :) por último os paso el enlace de la página de desarrollo en Windows Live Services por si queréis echar un vistazo a algún otro servicio ;)

 

Creo que no se me olvida nada, pero si me dejo algo...dejadme comentario para que lo suba.

 

Happy Hacking!

~DS

More Posts Next page »
Page view tracker