TAN CERCA DE LA BARRERA

Este año 2017 fue protagonista la empresa NIKE en su campaña BREAKING2 que consistía en una cruzada por romper la barrera de las 2 horas de marathon con sus atletas Eliud Kipchoge, Lelisa Desisa y Zersenay Tadese a traves de la ciencia e innovacion de su calzado deportivo.

El pasado 6 de mayo el keniano Eliud Kipchoge quien es campeon olimpico marcó en los cronos en 2H:00 :25 segundos. Estuvo a solo 25 segundos de bajar el tiempo. Esto se realizo en el circuito de Monza, aquella pista de formula 1 donde de disputa el gran premio de Italia.

El ritmo que da este tiempo es de 2:50 por kilometro

Nike diseño una carrera de laboratorio donde hasta 30 Pacers entraban por turnos en carrera, realizaban formacion de flecha compensando la resistencia del aire, ademas un vehiculo ofrecia rebufo e irradiaba una linea verde que indicaba la velocidad requerida.

El calzado deportivo con el que Nike doto a los corredores se llama Zoom VaporFly Elite, un calzado bastante ligero aprovicionado de una plantilla de fibra de carbono.

De todas formas este record no puede ser homologado por la IAAF debido a todas las asistencias tecnicas proporcionadas.

“El récord del mundo continúa en poder del keniano Dennis Kipruto Kimetto, que el 28 de septiembre de 2014 venció en Berlín con un tiempo de 2h02:57, pero Kipchoge, segundo del ránking oficial de todos los tiempos con 2h03:05, ha rozado en Monza los límites del ser humano en la carrera más larga del programa olímpico, alimentando el debate sobre cuánto tiempo habrá de transcurrir para que caiga el muro de las dos horas. ”  fuente: José Antonio Diego el Heraldo.es

Algo mas de Funciones Callback usando JavaScript

Una pregunta acerca de la implementación de funciones Callback me salió en el examen de certificación. voy a compartirlo en esta entrada.

 

Pregunta

Estas implementando una función callback usando JavaScript. Necesitas procesar el retorno de datos XML.

Como debería completar el siguiente codigo

 

<script>

function getStatus(url, callack){

var httpRequest = new XMLHttpRequest();

httpRequest.onreadystatehange = function(){

if(httpRequest.readyState===4

&& httpRequest.satus ===200 ) {

Target1

}

};

httpRequest.open(‘GET’, url);

httpRequest.send();

}

function start(url) {

getStatus(url, function() {

Target2

});

}

</script>

 

Target1:

a) callback.call(httpRequest);

b) httpRequest.setRequestHeader();

c) callback.call(httpRequest.responseXML);

d) callback = httpRequest.getResponseHeader();

 

Target2:

a) processResults(this);

b) processResults(url.calback);

c) processResults(this.XMLHttpRequest());
d) processResults(url.callback.responseXML);

 

y la respuesta es:

para Target1 c)

para Target2 a)

 

Apuntes de Administracion de Proyectos Software

Rara vez escribo sobre administracion de Proyectos, no solo porque me parece un tema muy denso, sino tambien porque pensaba que toda teoria de administracion al momento de llevarla a la practica se caia por el contexto y la cultura que tuviera la empresa.

Pensaba: “Suena muy bonito, pero pago por ver quien lo implementa en X organizacion”.

Ahora pienso diferente, porque toda esa teoria de administracion de proyectos no vienen aisladas de un Marco de Trabajo. El Marco de Trabajo te dicta los pasos que debes realizar en la ejecucion. El resto es observacion e inspeccion del riesgo y control.

El primero de los errores en los que se cae en la administracion de proyectos de software es quedar atrapado en un diseño tecnico demasiado detallado, queriendo cubrir cada uno de los aspectos minimos de un proyecto.

La especificacion de diseño, sin embargo debe estar carente de toda ambiguiedad, es decir debe impedir que alguien entienda diferente a otra persona en el proyecto.

Tecnicas como descomposiciones de alto valor, permite acercar mas la estimacion de costos y de tiempo a los stakeholders del proyecto.

Lo que todo proyecto busca en estos tiempos es mostrar resultados en corto tiempo, por eso se embarcan mucho en las metodologias agiles, producen los resultados muy visibles a corto plazo, pero tambien exige a los administradores de proyecto a tener un equipo de muy alto rendimiento que debe tener la motivacion correcta para poder dar con ese rendimiento.

Lo realmente complejo es que la motivacion es diferente por cada uno de los miembros del equipo y que no siempre la motivacion es economica, saber identificarlas es una habilidad de los lideres de proyectos.

Lo que sé de la motivacion es que generan una accion, y que existen Intrinsecas, Extrinsecas, contributivas e Institucionales . Pero ya profundizar en cada una de ellas se lo dejo a los especialistas en la materia.

La competencia del que mas grite le hace mucho daño a los equipos de trabajo, al igual que el juegito de manitas calientes en las organizaciones. Recuerdan ese juego donde colocabas tus manos encima de las manos de otro amigo y se trataba de estar atento porque lo que iba a intentar es pegarte palmadas en las manos que teniamos puestas.

Bueno esa practica en las organizaciones se aplica cuando existe un rol del personaje pendiente de buscar quienes se equivocan, un cazador de brujas de esos de tiempos de la inquisicion,  entonces,  te distraes y  hacen el mayor escandalo posible para que tengas tu reprimenda, sin que lo importante sea resolver el problema sino que todo el mundo alrededor del proyecto tenga la conciencia de que hubo un error de parte tuya.

Dicen por los pasillos: “oh entonces la leyenda es cierta, es un humano”.

Esto no solo rompe los equipos de trabajo sino que le quita toda motivacion a los miembros de equipo.

ARRAY – JAVASCRIPT

Array

Los array hacen parte en el examen 70-480 de la sección de Implementación de flujo del programa.

Son utilizados para almacenar muchos valores en diferentes posiciones en una sola variable.

Deberás utilizar la palabra clave new Array  para crearlo

Ejemplo:

var cars = new Array(“Saab”, “Volvo”, “BMW”);

Pero basta sin utilizarla

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

 

Algunas funciones

 

Debemos tener claro la operación de adición de elementos,

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.push(“Lemon”);

// agrega un nuevo elemento (Lemon) a frutas

 

El método pop

Remueve el ultimo elemento de un array:

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.pop();

El resultado de fruits sera:

Banana,Orange,Apple

 

El método push

Adición un nuevo item a un array:

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.push(“Kiwi”);

El resultado de fruits sera:

Banana,Orange,Apple,Mango,Kiwi

 

El metodo concat concatena dos vectores,

Vector.concat(otrovector)

 

El metodo Indexof recibe dos parametros

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

var a = fruits.indexOf(“Apple”);

El resultado sera:

2

 

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”, “Banana”, “Orange”, “Apple”]; var a = fruits.indexOf(“Apple”, 4);

El resultado sera:

6

 

 

El metodo Join

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

var energy = fruits.join();

 

El resultado de energy será:

Banana,Orange,Apple,Mango

El segundo parámetro es el separador, por defecto es “,”

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

var energy = fruits.join(” and “);

El resultado de energy será:

Banana and Orange and Apple and Mango

 

 

El metodo reverse

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.reverse();

 

El resultado de  fruits será:

Mango,Apple,Orange,Banana

 

 

El metodo slice

var fruits = [“Banana”, “Orange”, “Lemon”, “Apple”, “Mango”];

var citrus = fruits.slice(1, 3);

 

The result of citrus sera:

Orange,Lemon

 

El metodo shift

Elimina el primer elemento

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.shift();

The result of fruits will be:

Orange,Apple,Mango

 

El metodo unshift

agrega un nuevo items al principio del array:

var fruits = [“Banana”, “Orange”, “Apple”, “Mango”];

fruits.unshift(“Lemon”,”Pineapple”);

El resultado será  fruits:

Lemon,Pineapple,Banana,Orange,Apple,Mango

 

El método Filter

Devuelve un array de todos los valores en el array ages array que este en 18 o mas:

var ages = [32, 33, 16, 40];

function checkAdult(age) {

return age >= 18; }

function myFunction() {

document.getElementById(“demo”).innerHTML = ages.filter(checkAdult); }

The result will be:

32,33,40

 

El metodo Some

Valida si algún valor en el vector de ages array tiene 18 o mas:

var ages = [3, 10, 18, 20];

function checkAdult(age) {

return age >= 18;

}

function myFunction() {

document.getElementById(“demo”).innerHTML = ages.some(checkAdult);

}

El resultado sera:

true

CAMINO A MCSD

En el camino del año que vamos he puesto como metas la certificación de practicas profesionales. Mi primer acercamiento fue en el 2009 talvez 2010 cuando hice los cursos oficiales de Microsoft para presentar el examen. Nunca programe un examen y esta idea de la certificación se empezó a diluir y quedar como un sueño aplazado. Los libros oficiales adornan mi biblioteca y los certificados que me entregaron engordaron la hoja de vida, pero el curso fue un brochazo muy rápido sobre las tecnologías hoy poco vigentes.

Lo primero que hay que tener en cuenta es que la certificación de debe validar cada dos años.

Este año presente mi primera prueba el día 22-02-2017 a medio día de exame 70-480, pese a estudiar algunas semanas antes, me falto el centavito para el peso. Mi puntaje fue 698 cuando se pasaba con 700.

 

El camino hacia la MSCD ha sido actualizado a partir de septiembre del 2016

El primer examen esta el examen

70-480 Programming en HTML5 with JavaScript and CSS3

o 70-483 Programming in C#

 

luego sigue

486 ASP.NET MVC Web Application

o 357 Developing Mobile Apps

 

Lo mejor en este cambio esta en que el siguiente examen es electivo.

lo que antes era 487 Developing Microsoft Azure lo han abierto a un abanico de posibilidades.

 

Aunque Azure no me he acercado lo suficiente yo no lo descarto pero me inclino por

496: Administering Microsoft Visual Studio Team Foundation

497: Software Testing with Visual Studio

498: Delivering Continuos Value with Visual Studio Application Lifecycle management

Descarto a SharePoint

532: Developing Microsoft Azure Solution

487: Developing Microsoft Azure and Web Services

 

Esta elección dependerá también de cuanta información se encuentra disponible.

Continuare este año con el tema de la certificación, pero no solo de Microsoft porque estoy buscando algo de Scrum y o de SOA

 

 

40

La version 4.0 de uno mismo debería ser mejor, llenarte de animo, de inspiración de alegría y de felicidad. Hoy que cumplo mis 40 mirar atrás no es una opción.

Recoger los saludos de tantos amigos en el mundo, me lleno de alegría. Cada uno de los grupos de WhatsApp me saludaron por mi cumpleaños, mi hermana desde Brasil, primos, amigos de empleos anteriores y de este (en octubre 2016 cumplí 5 en el actual), compañeros de colegio, de todos los que esperaba saludos recibí. Que felicidad me dio.

Google también me tuvo en cuenta puso en mi navegador una imagen para mi sesión.

Mi esposa y mi hija, pero sobre todo mi hija era la mas emocionada de mi cumpleaños.

Cada año he tenido retos y la idea de este blog, que ahora miro con perspectiva, nunca fue clara, pero el año pasado tenia objetivos atléticos y de runnning.

Este año tengo objetivo de certificaciones. Siempre fue un sueño aplazado, pero ahora este año voy a intentar certificarme en Microsoft y en Scrum.

Otro día mirare hacia atrás de lo que es mi vida y lo que me imaginaba que iba ser, otro día hare la retrospección, en otras palabras aplazare deprimirme para después, hoy quiero sentirme bien, sentirme contento y sentirme saludado.

Debo también escribir mas en este blog. No importa que sea tan diversificado. Pero lo voy a intentar.

Usando iFrames

Los iFrame presentan la fragilidad de poder ser atacados. El atributo sandbox debe utilizarse para restringir que datos pueden colocarse en un iFrame.

El atributo sandbox puede tener los siguientes valores posibles:

“” aplica todas las restricciones.

allow-same-origin

allow-top-navigation

allow-forms

allow-script

 

OBJETO XMLHttpRequest

Consideraciones que se deben tener en cuenta para usar el objeto XMLHttpRequest.

JavaScript provee este objeto para el manejo de datos, esto es a través de un webservices , REST API o algún proveedor de servicio de datos.

El formato de este objeto es XML y sus eventos son soportados Sincrónica y Asincrónicamente.

 

Enunciare los eventos:

Onreadystatechange

Ontimeout

 

Enunciare los Métodos:

Abort

getAllResponseHeaders

Send

setRequestHeader

Open

 

Enunciare algunas propiedades, basadas en algunas preguntas que encontré por ahí para el examen 70-480

Status

readyState

Response

responseText

 

Un ejemplo típico de Open es

Var xReq = new XMLHttpRequest();

xReq.Open(“GET”, “myXMLData.xml”, false);

xReq.send(null);

 

para tener en cuenta el método Open no hace ninguna solicitud al servidor. Cuando las credenciales son pasadas al servidor el únicamente responde con un código 401 respuesta de seguridad del servidor.

if (xReq.readyState == 4  ){

 if (xReq.status == “200”){

                $(“#results”).text(xReq.response);

} else {

$(“#results”).text(xReq.response);

}

}

 

Esta puede ser el contenido de una función que devuelva el cambio de estado

El 4 significa que la solicitud está completa, se coloca en el readyState

El 200 que el estado de la solicitud es exitoso y entonces se podrán procesar los datos.

USANDO WEB WORKER API

Los web workers son utilizados para desarrollar aplicaciones multihilos en JavaScripts.

JavaScript es un ambiente mono – hilo, cada ejecución en JavaScript es encolada para ejecutarse sincrónicamente. Esto puede que no se note, pues la mayoría de las aplicaciones requiere una potencia de procesamiento no muy exigente en los equipos clientes.

El API Web Worker permite especificar que parte de trabajo debería ser procesada en su propio hilo. Esto tiene sus ventajas y sus desventajas.

El Api de Web Worker API esta basado en el FrameWork messaging de JavaScript. Esta disponible desde el global namespace y se crea de la siguiente manera.

 

Var webWorker =  new Worker(“workercode.js”)

 

Funcionalidades soportadas

 

Método Descripción
postMessage Inicia el proceso worker. Espera un simple parametron que contiene los datos para pasar al hilo. Se puede suministrar una cadena vacia
terminate Detiene el proceso worker
onmessage Especifica la function para el hilo de worker
onerror Especifica una función para el manejo de respuestas con error.

 

webWorker.postMessage(“ ”);

 

webWorker.terminate();

 

Despues que el Worker complete el proceso y los resultados necesitan ser procesados, la funcion onmessage es llamada desde el Worker.

 

webWorker.onmessage = function(ent){…}

 

En alguna parte donde el resultado debe devolverse a la aplicacion se utiliza el metodo postMessage

 

onmessage = function(e){

self.postMessage(result);

}

 

Note que se utiliza la keyword self esto es debido a que el worker corre en su propio contexto.

Desventajas de los web Workers

Parametros

El método acepta un parámetro para pasar datos al worker, este parámetro es string y puede ser serializable con objetos nativos como Objetos JSON o XML. No puede ser una función.

 

Numero de Workers

Aunque no existe un limite de cuantos workers se pueden utilizar  o crear al mismo tiempo, el numero de trabajadores es algo a lo que hay que prestar atención.

La creación de Worker es pesada, cada Worker crea un hilo al nivel del sistema operativo y esto debería manejarse adecuadamente.

Acceso DOM

Los workers operan en su propio contexto global, significa que no tienen acceso al DOM de la página que los invoca. El DOM no puede ser manipulado desde un proceso Worker.

Tampoco tienen acceso a objetos Windows, document o cualquier objeto padre.

Subworker

Un Worker puede crear otros workers. Sin embargo conocer el total de subworker que deben ser creados se vuelve muy importante.

Configuración de tiempos e intervalos.

Es posible especificar un intervalo en el background usando los métodos setTimeout or setInterval.

 

Var work = new Worker(“workerFile.js”);

setTimeout( function() {

work.postMessage(“ “);

}, 3000);

Este proceso corre despues de 3 segundos

 

Var work = new Worker(“workerFile.js”);

setInterval( function() {

work.postMessage(“ “);

}, 3000);

Este proceso corre cada 3 segundos.

 

IMPLEMENTANDO CALLBACK CON UNA FUNCION ANONIMA

El concepto de Callback es la base de cómo trabajan los eventos. Este es el mecanismo en el que una operación asincrónica retorna a una petición una respuesta. En los lenguajes tradicionales un callback se consigue pasando un puntero a una función a otro proceso para que cuando termine o se encuentre en una etapa especifica del proceso la función advierta al llamador del estado o de algún tipo de ordenamiento.

Los Web Services asincrónicos son ejemplos de operación que se complete devolviendo datos al llamador. El mismo principio se aplica en JavaScript.

En JavaScript, las funciones se consideran objetos y a menudo son vistos como ciudadanos de primera clase. Esto significa que una variable puede ser asignado a una función o una función puede ser pasada a otra como un parámetro. Una función es considerada anónima cuando no tiene un nombre.

$(“#Button1”).click(function () {  … })

 

La sintaxis es la siguiente

function ( n,n,…,n) {body };

Debe comenzar con la palabra clave “function” y unos paréntesis para colocar los parámetros.

Luego sigue el cuerpo de la función.

La única diferencia entre una función nombrada y una anónima es la parte del nombre en la firma de la función, las funciones anónimas son un concepto importante cuando tratan con callbacks.

Cuando se trabajan con un API, ya sea propia o de terceros, la funcionalidad a menudo incluye el uso de Callback. En ejemplos se utiliza JQuery con AJAX.

 

$.ajax({

                url: searchPath,

                cache: false,

                dataType: “xml”,

error: function(hdr, num, txt){…}

success: function(data) { ….}      

});

En este ejemplo las propiedades error y success te permiten especificar que acción tomar si se completo la petición exitosamente o no.

Las funciones Callback también se utilizan en forma de un parámetro de otra función.

« Older Entries