Blog personal de IT, viajes y otros hobbies

Etiqueta: javascript

perfiles desarrollo web

Perfiles informáticos del desarrollo web

El desarrollo de una página web profesional involucra un conjunto de profesionales de distintos perfiles que van desde la captura de requerimientos hasta la puesta en marcha en un servidor de producción: Project Managers, diseñadores UX, diseñadores gráficos, maquetadores, desarrolladores, testers y SysAdminers. Hay un mundo de conocimientos detrás de cada perfil como así también de distintas son las herramientas que utilizan a diario para llevar su trabajo adelante. Vamos a conocer algunos detalles de cada uno de ellos para saber un poco más sobre su día a día, cuáles son sus responsabilidades dentro de un proyecto, las herramientas que utilizan y cómo hacen para mantenerse al día con las últimas tecnologías.


Diseñadores UX

Los diseñadores UX se encargan de que el usuario de una web o aplicación tenga una buena interacción con el producto o servicio mejorando su usabilidad y accesibilidad. Para cumplir con este objetivo analizan los distintos dispositivos donde se visualizará la web y diseñan posibles wireframes que luego utilizará el diseñador gráfico.

Es muy importante que tengan conocimientos varios sobre tecnologías de internet: CMS’s, frameworks, redes sociales, animaciones CSS o limitaciones de navegadores/dispositivos. Cuanto más recursos conozcan más herramientas tendrán para diseñar la posible usabilidad de una web o aplicación.

wireframe user experience
Wireframes que realizan los diseñadores UX

Herramientas


Diseñadores Gráficos

Es el encargado de diseñar la imagen general del proyecto (logotipo, web, email templates) utilizando los wireframes que generan los UX Designers, imágenes, tipografías y una paleta de colores que se ajusten al Look & Feel del cliente. En algunas ocasiones el diseñador gráfico hace también el trabajo de UX.

En los últimos años se ha visto un gran avance en las aplicaciones que utilizan los diseñadores para realizar su trabajo. Después de mucho tiempo de Photoshop o Illustrator han aparecido al mercado aplicaciones como Sketch (creo que fue una de las primeras que revolucionó el mercado), Zeplin o Framer que permite a los profesionales tocar algo de código para expandir sus diseños.

disenadores graficos escritorio
Los diseñadores tienen que adaptarse rápidamente a las nuevas herramientas que marcan tendencia en el mercado web.

Herramientas


Maquetador de HTML5/CSS3

El maquetador es el encargado de convertir a HTML5, CSS3 y Javascript los mockups proporcionados por el diseñador gráfico. Es algo así como el Dr. Frankestein que da vida a lo que hasta entonces era una simple imagen estática. No es el responsable de la programación de la web, solo aplica la estructura básica (HTML, microformatos), la hoja de estilo y alguna que otra interacción con Javascript. Luego el programador cogerá este material para aplicar el código que completará la funcionalidad de la web.

Lenguajes

  • HTML5
  • CSS3: Es ideal conocer preprocesadores como LESSSASS o PostCSS (aunque este último no sea un preprocesador cumple con la misma funcionalidad).
  • Javascript: Se puede aprender alguna librería como jQuery (una de las más utilizadas en el desarrollo web).

Herramientas

Profesional Web – Darío Balbontín


Desarrollador Web

El desarrollador se encarga de aplicar el código de programación de servidor (PHP, Javascrtip, JAVA, .Net u otro lenguaje) y de Frontend (Javascript) para que la web cumpla con las funcionalidades de negocio: envíos de emails, gestión de pedidos, procesamiento de datos, consultas a base de datos, registros de usuarios, etc etc etc.

Si hablamos de un desarrollo de WordPress también se pueden incluir las tareas de instalación, creación o modificación de temas o plugins.

Este perfil debe trabajar en conjunto con el analista (persona que se encargó de desarrollar el alcance del proyecto), el maquetador y el tester. En algunas ocasiones el desarrollador web se encarga de todos estos perfiles a la vez (como es mi caso).

Un desarrollador web debe tener un amplio conocimiento de lenguajes y herramientas de desarrollo:

Lenguajes

  • Lenguajes de programación de servidor: PHP, .Net, JAVA, NodeJS
  • Frontend: HTML5, CSS3 y Javascript.

Herramientas

Profesional Web – Pablo López


Desarrollador SEO

El desarrollador SEO se encarga de desarrollar o corregir el HTML para aplicar estrategias o trucos que mejoren el posicionamiento de la web en los buscadores como Google, Yahoo o Bing.

Herramientas

Profesional Web – Rafa Ramos


Project Manager

El Project Manager cumple un poco el rol de orquestador dentro del desarrollo de cualquier proyecto. Es el encargado de mantener las comunicaciones con el cliente y con el equipo técnico. Para ello debe tener buenas habilidades de comunicación, hacer un buen seguimiento de las distintas actividades y sobretodo prever posibles problemas para que el proyecto pueda seguir adelante sin retrasos en la planificación.

Herramientas

Profesional – Javier Hernáiz


Conclusión

Como habréis visto hay muchos perfiles y roles detrás del desarrollo de una página web, de hecho faltan algunos que iré completando a medida que realice las distintas entrevistas. Si trabajamos en una empresa podemos especializarnos en uno de estos perfiles y si somos freelance tendremos que aprender, gestionar o delegar ciertas tareas. Supongo que habéis visto las imágenes de aquí abajo, representan típicos problemas cuando hay falta o mala comunicación entre los miembros del equipo de desarrollo. Y tú ¿Con qué herramientas trabajas? ¿Te especializas en alguna de ellas o eres un desarrollador «todo terreno»?

filtros css featured

Filtros CSS

Oh, qué maravillosos son los filtros de CSS (en la escuela me enseñaron que si comienzo un texto con un «Oh» le da más importancia al asunto) aunque muy pocos desarrolladores los usan. Lo digo en serio, me gustaría navegar, encontrarme una foto blanco y negro, inspeccionarla y ver que el programador se curró un filtro CSS para convertirla en lugar de utilizar Photoshop (en el mejor de los casos), exportarla y subirla. Y es que en realidad molan un saco: se pueden convertir imágenes dinámicamente en blanco y negro, sepia, trabajar su contraste brillo, blur entre otros filtros con muy pocas líneas de código CSS.

Sintaxis

img {
	filter: blur(0px)
			brightness(1.8)
			contrast(0.53)
			grayscale(0)
			hue-rotate(104deg)
			invert(0)
			opacity(100%)
			sepia(0)
			saturate(1);
}

Obviamente no vamos a utilizar todos los filtros a la vez (o sí) pero es para que se den una idea de las diferentes opciones que tenemos y como podemos añadir más de uno al mismo elemento.

¿Dónde podemos utilizar los filtros?

Voy a describir algunas situaciones reales donde podríamos utilizar los filtros CSS.

Ejemplo 1

Supongamos que un cliente o el diseñador nos pide una web donde quiere dar de alta un listado de los empleados de su empresa para luego mostrarlos en un listado en blanco y negro en la homepage. Bien podríamos pedirle al cliente que suba las imágenes en blanco y negro pero estaríamos agregando un paso de dificultad al proceso de administración de la web. Como programadores podemos ahorrarle este paso agregando un par de líneas de CSS.

Listado de empleados en blanco y negro con filtros CSS
Listado de empleados en blanco y negro.
.empleado {
	-webkit-filter: grayscale(1); /* Safari 6.0 - 9.0 */
	filter: grayscale(1)
}

Ejemplo 2

También podríamos suponer que el cliente o el diseñador de la web nos pide que al hacer hover en el listado de los artículos (o de cualquier otro custom post type que tenga una imagen destacada) la imagen se convierta en blanco y negro con una transición. Al igual que el ejemplo anterior se puede resolver con un par de líneas de código CSS.

hover blanco negro filtros css
La imagen destacada del artículo se vuelve blanco y negro con el evento hover.
.articulo {
	cursor: pointer; /* para que al pasar el ratón por encima aparezca el icono de la mano */
	-webkit-transition: all 0.4s; /* Safari */
	transition: all 0.4s;
}
.articulo:hover {
	-webkit-filter: grayscale(1); /* Safari 6.0 - 9.0 */
	filter: grayscale(1)
}

Compatibilidad con navegadores

Los filtros de CSS están aceptados en todos los navegadores modernos a excepción de los IE (Ineptos Expertos) que dan cero compatibilidad en su versión 11 y parcial en Edge 14,15.

[ciu_embed feature="css-filters"]

Tester de filtros

No pude resistirme a la tentación y realicé un pequeño tester de filtros CSS el cual va actualizando los valores a uno de los costados para que puedan copiarlo y utilizarlo en vuestras maquetas. En mi github puede encontrar el código fuente.

tester de filtros css
Tester de Filtros CSS

Pueden encontrar más información de los filtros CSS en las especificaciones técnicas de MDN.

donald trump countdown

Reto Javascript 30 – Ejercicio #2

Wow, estos tutoriales me están encantando por el simple hecho de ver lo simple que puede ser programar algo que a simple vista parece ser complejo pero que puede realizarse mezclando un gran conjunto de conocimientos básicos. En este caso CSS y Javascript. Para el ejercicio número dos del reto Javascript 30 hay que desarrollar un reloj y se basa meramente en las funciones transform: rotate() de CSS y setInterval() de Javascript. No te preocupes si no sabes de lo que estoy hablando más abajo voy a detallar el código.

Como siempre quiero ir un poco más allá de lo que propone el ejercicio para hacer la práctica más divertida y de paso poder compartirlo con ustedes ¿Un simple reloj? No way. Estuve dándole vueltas al coco hasta que llegué a la idea de implementar el típico reloj de Mickey Mouse que mueve las manos pero con un toque extra, y ese toque extra fue mezclarlo con Donald Trump. De ahí nació el proyecto «Donald Trump Countdown» porque seamos sinceros, nadie sabe cómo llegó este energúmeno al poder (sí lo sabemos, gracias al voto de millones de energúmenos) pero sí que lo queremos fuera de cuanto antes. Entonces una cuenta regresiva sería mi ejercicio para estos días.

donald trump countdown
Interfaz gráfica del ejercicio: «Donald Trump Countdown»

Vamos a destripar un poco el código por partes para ver cómo funciona este reloj, empecemos por el cambio de la cabeza de Donald Trump:

¿Cómo cambia la cabeza de Donald Trump al ritmo de los segundos?

El corazón de este código se debe a la función Javascript setInterval(). Esta función nos permite ejecutar una función cada x milisegundos. Veamos un ejemplo utilizando el código del ejercicio:

setInterval(tick, 1000);

Este simple código Javascript ejecutará una función llamada tick cada 1000 milisegundos que equivale a 1 segundo. Ahora veamos qué código implementa la función tick para cambiar la cabeza de Donald Trump a cada segundo.

<!-- DT Faces -->
<img src="img/dt-00.png" class="dt-face dt-00 active" data-key="0" alt="Donald Trump">
<img src="img/dt-01.png" class="dt-face dt-01" data-key="1" alt="Donald Trump">
<img src="img/dt-02.png" class="dt-face dt-02" data-key="2" alt="Donald Trump">
<img src="img/dt-03.png" class="dt-face dt-03" data-key="3" alt="Donald Trump">
<img src="img/dt-04.png" class="dt-face dt-04" data-key="4" alt="Donald Trump">
<img src="img/dt-05.png" class="dt-face dt-05" data-key="5" alt="Donald Trump">
<img src="img/dt-06.png" class="dt-face dt-06" data-key="6" alt="Donald Trump">
<img src="img/dt-07.png" class="dt-face dt-07" data-key="7" alt="Donald Trump">
<img src="img/dt-08.png" class="dt-face dt-08" data-key="8" alt="Donald Trump">
<img src="img/dt-09.png" class="dt-face dt-09" data-key="9" alt="Donald Trump">

En el html podemos ver que agregamos todas las imágenes de las caras de Donald Trump. Cada una de ellas tiene un atributo data-key que utilizaremos para activar o desactivar según vayan pasando los segundos. Por otra parte vemos que el primero y a diferencia del resto tiene una clase extra llamada active. Esta clase es la que hace visible la imagen ya que por defecto todas están ocultas como puede observarse en los estilos de CSS del siguiente código.

.dt-face {
 display: none;
 position: absolute;
 z-index: 80;
}
.dt-face.active {
 display: blocK
}
function tick(){
    // Set the time
    const now = new Date();
    const seconds = now.getSeconds();
    // Remove head
    var faces = document.getElementsByClassName("dt-face");
    var facesCount = faces.length; // Gracias Carlos por esta mejora
    for (var i = 0; i < facesCount; i++) {
        faces[i].classList.remove("active");
    }
    // Get the specific head and activate it
    var face = document.querySelector("[data-key='" + seconds%faces.length + "']");
    face.classList.add("active");
}

A cada segundo el setInterval() ejecuta la función tick().  En la función declarmos un par de variables para guardar la fecha y los segundos actuales. Paso seguido quitamos la clase active a todos los elementos del documento que tengan la clase dt-face, de esa manera nos aseguramos que ninguna cara está visible. En el tercer bloque de código activamos la cara correspondiente según el segundo en el que se está ejecutando la función. Para ello utilizamos el operador mod (%) que nos devuelve el resto de la división entre los segundos actuales y la cantidad de elementos en el array de faces. De esta manera podemos despreocuparnos de cuantas caras tenga Donald Trump, a cada segundo siempre se activará la siguiente y al final de la lista volverá a comenzar.

donald trump faces

¿Cómo mueves las agujas?

Utilizando la misma función tick guardo en una variable el valor de los minutos y el de las horas. Luego realizo una división por 12 horas y por los 60 minutos respectivamente para encontrar su correlación con los grados que debo rotar las agujas. Una vez que obtengo ese número aplico la función transform: rotate() de CSS.

function tick(){
    // Set the time
    const now = new Date();
    const seconds = now.getSeconds();
    const minutes = now.getMinutes();
    const minutesDegrees = (minutes/60) * 360;
    minuteHand.style.transform = `rotate(${minutesDegrees}deg)`;
    const hours = now.getHours();
    const hoursDegrees = (hours/12) * 360;
    hourHand.style.transform = `rotate(${hoursDegrees}deg)`;
}

En las líneas 6 y 9 se puede observar los cálculos para obtener los grados que debo girar las agujas para que apunten en las horas y minutos adecuados. Un punto muy importante: las agujas, o cualquier elemento que se quiera rotar, siempre tendrá el eje en el centro vertical y horizontal. Para el tipo de rotación de las agujas del reloj se debe modificar la propiedad transform-origin.

El código completo

Pueden descargarse el código completo desde mi cuenta de Github, ejecutar directamente el fichero index.html en su navegador y modificarlo a vuestro antojo.

Mariano Rajoy Thug Life

Me apunté al reto Javascript en 30 días

Desde hace unos días que vengo viendo el reto «Javascript 30» en distintas cuentas de Twitter y he decidido sumarme. Seguramente aprenda muchas cosas nuevas y refrescaré aquellas cositas que no utilizaba tanto. Tal como dice su página principal es un reto que consiste en construir 30 cosas en días con 30 tutoriales, usando Javascript nativo. Eso significa que no podrás utilizar nada de frameworks, compiladores, librerías(dile adiós a tus queridas funciones de jQuery) ni Boilerplate. Solo Javascript Vainilla y del bueno 😉

javascript 30 challenge
Página principal del reto «Javascript 30»

Dada mi carga laboral, horas dedicadas a la comunidad de WordPress, fiestas obligatorias de Diciembre y mis 3 gatos 🐈 dudo que pueda completar un tutorial al día, pero de todas formas iré subiendo aquellos que pueda finalizar en mis escasos ratos libres.

Para el primer día hay que construir las típica batería que se ejecuta presionando los botones del teclado. Yo he querido darle una vuelta de rosca para que la práctica fuera un poco más divertida y he creado algo que titulé «Rajoy Thug Life«. Es un mezclador de bases de hip-hop junto a las mejores frases de nuestro querido aló presidente.

Mariano Rajoy Thug Life
Interfaz del mezclador

Seleccionen una de las bases presionando cualquiera de las teclas o bien pinchando con el ratón, una vez que la música comience seleccionen las mejores frases de Marianito con el resto de los botones y que fluya el flow por vuestras venas.

«Españoles muy españoles», si quieren chequear el código fuente aquí tienen «el IVA y los chuches» en el GitHub. C’ya around!

Caja de herramientas

Optimiza tus Javascripts en WordPress

¿Por qué transportar una caja de herramientas de 100 kilos si solo necesitamos ajustar el tornillo de un mueble? Es el mismo tipo de pregunta que me hago cuando veo una página con decenas de ficheros Javascripts pesados e innecesarios. El desarrollador que no invierta tiempo en optimizar sus ficheros javascript está condenado a una web lenta, imposible de visualizar en dispositivos móviles y a un auténtico infierno para futuros mantenimientos.

Una lista infernal de ficheros javascripts

La lista de la web analizada se extendía a 47 ficheros javascripts.

Este problema suele encontrarse cuando el desarrollador de la web sufre de pluginitis, es decir cuando aplica en forma indiscriminada docenas de plugins para resolver funcionalidades que bien podrían realizarse con un par de líneas de código PHP, CSS, HTML o Javascript.

Ahora bien, ¿cómo podemos optimizar la carga de nuestros javascripts desde un principio y evitar estos dolores de cabeza?

Agrupando Javascripts comunes a toda la web

Es muy probable que tu web tenga un menú desplegable que apliques con jQuery, un sistema modal de login o bien un plugin para hacer más suave el scroll de tu web. Estos ficheros puedes juntarlos en uno solo y así disminuir las peticiones al servidor. Yo lo aplico aún utilizando el protocolo HTTP2 en mi servidor.

jquery.js + scroll.js = common.js


Comprimiendo los ficheros

Podemos comprimir nuestros ficheros Javascripts (independientes o agrupados) utilizando herramientas manuales, automáticas o mediante plugins. De esta manera nuestra página web puede mantener el comportamiento (scroll, menús, validación de formularios, etc) pero con menos tráfico de datos.

Lo ideal es desarrollar un tema con ficheros Javascripts sin comprimir (para poder debuggear) y utilizar las herramientas automáticas para generar la versión de «producción» con los ficheros ya comprimidos.


Seleccionando los ficheros javascripts

Es lógico que no necesito incluir el Javascript con la validación de campos del formulario de contacto en mi página principal, entonces ¿por qué no hacer una selección de qué cargamos y en dónde?

Esto es muy sencillo en WordPress haciendo uso de las funciones wp_register_scriptwp_enqueue_script y de los Tags Condicionales.

Ejemplo: Tenemos un proyecto con un fichero common.js con funcionalidad básica para toda la web y un fichero contacto.js que tiene la funcionalidad que comprueba los campos del formulario de contacto. Para hacer la carga discriminada debemos agregar un código similar al siguiente en nuestro fichero functions.php de nuestro tema.

function function_agregar_scripts() {
  // Registro los ficheros Javascripts.
  wp_register_script('commonjs', get_bloginfo('template_url') . '/js/common.js', array('jquery'),'',true);
  wp_register_script('contactojs', get_bloginfo('template_url') . '/js/contacto.js', array('jquery'),'',true);
  
  // Agrego el javascript registrado como 'contactojs' solo si la página actual es "Contacto".
  if(is_page('Contacto')):
    wp_enqueue_script('contactojs');
  endif;
  
  /* 
  * Agrego el javascript registrado como 'commonjs' a las páginas webs del tema.
  * (El condicional indica que no se cargue el fichero en el administrador de WordPress)
  */
  if(!is_admin()):
    wp_enqueue_script('commonjs');
  endif;
}
add_action( 'wp_enqueue_scripts', 'function_agregar_scripts' );

Mi técnica de carga Javascripts

Como conté en párrafos anteriores genero un fichero Javascript con la funcionalidad común para toda la web (common.js) y otros ficheros Javascript independientes para utilizar en distintas páginas (contacto.js, home.js, single-blog.js, etc).

Al finalizar el desarrollo de mi tema ejecuto una tarea Grunt para generar los nuevos ficheros Javascript comprimidos, obteniendo así:

  • common.js y common.min.js
  • contacto.js y contacto.min.js
  • home.js y home.min.js
  • single-blog.js y single-blog.min.js

Para finalizar aplico en mi functions.php la técnica de carga discriminada para cargar solo aquellos Javascripts que voy a utilizar y agrego un nuevo condicional para cargar la versión comprimida o descomprimida según el entorno de trabajo.

function function_name_scripts() {
  /*
  * Para discriminar por la versión comprimida o descomprimida agrego una constante en
  * el wp-config.php llamada 'WP_DEVELOPMENTMODE'. En caso de que sea TRUE estamos en entorno
  * de 'Desarrollo', en caso de que sea FALSE o bien que no exista estamos en el entorno de 'Producción'
  *
  * Teniendo en cuenta el valor de la constante genero la extensión del fichero '.js' para 'Desarrollo'
  * y 'min.js' para 'Producción'
  */
  $jsExtension = (defined('WP_DEVELOPMENTMODE') && WP_DEVELOPMENTMODE )?'.js':'.min.js';
  
  // Registro los ficheros Javascripts.
  wp_register_script('commonjs', get_bloginfo('template_url') . '/js/common' . $jsExtension, array('jquery'),'',true);
  wp_register_script('contactojs', get_bloginfo('template_url') . '/js/contacto' . $jsExtension, array('jquery'),'',true);
  
  // Agrego el javascript registrado como 'contactojs' solo si la página actual es "Contacto".
  if(is_page('Contacto')):
    wp_enqueue_script('contactojs');
  endif;
  
  /* 
  * Agrego el javascript registrado como 'commonjs' a las páginas webs del tema.
  * (El condicional indica que no se cargue el fichero en el administrador de WordPress)
  */
  if(!is_admin()):
    wp_enqueue_script('commonjs');
  endif;
}
add_action( 'wp_enqueue_scripts', 'function_name_scripts' );

¿Qué técnica usas?

Déjame en los comentarios qué técnica utilizas para cargar tus ficheros javascripts o si ves una posibilidad de mejorar lo aquí expuesto para que podamos compartirlo con los demás desarrolladores.

Funciona con WordPress & Tema de Anders Norén