viernes, 26 de junio de 2015

Forman Equipo Microsoft, Google and Mozilla para agilizar el procesamiento de los navegadores

Buenas, hoy quiero escribir, mmmm, más que escribir comentar, sobre algo que está por pasar en la web y sobre los navegadores web, es algo que me sorprendió a pesar de que ya lleva un tiempo la noticia pero me entere apenas ayer.

Cuando lees “Microsoft, Google and Mozilla team”, pues hombre eso causa atención completa, ¿Microsoft haciendo equipo?, pues dirás desde hace rato están haciendo equipo, si, si, pero ahora lo hacen más seguido, y lo que esta pasado ahora ultimo con Microsoft, pues es sorpresivo como por ejemplo dejar libre el .Net Core eso es genial, depronto escribere algo sobre ello, te imaginas compilar y ejecutar codigo en .NET en plataformas Linux, MacOS, iOS y Android, puufff la pasada mano yo pense que eso nunca pasaria.

Bueno pero esta este grupo se ha formado para hacer que los navegadores interpreten más rápido el código y de esta forma se ejecuten de manera más eficiente las aplicaciones web, en si en lo que están trabajando es en desarrollar un WebAssenbly (como yo lo veo es como una especie de bytecode), que promete una forma de compilar el código fuente de las aplicaciones web de tal forma que el navegador lo procese más rápido; algo que me gusta segun dicen, es que al compilar código en C++ (seee c++, es uno de los lenguajes que más me gusta) se puede conseguir un 70% de la velocidad nativa de los navegadores; bueno, bueno y que tal si estas empresas se les da por estandarizar el motor de renderizado, pues hombre, eso sí que nos facilitaría la vida a nosotros y mas que todo a los diseñadores web o los frontend de la web, eso seria lago maravilloso; bueno pues dejo el link de la noticia y como vez es del 18 de junio del 2015 y un link donde explican un poco mas como funciona esto del WebAssenby, aaaah y dejo la misión del grupo.

“The mission of this group is to promote early-stage cross-browser collaboration on a new, portable, size- and load-time-efficient format suitable for compilation to the web.”



domingo, 31 de mayo de 2015

Postback en ASP.Net desde el cliente javascript

Cuando inicie en el desarrollo de aplicaciones web dinámicas, inicie con ASP.Net y me gusto realmente, creo que fue más por el entorno de desarrollo, ya que para ser franco el mejor debbuger que he usado ha sido el de Visual Studio, algún día escribiré sobre mis inicios en el desarrollo web jeje; cuando estaba aprendiendo ASP.Net en ese entonces lo primero que hay que tener claro es el concepto de postback, para decirlo de una manera simplista digamos que es el enlace entre el cliente y el servidor cuando se genera un evento en alguno de sus controles desde el lado del cliente y de esta forma enviar la página nuevamente al cliente con las modificaciones respectivas, claro que hay que agregarle más mecanismos como el de mantener la información entre los llamados y más (perdón desarrolladores de .Net por explicar así de simple, ja escribir es tedioso a veces).

Cuando ya se ha desarrollan algunas páginas, siempre entra la duda de cómo hacer un llamado a los métodos del code behind desde el lado del cliente o mejor desde javascript, es algo lógico cuando se inicia, el motivo al escribir este post fue eso, una pregunta, una pregunta que nos formular los nuevos desarrolladores y con esto no quiero decir que lo sé todo, es más siento que conozco muy poco de ASP.Net a pesar de llevar 6 años (fecha actual 2015) desarrollando en esta tecnología, pero como uno de mis objetivos es ayudar pues escribiré sobre la cuestión en marcha.

ASP.Net provee de un forma de realizar el postback desde el cliente, es algo que nació con ASP.Net debido a cómo funcionaba ASP, en si es una mejora que implementaron para su tecnología pero como todo, eso depende desde el punto de vista en el que se mire.

Esta forma de realizar un postback, se logra gracias a un método de javascript, este es el __dopostbak(), y su implementación es la siguiente:

       function __doPostBack(eventTarget, eventArgument) {
            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                theForm.__EVENTTARGET.value = eventTarget;
                theForm.__EVENTARGUMENT.value = eventArgument;
                theForm.submit();
            }
        }

Es una función sencilla pero poderosa, así deben ser las cosas; esta función tiene dos parámetros de entrada, eventTarget es el identificador del control que causa el postback y eventArgument es información adicional asociada al control y/o acción que se desea realizar, además de esto la implementación de esta técnica tiene dos controles HTML que son los siguientes.

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

Bueno ya te puedes imaginar para que se definen, correcto ya lo tienes, es para que el valor se pueda acceder desde el code behind de nuestra página osea para identificar qué control ha realizado el postback en simples palabras; esto se realiza automáticamente en ASP.Net para la gran mayoría de los controles. Para tener en cuenta, según la definición que se encuentra en MSDN, en ASP.Net hay dos controles que realizan el postback digamos que de forma nativa (Button y ImageButton), los demás controles usan el método __dopostback y los input ocultos para tal propósito al igual que vamos hacer nosotros para dar una solución posible a la cuestión en marcha, digo posible porque pueden existir otras soluciones.

Listo, centremonos en el caso, necesitamos llamar a un método creado en el code behind desde el cliente para ejecutar alguna tarea en específico  (bueno desde una función javascript desde el cliente, hay que especificar ahora, porque ya se usa javascript desde el lado del servidor), para que este truco funciones (si truco, debe existir una forma más elegante e ingenieril :/ ), se necesita que nuestra página tenga algún control de servidor y que no sea ni el Button o ImageButton, y ¿Por qué será?, si señor, correcto es por eso, que atentos están.

Para realizar esto crearemos un proyecto web en visual studio express (voy a usar el 2013), lo nombrare Demos para ejemplos futuros, que sea limpio (Empty) y seleccionare tecnologías Web From, MVC, Web API, osea todo lo que me puede ofrecer, como dicen por ahí “pensando en el futuro”.


Listo, ahora se agregara un formulario nombrado DoPostback, la idea es simple agregar un control de servidor (TextBox) y ponemos el atributo AutoPostBack en true, se creara un elemento div con su evento onclick que llamara a una función javascript en la cual realizaremos el llamado a la función en el code behind, un ejemplo sencillo pero es para mostrar la idea a la cuestión. Ahora sí, manos a la obra.

El Código HTML (resumido).

<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo dopostback</title>
    <script type="text/javascript">
        function LlamarMetodoCodeBehind() {
            var accion = document.getElementById('txtEventArgument').value;

            if (accion === 'servidor1') {               
                __doPostBack('divCliente', 'Evento1');
            }
            else {
                __doPostBack('divCliente', 'Evento2');
            }
        }
    </script>
</head>
<body>
    <form id="frmDopostback" runat="server">
        <header>
            <h1>Demo DoPostback</h1>
        </header>
        <div>
            <div>
                <asp:TextBox ID="txtEventArgument" runat="server" AutoPostBack="True"></asp:TextBox>
            </div>
            <br />
            <div id="divCliente" style="width:150px; height:20px; background-color:ButtonShadow" onclick="LlamarMetodoCodeBehind();">
                Llamar Servidor
            </div>
        </div>
    </form>
</body>
</html>

Aquí se puede observar tanto la función javascript como los elementos html que se definieron para el demo, valga aclarar que el control TextBox (txtEventArgument) tiene activo el AutoPostBack con el fin de que se agrega el método __doPostBack() en el cliente, si no, en la función javascript se generaría un error de método no implementado.

Code Behind (Resumido)

              protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                string idControl = Request.Params.Get("__EVENTTARGET");
                string argumento = Request.Params.Get("__EVENTARGUMENT");

                string script = "";

                if (idControl.Equals("divCliente"))
                {
                    if (argumento.Equals("Evento1"))
                    {
                        script = string.Format("", txtEventArgument.Text, argumento);
                        mostrarMensaje(script);
                    }
                    else
                    {
                        script = string.Format("", argumento);
                        mostrarMensaje(script);
                    }
                }
            }
        }

        private void mostrarMensaje(string script){
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "postback", script);
        }


Aquí tenemos una especie de filtro en el evento de página Page_Load, capturamos el identificador del control que realizo el llamado a __doPostBack(), el cual definimos en su parámetro de entrada, y capturamos el argumento que también lo pasamos como parámetro, con esto ya podemos comparar según el retorno de estos valores que hacer, aquí simplemente verificamos que el control que llama es divCliente, si es así analiza el argumento, si el argumento es “servidor1” realiza el llamado al método mostrarMensaje para imprimir un alert con un mensaje en específico, aquí se puede ver que el control TextBox cuando se digita algo en él y pierde el foco, el argumento __EVENTTARGET tiene el id del control (usa el debbuger de .Net).

Teniendo en cuenta lo anterior podemos imaginar que esta forma de usar el método __doPostBack() que ofrece ASP.Net nos puede ayudar en muchas cosas como por ejemplo.
  • Crear controles de usuario con eventos programados por nosotros.
  • Realizar un llamado al code behind para que realice alguna tarea en específico.
  • Darle capacidad a controles simples html para que sean analizados en el code behind y se realize algo en específico.
  • Etc.

Por ejemplo, yo uso normalmente el __doPostBack cuando se abre una ventana modal y al cerrarla se retorna algún tipo de resulta, dependiendo del resultado realizo un llamado a algún método del code behind en específico, realmente me ha ayudado mucho.

Como siempre digo lo que se presenta aquí no es una solución elegante o regla a usar, tiene muchas falencias de una buena programación, pero para eso estamos todos, sería bueno que el que tenga el conocimiento comparta en qué casos se debe usar y más como es la forma correcta de usarla, hay desarrolladores que recomiendan que no se debe usar directamente el nombre de la función __doPostBack en el código, que se debería hacer una referencia a ella por si de pronto a Microsoft le da por cambiar el nombre o su definición de parámetros quede fácil realizar dicho cambio en la aplicación.

Dejo el link en GitHub del proyecto y por favor si lo usan no modifiquen la raíz creen una rama, para que el ejemplo inicial quede para todos.

No siendo más, me despido, espero que sea de utilidad y por favor comenten, ya sea malo o bueno pero siempre a nivel constructivo.

happy coding :).









martes, 7 de abril de 2015

Tabla de datos dinámica simple con Html5, Css y javascript.



Ahora la moda en el desarrollo de front-end de una aplicación web, se basa simplemente en usar javascript, css y html5 (2015 en este año escribo estos párrafos y ya pienso que está pasando de moda, jeje), y solamente con estas 3 tecnologías se logran cosas maravillosas, es más al usar solo estas tres tecnología no recurrimos a hacer llamadas al servidor (postback) y se da al usuario una experiencia ágil en la carga de los datos; yo aun desarrollo front-end con tecnologías que hacen postback al servidor para pintar controles del servidor y cargar datos en grillas\tablas dinámicas; siguiento esto en lo personal me gusta solo usar javascript y no recurrir a Apis de JS como JQuery, no es que sea mala, antes al contrario es muy buena para mejorar el tiempo de desarrollo, pero me gusta más desarrollar con el origen de las cosas (puede ser que por esta razón ya seré desarrollador clásico, jeje).

Hoy se me a ocurrido como practica de estas tecnología y para reforzar conocimiento un poco en ellas (aun que lo desarrollado aquí se puede haber codificado hace mucho tiempo atrás),  crear una tabla dinámica que se llene con un objeto que este en formato JSON, ¿por qué JSON?, pues porque ya casi todo se está comunicando en este tipo de formato, y una de sus razones digámosle de forma simple, es que es fácil y rápido para retornar y manejar la información contenida en un objeto JSON, bueno a exención de las fechas :/,  aún se me presentan problemas en la conversión de este tipo de dato.

Bueno, empecemos …

Básicamente la idea gira en el manejo de las 3 tecnologías, se usa el html para identificar el lugar donde se visualizara la tabla dinámica, se usa css para darle un estilo personalizado y se usa javascript para crear la tabla de forma dinámica. La parte fuerte de todo, está en javascript, algunos dirán, “oye, eso es pan comido si usas JQuery”, o “ya existen tablas o Apis que hacen esto”, si, si están en toda su razón, pero vamos, me gusta darle el toque personal o impersonal a mis cosas, eso es arte.

Sigamos …

En la parte html me gustaría un código limpio, y que más limpio que usar una etiqueta div que solo identifica el lugar donde aparecerá nuestra tabla, este seria el código:

<div id="divTabla1"></div>

La podemos acompañar del atributo class si quieren pero por el momento vamos bien así.

Ahora la parte javascript, la explico ahora porque si explico el css antes nos podemos confundir en el nombramiento de nuestras clases de estilo.

En javascript pienso en una función que al llamarla me cree todo, si, si ya escucho sus pensamientos “divide y vencerás”, bueno pues para nuestra versión 0.0.1, va hacer una sola función y siii espagueti, vamos bien muchach@s, funciona, más adelante la optimizamos para nuestras próximas entregas, nuestro cliente nos está respirando en la nuca, pensemos en metodologías agiles para entregas rápidas, escucho de nuevo “pura carreta”, jejeje, créanme, a veces pienso lo mismo.

Nuestra función se definirá con tres parámetros de entrada, el primer parámetro es el identificar de nuestro elemento div que está en el html y es el que identifica donde aparecerá la tabla dinámica, el identificador que le designamos fue “divTabla1”, el objetivo de este parámetro es para obtener nuestro objeto div y para crear identificadores dinámicos para los sus elementos hijos; el segundo parámetro es el nombre de clase de estilo (atributo class) para la etiqueta div, el por qué la envió como parámetro, pues, pienso en que se podría definir diferentes estilos para la visualización de la tabla y con esto tenemos la salvedad de que la función javascript se encargue de ello, también la podemos usar para crear nombre de clases de estilo para los elementos hijos pero eso será para otra versión; el tercer parámetro pues es nada más y nada menos que el objeto JSON y es con el que vamos a llenar la tabla en este caso se ha creado una función java script que retorna el objeto JSON, es el siguiente.

function obtenerObjJson() {
     var obj = [{ "Titulo1": "Titulo uno A", "Titulo2": "Titulo dos A", "Titulo3": "Titulo tres A", "Titulo4": "Titulo cuatro A", "Titulo5": "05/04/2015 09:59" }
     , { "Titulo1": "Titulo uno B", "Titulo2": "Titulo dos B", "Titulo3": "Titulo tres B", "Titulo4": "Titulo cuatro B", "Titulo5": "05/04/2015 10:00" }
     , { "Titulo1": "Titulo uno C", "Titulo2": "Titulo dos C", "Titulo3": "Titulo tres C", "Titulo4": "Titulo cuatro C", "Titulo5": "05/04/2015 10:15" }
     , { "Titulo1": "Titulo uno D", "Titulo2": "Titulo dos D", "Titulo3": "Titulo tres D", "Titulo4": "Titulo cuatro D", "Titulo5": "05/04/2015 10:30" }
     , { "Titulo1": "Titulo uno E", "Titulo2": "Titulo dos E", "Titulo3": "Titulo tres E", "Titulo4": "Titulo cuatro E", "Titulo5": "05/04/2015 10:45" }];

     return obj;
}

Voy a describir con palabras que hace la función javascript que crea la tabla, luego pueden ver el código o descargarlo o hacer referencia a él con los link que les dejo mas abajo.


      function crearTablaSimple(divTabla, classDivTabla, objJson){
            var contenedorTabla;
            var fTemp;
            var i, j;
            var arrayClaves = new Array();
            var classFilaDatos = "TBLFilaDatosPar"; //indica fila impar

            try{
                contenedorTabla = document.getElementById(divTabla);
                contenedorTabla.className = classDivTabla;
                fTemp = objJson[0];
           

La función la he nombrado crearTablaSimple, inicia creando las variables necesarias en este caso la variable que contendrá el div (contenedorTabla), una varia que contendrá una fila temporal del objeto JSON (fTemp), unas variables para recorridos de ciclo (i, j), un array para tener los keys (claves) del objeto JSON (un objeto JSON consta de elementos clave-valor)(arrayClaves) y una variable con el nombre de la clase de estilo para las filas de datos pares (classFilaDatos).
Luego asignamos la clase de estilo al div, para asignar a fTemp el primer elemento del objeto JSON.

           

var tabla = document.createElement("table");
       tabla.id = divTabla + "TBL";

           

Luego creamos el objeto tabla, al cual le asignamos un identificador en base al identificador del div de esta forma podemos tener varios div en los cuales se carguen diferentes tablas.

           …

var fila = document.createElement("tr");
fila.id = divTabla + "TBLCabecera";
       fila.className = "TBLCabecera";
       var celda;

          

Luego creamos un objeto fila (tr), que será la fila de cabecera, a esta le asignamos un identificar en base al identificador del div y le asignamos una clase de estilo fijo denominado “TBLCabecera”.

                            

        for (i in fTemp) {
            arrayClaves.push(i);
            celda = document.createElement("th");
            celda.innerHTML = i;
            fila.appendChild(celda);
        }

        tabla.appendChild(fila);
        contenedorTabla.appendChild(tabla);
             

Luego creamos un ciclo con el fin de llenar el array arrayClaves con todos los nombres de las claves del objeto JSON, en este ciclo creamos las columnas o celdas de la fila de cabecera de la tabla, asignándole el nombre de las claves del objeto JSON, cada celda se agrega a su padre o sea a la fila de cabecera. Al terminar el ciclo agregamos la fila de cabecera a la tabla y la tabla se la agregamos a nuestro elemento div, que dentro de la función la llamamos “contenedorTabla”. Siii los escuche “pero por que no usa arrayClaves” y si solo lo uso para almacenar el nombre de las claves del JSON, pero vamos un respiro, es para usarlo en versiones futuras :).

             

 i=0;
        for(i; i < objJson.length; i++){
            fTemp = objJson[i];
            fila = document.createElement("tr");
            fila.id = divTabla + "tblDatos" + i;
            fila.className = classFilaDatos;

            if(classFilaDatos === 'TBLFilaDatosPar'){
                classFilaDatos = 'TBLFilaDatosImpar';
            }else{
                classFilaDatos = 'TBLFilaDatosPar';
            }

             

Luego iniciamos otro ciclo en base al tamaño o al número de elementos del objeto JSON; en este ciclo usamos de nuevo la variable fTemp para ir almacenando cada uno de los elementos del JSON encda recorrido del ciclo, creamos también un elemento fila que le asignamos un id en base al id del div y del número de elemento correspondiente en el objeto JSON y le asignamos la clase de estilo almacenada en la variable classFilaDatos, el objeto de esta variable es asignarle a cada fina un estilo dependiendo de si la fila es par o impar, seguido viene un if que realiza este trabajo, están simple como preguntar qué valor tienen esa variable para cambiarlo a otro valos.

                                           

        for(j in fTemp){
            celda = document.createElement("td");
            celda.innerHTML = fTemp[j];
            fila.appendChild(celda);
        }
        tabla.appendChild(fila);
      }
   }
               …

Ahora dentro de este ciclo tenemos otro ciclo el cual va a recorrer los elementos clave valor del JSON, en este ciclo interno creamos una celda a la cual le asignamos el valor de uno de los elemento del JSON, agregamos esta celda a la fila correspondiente y al finalizar el ciclo interno, agregamos la fila a la tabla, para continuar con el recorrido del siguiente elemento del JSON, aclaro que el objeto JSON es un array y cada elemento es un objeto en formato JSON que es lo que se recorre en el ciclo interno.

Pues es más fácil seguir el código que las palabras digo yo, porque a la final son más las palabras para explicar que el código, y si, porque pensé que haría esto en dos hojas y ya llevo cuatro y una tarde de chelas perdida, no es tan ágil lo ágil, a la final se hace el mismos trabajo pero de forma diferente, jeje.

Ahora los estilos, con lo anterior ya te puedes imaginar las clases de estilos, porque en el código javascript se ha definido nombres de clase de estilo fijos, la base parte del nombre de la clase de estilo para el div que va a contener la tabla de aquí en adelante se usa en diseño de caja la definición de los estilos para los elementos table, tr, th, td y las clases de estilo fijas “TBLCabecera”, “TBLFilaDatosPar” y “TBLFilaDatosImpar”, dejo el código para que lo ojeen.


.classTablaSimple{
               padding: 0rem;
               margin: 0rem;
               width: 100%;
        }
               .classTablaSimple table{
                     width: 100%;
                     border-collapse: collapse;
                      border-spacing: 0rem;
               }
                     .classTablaSimple table tr{
                            /*border: solid 0.1rem;*/
                     }
                            .classTablaSimple table tr th, td{
                                   border: solid 0.1rem;
                                   border-color: #bbb;
                            }
                     .classTablaSimple table .TBLCabecera{
                            background-color: #2dc157;
                            color: #fff;
                     }
                     .classTablaSimple table .TBLFilaDatosPar{
                            background-color: #eae87c;
                     }
                     .classTablaSimple table .TBLFilaDatosImpar{
                            background-color: #b2d7b4;
                     }


Si le quieres dar un estilo, pues simple modifica los estilos css definidos y ya, puedes agregarle cosas o hasta clases de estilo pero para ello debes modificar el código de javascript, pero eso es pan comido ahora que sabes cómo funciona.

en este link a github se encuentra el codigo en tres diferentes archivos
  • cssTbld.css: es el archivo de estilos
  • tbld.html: es el html que puedes abrir en el navegador despues de que descargues el código.
  • jsTbld.js: es la función javascript que crea la tabla.


El ejemplo lo puedes ver en acción con el siguiente botón (clic), creara una tabla dinámica gracias a una librería js que tengo hosteada en google y en donde se ha definido la función javascript aquí mencionada, le hace falta los estilos pero funciona y cumple con el objetivo.


Bueno espero a ver ayudado al necesitado y al que no, al que también y al contrario.

Como siempre happy coding :).