Quantcast
Channel: campusMVP.es
Viewing all 776 articles
Browse latest View live

¿Chrome como editor Web FrontEnd profesional? Te explicamos cómo

$
0
0

En este vídeo veremos a través de un ejemplo cómo puedes utilizar Google Chrome como un completo editor de código front-end de manera que puedas depurar y editar todo al mismo tiempo y además sin necesidad de nada externo y sin envidiar nada a otros editores de los que hay por ahí.

Lo que mucha gente no sabe es que, Google Chrome, aparte de tener las herramientas del desarrollador para poder depurar y afinar cosas es también un excelente editor y además te permite editar directamente contra disco. Es decir, si dispones del código fuente de la página que estás tocando lo puedes tocar directamente con las herramientas del desarrollador al mismo tiempo que depuras.

[youtube:Zd6aysnRYsI]

A continuación te resumo por escrito lo explicado en el vídeo:

Veremos todo esto con un ejemplo muy sencillo que está servido desde un servidor web. En este caso está en local (pero podría estar en internet) y consiste en la típica lista desplegable con tiempos que al hacer clic en iniciar arranca una cuenta regresiva.

Se sirve desde un servidor local Server que es un servidor muy conocido de Node.js. En el disco duro está el código fuente, que en este caso es muy sencillo ya que se trata de una página HTML y CSS, nada más. Además, todo esto lo tenemos abierto en Notepad++, que es un editor simple de texto que colorea código pero que tampoco ofrece demasiado de cara a trabajar con código.

¿Por qué se guardan los cambios que hagamos en la web?

Bien, resulta que en Google Chrome o en cualquier navegador basado en Chromium (como puede ser por ejemplo Opera o incluso Microsoft Edge en Windows) si sacamos las herramientas del desarrollador, aparte de todos los elementos habituales, en la pestaña Sources tenemos el código fuente traído de la página como siempre, solo que podemos entrar y verlo, pero no nos lo deja tocar porque esto es en el servidor.

También existe una pestaña que se llama Filesystem (que si no la ves la puedes ver desplegando en las flechitas) que te permite escoger una carpeta local disco en la que tienes el código fuente de la página que estás depurando, aunque esté en un servidor, y mapea los archivos de la pestaña Page con los archivos que estén en esa carpeta, de manera que todos los cambios que hagas quedan reflejados inmediatamente.

¿Cómo modificamos la página web en Chrome?

Para ello lo que tienes que hacer es ir a Filesystem, darle al "+" y añadir una nueva carpeta donde esté el código fuente. Seleccionamos la carpeta, y el navegador pedirá permisos para poder acceder al disco duro (lógicamente) porque los navegadores siempre te piden este permiso.

Lo permites y a partir de este momento tienes ahí los archivos del disco duro. Si además refrescas esta página, fíjate cómo habrán cambiado los iconos y se ponen dos puntitos de color verde alrededor, de manera que quiere decir que ya están enganchados los archivos de la pestaña Page con los archivos de Filesystem. Si hubiera aquí alguno más que no estuviera en el sistema de archivos pues no estaría con el puntito verde.

Ahora están enlazados de manera que si hacemos cualquier cambio se ve reflejado inmediatamente en disco duro y lo podemos subir al servidor cuando haya terminado. Bien, ahora fíjate, en este caso si despliego, tengo una errata en esa página ya que tengo dos veces 10 minutos cuando aquí debería poner 15.

Abrimos el archivo en el editor, le ponemos 15, grabamos con Ctrl + S  y ahora si refrescamos el servidor, como esto es un servidor local, veremos que ya ha cogido el cambio. Y si vamos a Notepad ++ y abrimos la página nos dice que ha cambiado y si queremos volver a cargarla (obviamente sí) y veremos ese cambio reflejado.

Bien, pues lo mismo podemos hacer con cualquier otra cosa que haya dentro de esta aplicación. Por ejemplo, imagínate que consideramos los números del contador como demasiado grandes o demasiado pequeños. Lo podemos seleccionar, vamos a la parte normal y corriente de elementos, tenemos las propiedades y fíjate que el tamaño que nos font-size son 10em. Le damos para arriba o para abajo si lo quiere hacer mayor o menor, por ejemplo lo hacemos más grande hasta 14 em. Vale, en el momento en que le das a enter automáticamente por detrás te lo ha graba también en disco duro porque tenemos guardada en la pestañas Sources la relación entre el archivo CSS donde estaba ese valor y el archivo en disco duro.

Conclusiones

Fíjate en que estamos tocando en el servidor pero con ese mapeado nos lo guarda en el disco duro. Si ahora vamos en el editor (Notepad++) al archivo abierto crono.css nos dice que ha cambiado y si lo queremos recargar. Le decimos que sí y fíjate como ahora ha puesto esos 14 em directamente en el código fuente. De esta manera es muy sencillo editar, depurar, hacer cambios y demás y ya verlos reflejados inmediatamente de nuestros archivos de código fuente con lo cual cuando terminemos ya no tenemos que ir al editor y ahí replicar los cambios, ya lo está haciendo directamente Chrome.

Chrome es un editor bastante capaz. Por ejemplo si vamos al font-size que acabamos de cambiar e intentamos ponerle otro valor, fíjate que ya sugiere qué cosas podemos poner ahí exactamente igual que haría desde Elements. Incluso podemos editar colores con su editor específico, así que se trata de un editor bastante potente tanto de CSS como de JavaScript, HTML y demás. Con este truco no necesitas otro editor si solo estás haciendo front-end y puedes estar haciendo los cambios y depurando y tenerlo todo en un único sitio.

De esta manera, al terminar simplemente subes los archivos a tu servidor y tienes todos los cambios hechos.

Esperamos que este truco te haya parecido interesante.


Noticias de programación para programadores ocupados #6: semana 8-febrero-2021

$
0
0

Cómo obtener el código fuente de cualquier programa o DLL escrita para .NET (C#)

$
0
0

[youtube:-m_QQkXTOww]

En este vídeo te voy a contar cómo puedes ver el código fuente de cualquier ejecutable o DLL creado con la plataforma .NET, incluyendo .Net clásico, .Net core y .Net. De este modo podrás analizar el código de los programas y entender cómo funcionan aunque no tengas el código fuente. Vamos a verlo...

Lo que te voy a contar sirve para .Net pero se puede conseguir lo mismo para casi cualquier lenguaje o plataforma, y es igual de fácil, por ejemplo, en la plataforma Java. También ten en cuenta que se pueden tomar medidas para impedirlo usando herramientas especiales llamadas ofuscadores, que complican tanto el código que no te sirve de nada obtenerlo de la forma que te voy a contar hoy. Pero esto es tema para otro día. Hoy vamos a ver cómo decompilar fácilmente código .Net.

La herramienta que vamos a utilizar se llama ILSpy. Hay más, pero ésta es de las más conocidas y además es totalmente gratuita y Open Source. La mantiene el programador austriaco Siegfried Pammer y, bueno, lleva ya un montón de años.

Solo tienes que venir a esta página, e irte a la zona de Releases. Fíjate en que te ofrece, a lo mejor en este momento, una versión preview que a lo mejor no es todo lo estable que debiera, con lo cual yo te recomiendo que te bajes la última versión estable. Para ello si te sale una preview o una beta aquí, lo único que tienes que hacer es ir hacia abajo hasta que te salga una que no lo ponga. Por
ejemplo, en este caso la última estable es la 6 2.1. Le das a los assets y verás que tiene esa parte del código fuente dos formas de descargartela. La primera es un complemento para Visual Studio y la otra  es un ejecutable que puedes utilizar de manera independiente. Yo te recomiendo este último, sobre todo para empezar.

Entonces, lo único que tienes que hacer es descargarlo. Como ves es un ZIP. Bien. Lo único que tienes que hacer para usarlo es descomprimirlo y listo. La puedes añadir al menú de inicio desde donde la hayas copiado para luego poder utilizarla siempre, y lo único que tienes que hacer es doble clic, y lanzarla.

Como ves, ya de entrada te saca una serie de bibliotecas del propio sistema. Por ejemplo, la biblioteca base de clases de .Net, con lo cual tienes todo el código fuente de la plataforma, aunque esto tampoco es ninguna novedad porque realmente lo tienes ya Open Source en GitHub, pero puedes examinar cualquier clase o cualquier elemento de código de .Net y ver cómo está hecha.

Ahora voy a entrar en detalle en cómo funciona toda esta parte, pero antes te voy a enseñar un ejemplo concreto que he creado para que veamos cómo funciona y luego te cuento más detalles sobre esto. Para eso tengo aquí este ejemplo que es súpersencillo: es una aplicación que lo único que tiene es un código que lo que hace es mostrar por pantalla a la hora actual y toma un parámetro que puede ser -b o --batch desde la línea de comandos. Para eso utiliza un paquete NuGet que se llama CommandLineParser, es decir otra DLL de la cual depende. Lo hago así porque me interesa que veas de qué manera esta herramienta incluso te va a las DLLs dependientes.

Esto lo compilas y en, este caso, imaginemos que has perdido el código fuente o es un programa de otra persona y quieres ver cómo está hecho. Bueno, pues para eso tengo aquí el ejecutable y ha compilado. Fíjate que está el ejecutable y además ese paquete que te decía que del cual dependía. Lo único que hay que hacer para descompilarlo con ILSpy es arrastrarlo encima.

Fíjate que aquí tengo el ejecutable, y que si ahora despliego, automáticamente tengo todos los elementos del programa. Por ejemplo, está el espacio de nombres principal de la
aplicación. Despliego y tengo el programa, y dentro de éste tengo el método main que te enseñaba hace un momentito. Fíjate en que el código es prácticamente igual. Faltan cosas, como por ejemplo esta anotación de aquí y algún detalle (porque eso es azúcar sintáctico que luego se transforma en código real, que es el que se descompila), pero el código es exactamente el mismo.

ILSpy lo que hace es que, en cuanto pulsamos en cualquier elemento, nos saca el código fuente en el lenguaje que le digamos. Y además fíjate que en este caso como éste código depende de código que está en esa otra DLL, en la que hablaba hace un momento, está aquí en CommandLineParser.dll. Ya nos la abre automáticamente aquí, y la pone en otro color para que sepamos que
es un ensamblado que has abierto como dependencia, no tú manualmente. Y podemos también examinarla. No sólo eso, sino que si nos ponemos encima, por ejemplo, de esta
línea que utiliza nuestro código, al pulsarla me lleva a la clase relacionada, pero incluso si voy aquí a un método, me manda directamente a la clase y al método concretos también. Con lo cual puedo ver el código fuente también de esta clase: es decir no sólo me saca el código que me interesa en el momento que yo se lo digo, sino que además puedo navegar por ese código y ver el resto del código fuente de las DLLs y de los elementos que estén relacionados con el programa que estoy analizando, con lo cual es muy potente.

Fíjate además en que te deja escoger el lenguaje entre C# o lenguaje intermedio (IL), que es el lenguaje al cual se compila C# por parte del compilador de .Net. Éste es mucho más complicado de leer porque es casi código máquina, pero incluso nos permite mezclarlo y nos saca el código en C# y el equivalente en lenguaje intermedio. Si escojo lenguaje C#, me deja
incluso escoger qué versión concreta de C# me interesa: por ejemplo ahora está con C# 9, pero podría incluso una versión súper antigua como C# 1.0. En ese caso me saca un código bastante marciano, pero lo puedes ver en otras versiones. En este ejemplo son todas iguales, pero si me voy a otras versiones podría ser que este código variará en función de las características que soporte esa versión. Como vemos es súperpotente y tiene más posibilidades aún que te comento en el vídeo.

Esto es muy interesante para aprender, para depurar e incluso para salvarnos de algunos problemas de vez en cuando. Y no es algo exclusivo de .Net, porque se puede hacer también en otras
plataformas. En otra ocasión podemos hablar de cómo evitarlo usando unas herramientas específicas llamadas ofuscadores.

Espero que te haya resultado interesante y te haya abierto un nuevo mundo de posibilidades 😉

Europa, ¿a la cola en la carrera mundial por la IA?

$
0
0

Imagen ornamental, un podium de atletismo, por Florian Schmetz, CC0

Según un informe publicado por el Centro de innovación de datos con sede en Estados Unidos, EE.UU. tiene una ventaja sustancial en la carrera mundial sobre inteligencia artificial, le sigue China, que cada día reduce un poco más la distancia y, por último, y bastante rezagada, se encuentra la Unión Europea.

Este informe se trata de una actualización de otro anterior publicado dos años atrás al cual se le han añadido nuevas métricas de las 3 regiones en 6 categorías relacionadas con la inteligencia artificial: talento, hardware, desarrollo, investigación, adopción y datos. El tipo de información recopilada va desde la cantidad de dinero dedicado a IA en las empresas, hasta la proporción de investigadores de IA en comparación con la población total, pasando por la cantidad de supercomputadoras que cada región posee.

Desarrollo

Una de las mayores diferencias entre las tres zonas, según este informe, es el dinero. Las nuevas empresas de inteligencia artificial en los EE. UU., a finales de 2019, habían recibido más de 14 mil millones de dólares de fondos de VC (Venture Capital) y PE (Private Equity), 6 mil millones las de China y poco más de 3 mil millones las europeas.

La imagen muestra una tabla con las inversiones, obtenida del Center for Data Innovation

Además, con el Brexit, el futuro no pinta bien para Europa, dado que el Reino Unido representa un 57% de la financiación total de la UE (y se han ido 😕).

Por otro lado, el escaso de dinero "levantado" en las rondas de financiación es una de las razones por las que los emprendedores abandonan la UE. Por ejemplo, la empresa de gestión de datos Collibra, originaria de Bruselas, se mudó a Nueva York y, Algolia, la empresa de búsqueda de origen francés, ahora tiene su sede en San Francisco.

Investigación

Esta sección analiza el número y la calidad de los artículos académicos sobre IA y el gasto de las empresas en I + D.

Según este informe, la UE está gastando menos que sus competidores en investigación:

La imagen muestra una tabla con los datos mencionados. Europa menos de un 10% de la inversión de EEUU y un 60% de China. Obtenida del Center for Data Innovation

Al mismo tiempo, China está aumentando los medios de I + D del país, lo que ha llevado a que se produzcan muchos más artículos sobre IA. Con algo menos de 30.000 artículos, China representa el 28% de la producción de investigación de IA en el mundo, mientras que la participación de la UE ha ido disminuyendo constantemente en los últimos años (decae desde 2015) hasta alcanzar el 23%; Estados Unidos, por último, es el responsable del 18% de los artículos sobre IA.

Sin embargo, cabe señalar que la calidad de las publicaciones de la UE está aumentando, mientras que la de los papers chinos está disminuyendo.

Hardware

El hardware (la potencia computacional) es un factor clave en lo que a IA se refiere. Cuando se trata de hardware, EE. UU. muestra, una vez más, una ventaja indiscutible. En cuanto a las 15 principales empresas de semiconductores del mundo, ocho tienen su sede en EE. UU., frente a una sola empresa de la UE. China no posee ninguna.

La imagen muestra una tabla con los datos, obtenida del Center for Data Innovation

Sin embargo, donde China está avanzando es en supercomputación, donde el país tiene casi el doble de dispositivos clasificados en el Top500 por rendimiento que Estados Unidos. Desde 2012, China ha triplicado su presencia en la lista: actualmente tiene 214 supercomputadoras en el Top500, en comparación con 113 de EE. UU. y solo 91 de la UE.

Talento

Esta sección analiza la cantidad de investigadores de IA, la calidad de los mismos, la cual se mide en función de su productividad (artículos publicados, participación en conferencias y congresos) y de su influencia en la comunidad y el lugar en el que los doctorandos prefieren desarrollar su carrera.

Aunque la UE ocupa el segundo lugar en esta categoría, Estados Unidos es la región que más talento atrae (incluido talento procedente de la UE) y China está implantando planes para aumentar su talento en IA:

La imagen muestra una tabla con los datos, obtenida del Center for Data Innovation

Adopción

Si bien diferentes encuestas han encontrado diferentes tasas de adopción, indican tendencias similares: China está adoptando la IA a un ritmo más rápido que Estados Unidos y la Unión Europea. China está a la vanguardia en la adopción de IA, en parte, porque su gente y sus empresas reconocen el valor de la IA a tasas más altas.

Muchos ciudadanos europeos se muestran escépticos con respecto a la IA.

Uno de los mayores retos de la UE es que muchos de sus ciudadanos no confían en esta la IA y la ven como una tecnología a la que se debe temer y limitar, en lugar de acoger y promover.

La imagen muestra una tabla con los datos, obtenida del Center for Data Innovation

Datos

Los sistemas de inteligencia artificial a menudo dependen de grandes cantidades de datos de calidad para el entrenamiento.

Esta sección mide la cantidad y disponibilidad de datos en las tres regiones con respecto a la actividad de Internet, Internet de las cosas (IoT), productividad (es decir, análisis de big data), pagos móviles, datos médicos, genética y mapas de alta resolución. También tienen en cuenta cómo las regulaciones en una región pueden crear barreras para la recopilación, el acceso y el uso de datos.

Así, por ejemplo, el Reglamento general de protección de datos (RGPD), limita la recopilación y el uso de datos que pueden fomentar desarrollos en IA en la UE. Las propuestas para una ley de gestión de datos, si bien fomentan la reutilización de datos del sector público, también restringen la transferencia de cierta información:

Ejemplos de datos disponibles en cada región y su cantidad, fuente: Center for Data Innovation

China está a la cabeza en esta categoría, seguida de EE.UU. y por último la UE.

Conclusión

Según este informe, EEUU es el claro vencedor. Pero, ¿se pueden comparar contrincantes que juegan con distintas reglas?

Es evidente que se trata de una carrera donde cada participante juega con sus propias reglas.

Así, tenemos por un lado a China, sin muchos comentarios que podamos hacer sobre sus reglas.

Tenemos por otro lado a los Estados Unidos que proponen que las naciones colaboren para avanzar en materia de IA siempre que las regulaciones de los proyectos no se "inspiren" en las leyes europeas. Su objetivo, ganarle la carrera a China.

Y por último tenemos a la Unión Europea quien ha publicado un libro blanco sobre IA defendiendo una visión de una "tecnología en la que confiar", que pone a las personas primero, orgullosa de liderar el camino para establecer controles más estrictos sobre algoritmos. Por ejemplo, el organismo de control europeo de los derechos humanos dio a conocer nuevas pautas que buscan prohibir el reconocimiento facial por completo, cuando la tecnología puede conducir a la discriminación basada en atributos como el sexo o el origen étnico.

Para terminar no debemos olvidarnos de otros países que están invirtiendo gran cantidad de dinero en IA y que no han sido tenidos en cuenta en este informe, como India o Israel.

Noticias de programación para programadores ocupados #7: semana 15-febrero-2021

$
0
0

Cómo interpretar los códigos de error de Angular

$
0
0

Imagen ornamental

Cuando todo funciona a la primera en un programa, es como si el pecho se llenase de una gran felicidad efímera. Lo malo es que no suele ser así. Lo siguiente mejor a que todo funcione a la primera es tener claro por qué se ha producido un error. Por desgracia muchas veces los mensajes de error son crípticos, difíciles de depurar y, a veces, ni siquiera tienen algo que ver con lo que de verdad está pasando, como todo desarrollador experimentado ha sufrido en sus carnes.

En el framework de desarrollo Web Front-Ed Angular, intentan con todas sus fuerzas que ese no sea el caso y que, cuando se produce un error al usarlo, sepas exactamente qué está pasando.

Para ello los mensajes de error no sólo tienen un código estándar que permite averiguar por su numeración a qué tipo de error nos enfrentamos, sino que, además, nos ofrecen detalles adicionales y pistas para solucionarlos, e incluso un enlace a la documentación para saber más.

Este es el aspecto de uno de estos errores depurando en la consola de Visual Studio Code:

Error NG8002 de Angular, con detalles

Aunque no todos son tan bonitos y claros, sobre todos los de tiempo de compilación, aquí otro ejemplo de error en la consola del navegador:

Error NG0200 de referencia circular

De todos modos es bastante aclaratorio.

Los códigos de error de Angular se definen usando la siguiente nomenclatura:

  • NG: todos empiezan por este par de letras. Esto nos ayuda a distinguirlos claramente de otros errores que se pueden producir, como los del compilador de TypeScript o los del propio navegador.
  • Un número para el tipo: el tipo de error puede ser un 0 si se trata de un error en tiempo de ejecución (en el código fuente puedes ver los códigos de este tipo que existen), o un número del 1 al 9 si se produce al compilar la aplicación (también puedes verlos en el código fuente).
  • Un número para la categoría del error:
    • 0: Error interno
    • 1: Error debido a cambios detectados
    • 2: Error del inyector de dependencias
    • 3: Error en las plantillas
    • 4: Error en el manejo de estilos
    • 5: Error de declaración
    • 6: Error de internacionalización
    • 7: Error de compilación
  • Dos números para el código del error.

Así, por ejemplo, el error de la figura anterior, NG0200, aunque no llevase el mensaje aclaratorio ya sabríamos que es un error en tiempo de ejecución (0) y que tiene que ver con el inyector de dependencias (2). El código 00 es el primero de los disponibles en esa categoría y podríamos investigarlo en la documentación.

Esta nomenclatura y esta forma de mostrar las excepciones y errores se añadió a Angular 11.1, por lo que debes estar en una versión igual o superior a esta para sacarles partido.

Noticias de programación para programadores ocupados #8: semana 22-Febrero-2021

$
0
0

¿Cómo están ayudando la inteligencia artificial y el aprendizaje automático en la Industria 4.0?

$
0
0

Introducción

La inteligencia artificial y, en particular, el aprendizaje automático (machine learning) han contribuido de forma notoria a la revolución industrial 4.0.

En la actualidad, industrias de todo tipo emplean ya dispositivos basados en alguna tecnología de IA y se espera que el número de empresas que utiliza IA en Europa crezca en los próximos años. Por otro lado, las técnicas de aprendizaje automático empleadas en las organizaciones han simplificado y reducido el trabajo "manual" de muchos trabajadores.

Hace ya algunos años que oímos hablar de la industria 4.0, pero ¿qué es eso exactamente y cómo se relaciona con diversas tecnologías?

Qué es la industria 4.0

Industria 4.0 es un término que fue utilizado por primera vez en 2011 en Alemania y que describe una organización de los procesos de producción basada en la tecnología y en dispositivos que se comunican entre ellos de forma autónoma a lo largo de la cadena de valor. En palabras más sencillas...

La industria 4.0 consiste en la digitalización de la industria y todos los servicios relacionados con la empresa.

También se conoce como cuarta revolución industrial, ciberindustria, industria inteligente etc.

Autor: Christoph Roser at AllAboutLean.com, CC BY-SA 4.0.

Según la figura anterior tenemos:

  • Industria 1.0.: la primera revolución industrial surgió en 1784 con el primer sistema de mecanizado implantado gracias a la máquina de vapor.
  • Industria 2.0: en esta era destaca el invento de la cinta transportadora. Comienza lo que se conoce como la fabricación en serie.
  • Industria 3.0: en los años 60 aparecen los semiconductores y con ellos los primeros controladores programables que permiten automatizar la producción.
  • Industria 4.0: la cuarta revolución industrial se caracteriza por la digitalización de todos los procesos de producción y su conexión a internet.

Cómo está la IA impactando en la industria

En prácticamente todas las empresas de producción encontramos máquinas, así como robots industriales que realizan tareas de forma automatizada, pero esto no significa que usen IA. La principal diferencia entre inteligencia artificial y automatización es que:

  • La automatización utiliza un software que sigue unas reglas y unos pasos preprogramados.
  • La inteligencia artificial es capaz de realizar tareas y tomar decisiones para las que no ha sido específicamente programada previamente.

Tenemos claro qué tareas o en qué áreas de nuestra empresa podemos aplicar la automatización, pero ¿y la inteligencia artificial? ¿Dónde resultaría útil?

Obviamente no existe una fórmula mágica y cada empresa tiene diferentes necesidades y una cultura diferente. Sin embargo, si la automatización de una organización suele suponer ahorros de costes que van del 40% al 75% por ciento y una recuperación de varios meses a varios años, ¿qué cabría esperar si empleamos inteligencia artificial?

Estas son algunas de las áreas de una empresa de producción en las que la inteligencia artificial se muestra realmente útil a la hora de transformar dicha organización:

Mantenimiento

Robot soldador, foto de Clayton Cardinalli, CC0

El mantenimiento predictivo hace que el equipo se someta a mantenimiento cuando es necesario, mientras que el mantenimiento preventivo hace que el trabajo se realice según un cronograma establecido, sea necesario o no.

Para aplicar un mantenimiento predictivo, la empresa debe recopilar y posteriormente analizar mediante técnicas de IA datos de varias fuentes de fabricación como máquinas, sensores, interruptores, etc. Usando algoritmos avanzados de aprendizaje automático (machine learning) las empresas son capaces de predecir cualquier anomalía que pueda provocar un fallo en un equipo antes de que suceda.

Con el uso de IA, las empresas pasarían de realizar mantenimientos preventivos a mantenimientos predictivos, antes de que se produzcan los fallos y anticipándose a ellos con un alto nivel de confianza, con el ahorro en costes que eso supondría.

Calidad

Actualmente, en los procesos industriales, los sistemas de calidad se basan en la evaluación de los productos terminados y la comprobación de su correcto funcionamiento.

Gracias al uso de ciencia de datos e inteligencia artificial, es posible obtener y procesar una gran cantidad de información que permita predecir situaciones complicadas que provocarían importantes problemas de calidad.

Los principales fabricantes usan inteligencia artificial, y más específicamente el aprendizaje automático, para ayudar a garantizar que sus productos estén libres de defectos antes de que salgan de la planta, con el consiguiente ahorro en costes que ello conlleva.

Gracias al empleo de IA, es posible controlar la calidad antes de que el producto esté acabado.

Seguridad

La seguridad en el lugar de trabajo es muy importante; los trabajadores de producción están constantemente en riesgo, pero con la tecnología actual, los fabricantes pueden limitar las amenazas y mejorar la seguridad de sus activos más valiosos: su gente. Veamos un par de ejemplos:

Instrucciones de trabajo en 3D

Todos sabemos que las instrucciones de trabajo y, en especial, los manuales de las máquinas, a veces son textos no tan didácticos ni tan claros como cabría esperar.

Incluir realidad aumentada en las instrucciones de proceso, así como en los manuales, puede ayudar a los trabajadores a comprender mejor las tareas y a ser conscientes de los riesgos de seguridad y las condiciones peligrosas cuando trabajan con cierta maquinaria. El texto impreso carece del contexto visual que proporciona la RA.

Monitorización en tiempo real

Monitorear el estado de las máquinas, líneas e instalaciones permite predecir y responder a posibles problemas de seguridad antes de que sucedan. Por ejemplo, si se detecta una anomalía dentro de un equipo sobre aspectos como la temperatura, la calidad del aire o los niveles de ruido, permitiría apagar proactivamente equipos defectuosos o despejar áreas inseguras anticipándose con alta confianza a los problemas de segudidad. Con este tipo de información operativa al alcance de la mano y analizada en tiempo real, se puede, no solo mejorar el cumplimiento de la normativa de prevención, sino hacer que el lugar de trabajo y el medio ambiente sean significativamente más seguros.

Gracias a la IA ahora hay tecnología disponible que permite mejorar la seguridad en la industria y evitar lesiones y enfermedades a los trabajadores.

Interacción hombre-robot

Foto ornamental de la mano de un robot, por Possesed Technology, CC0

En comparación con las soluciones totalmente automatizadas, los robots colaborativos (cobots) son muy rentables, algo que los hace atractivos para las pymes y otras empresas que quizás no hayan pensado en invertir en automatización. Además de esto, permiten a las empresas hacer un mejor uso de su personal y, gracias a la programación sencilla y los tiempos de configuración rápidos, proporcionan una opción viable en pequeñas tiradas de producción.

El uso de IA (concretamente redes neuronales) para modificar las operaciones realizadas por el robot en función de movimientos humanos medidos y predichos, abre un mundo completamente nuevo de posibilidades para un trabajo más eficiente y flexible.

Usando IA podríamos modelar, rastrear y predecir los movimientos humanos dentro del espacio de trabajo de un robot.

Resumen

La inteligencia artificial (IA) y el Machine Learning (ML), apoyados en ciencia de datos, sensores y las nuevas redes de comunicaciones, se están convirtiendo rápidamente en indispensables para una amplia variedad de industrias, transformando la forma en que se realizan las inspecciones (control de calidad), el mantenimiento y el ensamblaje, entre otras operaciones, y ahorrando costes, mejorando los productos y aumentando la seguridad.


Ofuscación: cómo proteger el código de tus aplicaciones .NET

$
0
0

En un post anterior vimos cómo era posible recuperar el código de cualquier programa de .NET a partir de su .exe o .dll usando un descompilador. Hoy vamos a ver cómo podemos tratar de evitarlo gracias al uso de un ofuscador de código.

Los ofuscadores de código, como su propio nombre indica, tienen la capacidad de complicar mucho el código original de modo que, aunque no cambia lo que hace el programa, y el computador es capaz de ejecutarlo sin problemas, cuando un humano lee el código fuente resultante es tan complejo que no es capaz de seguirlo.

Primero te cuento en este vídeo cómo puedes lograrlo y, a continuación, te dejo algunas consideraciones importantes sobre estas técnicas de ofuscación, el código de ejemplo, y los enlaces mencionados.

¡Vamos allá!

[youtube:W77fzhtxgS0]

Debes tener en cuenta que la ofuscación no impide descompilar el código, sólo lo complica mucho, por lo que si lo que quieres ocultar es un detalle muy concreto (como una protección o licencia) no te servirá de mucho ante un "cracker" con determinación.

Existen algunas herramientas muy especializadas como De4DOT o DEObfuscar, que se especializan en deshacer la ofuscación con más o menos éxito según la complejidad del programa. Por ejemplo, aunque es muy efectivo con otros descompiladores, De4Dot no logra apenas nada con el código ofuscado con Obfuscar, el ofuscador que he utilizado en el vídeo. Sin embargo, DEObfuscar es mejor y puede aclarar bastante el código, aunque sigue siendo muy lioso, entre otras cosas porque no recupera nombres de funciones internas, variables, etc...

Por otro lado, no debes obsesionarte con ofuscar el código. Al final hay una verdad universal en programación que, cuando tienes experiencia acabas por descubrir: es mucho más complicado leer código que escribirlo. Y si no, prueba a leer y entender el código de cualquier aplicación Open Source que conozcas que no tenga muchos comentarios o, sin ir más lejos, código tuyo de hace un par de años si lo tienes. Lo más importante en una aplicación no trivial son las miles de pequeñas decisiones que se toman y por qué se toman, y no tanto la implementación concreta de las mismas. Por eso es muy importante mantener una buena documentación interna y externa.

De todos modos, si lo necesitas, espero que este vídeo te haya resultado interesante para aprender a proteger tu código fuente para .NET.

Te dejo el código fuente de las aplicaciones de ejemplo aquí:

Enlaces de interés:

 

Noticias de programación para programadores ocupados #9: semana 1-Marzo-2021

$
0
0

SASS: ¿Cómo puedo depurar mis archivos .scss?

$
0
0

Imagen ornamental

El uso de preprocesadores de CSS nos permite superar las limitaciones del lenguaje (falta de reutilización, lógica, etc...) y construir hojas de estilo mucho más poderosas, reutilizables e incluso con lógica avanzada, funciones, etc... para llevar nuestro código CSS a un nivel superior. No en vano se utiliza en todo el desarrollo web profesional, dejando las hojas de estilo CSS para proyectos sencillos. Dentro de estos preprocesadores el más utilizado es sin duda Sass (Syntactically Awesome Style Sheets) y, en concreto, su variante SCSS.

Durante el desarrollo con Sass, en ocasiones la cosa se puede complicar, por lo que puede resultar útil obtener información sobre el valor de ciertas variables, mostrar algún mensaje en medio del proceso de una función o mixin, o incluso detener el procesamiento completo del archivo SCSS si fuese necesario.

Para ello Sass nos ofrece tres directivas específicas:

  • @warn: nos permite mostrar un mensaje en la consola, sustituyendo variables si es necesario, para indicar cualquier información que necesitemos. Se muestra en la consola durante el procesamiento del archivo.
  • @error: es idéntica a la anterior pero mucho más restrictiva; además de mostrar el mensaje detiene el procesado del código SCSS.
  • @debug: se utiliza dentro de selectores de estilo y muestra el valor de una variable que le pongamos a continuación.

Por ejemplo, consideremos el siguiente fragmento de SCSS con una variable y una función para asignar colores solo dentro de una lista determinada:

$colores: (
  rojo: #FF5500,
  azul: #0055FF,
);

@function ponColor($color) {
  @if map-has-key($colores, $color) {
    @return map-get($colores, $color);
  }

  @error "El color: `#{$color}` que has pasado no está disponible.";
}

Si ahora intentamos hacer una asignación como esta:

.amarillo {
  color: ponColor(amarillo);
}

Dado que el color "amarillo" no está definido, al intentar compilarlo a CSS, veremos por pantalla algo similar a esto:

Imagen del error mostrado en la consola

Que detiene el procesamiento porque intentamos utilizar un color no permitido.

Podríamos haber utilizado un @warn y devolver un valor por defecto, lo cual no detendría la ejecución.

En cuanto a @debug podríamos hacer algo así:

$rojo-oscuro: darken(#ff0000, 10%);

.rojoOscuro {
    @debug $rojo-oscuro;
    color: $rojo-oscuro;
}

En este caso, mostraríamos por consola el valor asociado a la variable $rojo-oscuro, además de utilizarla para asignar el color en un selector, viendo esto en la consola:

Resultado en la consola de @debug

Esto se suele utilizar solamente para depuraciones internas, mientras estamos trabajando con un archivo. Los anteriores, sin embargo, se utilizan cuando creamos archivos que se van a reutilizar y queremos mandar mensajes de advertencia o error cuando los utilicen otras personas del equipo.

Puedes aprender SASS y muchas otras cosas más (npm, Gulp, Webpack, TypeScript...) en nuestro curso de Herramientas Avanzadas para desarrollo Web Front-End.

Nuevo curso: Desarrollo Web con Java y Spring Boot

$
0
0

Tenemos nuevo curso en nuestro catálogo: un curso de desarrollo web con Java y Spring Boot. Se trata de una formación que teníamos muchas ganas de lanzar ya que nos lo pedían nuestros alumnos del curso de Java, precisamente para poder dar el siguiente paso en su carrera profesional.

Es muy práctico y lleno de consejos basados en la experiencia de uso real de Rubén Pahíno (autor y tutor) con el que aprenderás a crear aplicaciones Web desde cero con Java y Spring, desde la arquitectura al despliegue.

Logo del curso de Spring Boot

¿Qué es Spring y para qué sirve?

¿No conoces Spring? Tenemos un post entero explicando qué son Spring y Spring Boot pero te daremos un definición rápida: Spring es un maravilloso framework gratuito y de código abierto para el desarrollo con Java, Kotlin y Groovy que sobre todo se usa en desarrollo web, aunque te permite crear todo tipo de aplicaciones.

Si te interesa el desarrollo para la web con Java (o vas a iniciarte en él) antes o después te darás de bruces con este framework.

¿Y cuál es la diferencia entre Spring y Spring Boot?

Spring es el framework y Spring Boot es una extensión de Spring que simplifica mucho los procesos de configración inicial y la preparación de aplicaciones para producción.

Con este curso aprenderás a sacar el máximo partido a las últimas versiones de Spring Framework y Spring Boot. No es un simple tutorial, al terminar tendrás nivel suficiente como para incorporarte a un equipo profesional de desarrollo de microservicios o aplicaciones Web con Spring.

En campusMVP nuestros cursos van más allá de simples recopilaciones de trucos y recetas. Nos esforzamos para que entiendas todos los conceptos importantes y las mejores prácticas. Los alumnos que ya nos conocen saben que creamos cursos con el máximo rigor y enfocados en que aprendas de verdad.

Aprender haciendo: Tu primera aplicación con Java y Spring Boot

Volviendo al curso, en él tendrás la ocasión de crear una completa aplicación para practicar lo aprendido: se trata de WonderBoot. Desarrollarás con Java y Spring Boot una pequeña red social de viajes con múltiples funcionalidades muy interesantes. En este vídeo puedes conocerla un poco mejor:

[youtube:mR-jZNa-sJI]

Un poquito de historia sobre Spring

Para entender el nacimiento de Spring, tenemos que remontarnos a la época de la postburbuja punto com y el nacimiento de la web 2.0. En esa época, Rod Johnson (el creador de Spring) era un consultor y desarrollador independiente de Java al que se lo llevaban los demonios ante lo doloroso de usar Java en desarrollo web y las pobres implementaciones que hacían las empresas en una época burbujeante donde la web estaba comenzando a despegar de verdad.

En aquel entonces, Java estaba principalmente orientada al desarrollo para escritorio y los modelos dominantes de programación para aplicaciones basadas en web eran la API Java Servlet y los Enterprise JavaBeans.

Así que, el bueno de Rod decidió liarse la manta a la cabeza y (a la vez que escribía un libro) desarrollar un framework cuyos pilares fuesen los patrones de diseño y las buenas prácticas en la programación. El libro se titulaba Expert One-on-One J2EE Design and Development (Wrox Press, octubre 2002) y el framework que le sirvió de apoyo para explicar con más claridad los ejemplos del libro desembocó en 2004 en la versión 1.0 de Spring.

Spring fue muy bien recibido por la comunidad de desarrolladores a pesar de que introducía conceptos y técnicas desconocidas entonces para muchos de ellos, como la IoC (Inversión de Control) y la POA (Programación Orientada a Aspectos). Lo importante era que les iba a facilitar muuucho la vida.

Así que ya sabes, si tú también quieres facilitarte la vida desarrollando para la web con Java, aquí tienes nuestro curso. 😉

Test de programación revelan que JavaScript y Java son los conocimientos más demandados por las empresas

$
0
0

Por tercer año consecutivo DevSkiller ha publicado su informe anual sobre la industria tecnológica con la intención, según sus propias palabras, de proporcionar información valiosa a los profesionales de contratación de TI para ayudarlos en su toma de decisiones.

El informe de este año se realizó a partir de 304.645 test de programación enviados a desarrolladores en 156 países. Todos los datos son información agregada genérica y no están vinculados a ninguna información específica sobre determinados candidatos o empresas. Los resultados se dividen en dos grandes bloques: el primero relacionado con los conocimientos y el segundo con la demografía.

Información sobre contratación técnica y conocimientos de TI

Java y JavaScript son los conocimientos más solicitados

Java y JavaScript están empatados en primer lugar como los conocimientos de TI más demandados para 2021 (43%). Completando el top-5 están SQL, .Net/C# y HTML/CSS.

Es un resultado muy similar al obtenido por la encuesta realizada a los desarrolladores por Stack Overflow o por el mostrado por Github en su conocido informe anual Octoverse donde Java estaba un par de puestos por detrás de JavaScript en el ranking de los lenguajes más usados.

El 75% de las empresas buscan desarrolladores de JavaScript

A pesar de los pequeños cambios en la popularidad general de los stacks de tecnología, las exigencias de las empresas de TI no han cambiado con respecto al año pasado. En 2020, el 75% de las empresas buscaban desarrolladores de JavaScript. SQL ocupó el segundo lugar con un 63%, mientras que Java ha caído levemente al 51%. HTML / CSS y .NET / C # han experimentado pequeñas mejoras con respecto al año pasado en un 48% y 41%, respectivamente.

Conviene señalar que, en este informe, TypeScript se ha metido en el mimo saco que JavaScript. Los responsables de DevSkiller prometen distinguir entre ambos lenguajes el año que viene.

JavaScript es el lenguaje más popular probado junto con otros

Según los resultados obtenidos por DevSkiller, las empresas desean tener desarrolladores con una gama más amplia de conocimientos. En el front-end, JavaScript lidera el camino como el lenguaje más popular, mientras que Java y Python lideran el back-end, y todo ello se complementa con SQL.

 

El lugar de residencia y la contratación

Más que nunca, los países buscan gente en el extranjero

La covid-19 ha provocado cambios significativos en los patrones de contratación de las empresas. Muchas de ellas, le han perdido el miedo al trabajo en remoto y esto ha causado un aumento sustancial de la contratación internacional.

¿A quién contratamos y quién nos contrata?

En el caso de España, lo cinco países en los que las empresas españolas contratan desarrolladores son:

  • Francia
  • Estados Unidos
  • Japón
  • Polonia
  • República Dominicana

Los países que contratan a programadores españoles son:

  • Argentina
  • Portugal
  • Serbia
  • Ucrania
  • Estados Unidos

En este artículo hemos resumido los puntos más útiles del informe publicado por DevSkiller, pero hay algunos más que podría ser interesantes echarles un vistazo por tu cuenta.

 

Noticias de programación para programadores ocupados #10: 2ª semana de Marzo de 2021

$
0
0

Portada, imagen ornamental[youtube:YK_ycp9SHH0]

Enlaces noticias programación:

Seguridad Exchange

La vulnerabilidad descubierta hace poco para Exchange on-prem se está dispersando como loca por todo el mundo y se estima que se están duplicando los servidores afectados cada dos horasEncima están aprovechando la vulnerabilidad para instalar el ransomware DearCrySegún la empresa de seguridad Esset, hay al menos 10 operaciones de cracking en marcha escaneando la Red en busca de servidores vulnerables.

Si tienes servidores Exchange quizá ya estén infectados y no lo sepas, pero puedes aplicar este script de la propia Microsoft para averiguarlo y este otro script para mitigarlo.

¡Actualízalos cuanto antes!

Otros de seguridad:

Microsoft Mesh - Realidad Aumentada

Esto al final se quedó fuera del vídeo para no hacerlo más largo...

¿Recuerdas lo que comenté la semana pasada sobre Microsoft Mesh para realidad aumentada y experiencias mixtas?: Pues tenemos un montón de enlaces interesantes nuevos para saber más, incluso técnicamente:

 

 

 

 

Qué peligro implican los sesgos en los modelos de inteligencia artificial

$
0
0

Imagen ornamental, una estatua de la Justicia sosteniendo una balanza, a partir de una foto de Tingey Injury Law Firm, CC0

Hace unos años, al hablar de modelos de inteligencia artificial (IA), prácticamente se asumía que nos ceñíamos a unos contextos muy concretos y exclusivos: grandes empresas tecnológicas, centros de investigación en la materia y entornos similares. Esta situación ha cambiado drásticamente a día de hoy.

En la actualidad esos modelos de IA están en nuestro teléfono móvil, la smart TV de nuestro salón o el asistente digital de turno, hablando exclusivamente de dispositivos físicos. También están integrados en nuestro software de correo, en las redes sociales y muchos de los servicios telemáticos que usamos a diario. Fuera del ámbito personal, si no nos restringimos y abrimos el abanico a entornos empresariales e institucionales, los procesos en los que se recurre a modelos generados por algoritmos de aprendizaje automático son incontables.

La interacción entre la vida cotidiana de las personas y los citados modelos de IA es tan frecuente, y afecta a tantos niveles de la actividad humana, que su honestidad y ecuanimidad resultan esenciales. Pero, ¿no son todas las aplicaciones de ordenador justas y actúan de manera "ciega", guiadas solo por los datos? Ciertamente, así es como deberían ser, pero no siempre su comportamiento se acerca a ese ideal.

Casos de comportamiento inadecuado de un modelo de IA

Antes de analizar cuáles son las causas que pueden llevar a un modelo de IA, que es un programa de ordenador al fin y al cabo, a mostrar un comportamiento indeseado, veamos algunos casos concretos en los que esto se ha dado. Varios de ellos son notorios, otros no tanto pero resultan igualmente importantes para las personas a las que ha afectado.

Un bot agresivo y malhablado

Millones de personas usan a diario distintas redes sociales para intercambiar pareceres con otras. Twitter está entre los servicios más populares. Lo que probablemente muchos usuarios desconocen es que no siempre quien está al otro lado, contestando a un tweet nuestro, es una persona, sino un bot: un programa que actúa como lo haría un usuario cualquiera.

En general los bot se diseñan para dar un servicio concreto e interactúan con las personas según unas reglas y vocabulario muy restringidos. No obstante, Microsoft quiso ir más allá en 2016 y desarrolló Tay (Thinking About You), un bot cuyo objetivo era hacerse pasar por un individuo más, concretamente una adolescente norteamericana típica, aprendiendo las formas y el vocabulario de las publicaciones del resto de personas. El resultado fue inesperado para muchos y criticado por todos.

Tweet de Tay con un mensaje racista y de odio explícito. Imagen tomada de Twitter

A pesar de que Tay contaba con una (paradójicamente) "lista negra" de temas a no tocar, frente a los que respondía de manera genérica, en solo 16 horas de vida sus tweets estaban repletos de mensajes racistas y lenguaje sexual explícito, razón por la que Microsoft decidió hacer ajustes y, finalmente, desactivar el bot definitivamente.

Un restaurador de imágenes con preferencias raciales

Las redes neuronales pueden afrontar tareas que a muchos les parecerán increíbles, haciendo realidad lo que hasta no hace mucho parecía ciencia ficción. ¿En cuántas películas y series hemos visto cómo el informático de turno toma una imagen desenfocada, la amplia y después aplica un algoritmo de mejora a una parte pixelada hasta identificar la cara de una persona o una matrícula?

No son pocas las soluciones basadas en aprendizaje profundo que afrontan lo que se ha venido a llamar superresolución, convirtiendo en realidad la escena antes mencionada. Uno de los modelos más sofisticados, denominado PULSE, procede de un artículo publicado en marzo de 2020, cuyo código se puso a disposición pública en Github para que cualquiera pudiera usarlo.

Imagen de entrada a la izquierda y resultado generado a la derecha. Origen: PULSE: Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models

Los problemas con PULSE saltaron rápidamente a los medios de comunicación cuando se publicó en un tweet el resultado de aplicar el modelo a una imagen pixelada de Barack Obama. La restauración de la imagen generaba una cara con rasgos claramente caucásicos. Esta inclinación racial del modelo se confirmó con muchos otros ejemplos.

La precognición de delitos por medios tecnológicos

Predecir dónde va a producirse un delito e identificar al delincuente, sin necesidad de contar con precogs como en la película Minority Report, es otra de las aplicaciones potenciales de los modelos de IA. Para ello se aúnan indicadores estadísticos sobre delincuencia, técnicas de geolocalización y modelos de identificación automática de caras de personas procedentes de sistemas de vídeovigilancia.

Es un contexto en el que el nombre Clearview AI, empresa a la que el New York Times dedicó un extenso artículo hace ahora un año, destaca por méritos propios. Los servicios de esta misma empresa, sin embargo, han dejado de utilizarse por completo en países donde se prestaban, como es el caso de Canadá, y para muchos otros, incluyendo los pertenecientes a la Unión Europea o ciertos estados de EEUU, como California, la empresa se ha visto obligada a ofrecer un mecanismo de eliminación de datos a petición de los usuarios.

El mayor problema con el sistema de Clearview AI, aunque no es el único afectado, es la tendencia a identificar como delincuentes a personas con rasgos no caucásicos, así como a concentrar las sospechas de potenciales delitos en barrios con este tipo de población.

Cómo se inducen los sesgos en los modelos

¿Por qué los sistemas basados en técnicas de IA cometen este tipo de fallos? Aunque la pregunta correcta que deberíamos plantearnos sería, ¿por qué un sistema de IA se comporta como lo harían muchas personas en nuestra sociedad?

Cómo opera un sistema basado en IA

El núcleo de la mayoría de sistemas basados en IA está formado por un modelo o un conjunto de modelos que almacenan el conocimiento obtenido previamente a partir de unos datos. Estos modelos de conocimiento, como puede ser una red neuronal o un árbol de decisión, cuentan con infinidad de parámetros que es preciso ajustar, concentrando el conocimiento que reside en los datos de partida.

Diferencias entre un algoritmo tradicional y otro basado en aprendizaje automático

Esa tarea de ajuste, a la que se denomina habitualmente entrenamiento, queda en manos de algoritmos que habitualmente son genéricos y agnósticos respecto a los datos. El algoritmo que decide en cada nodo de decisión qué camino se debe tomar se guía por parámetros de puro rendimiento, lo que significa que se persigue obtener la mayor proporción de aciertos a nivel global.

Dado este comportamiento de los algoritmos que generan los modelos, la calidad de estos reside fundamentalmente en los datos que se proporcionan como entrada para llevar a cabo el entrenamiento.

Existen dos problemas especialmente importantes en particular:

1.- Tener en cuenta aspectos de los que se debería hacer caso omiso

Cuando se toma una base de datos que almacena información operativa, con las transacciones habituales de una empresa, y se pretende emplearla para generar un modelo de IA, el primer paso siempre debería ser la selección de las variables que realmente importan o, dicho a la inversa, el descarte de elementos que no resultan importantes para el objetivo para el que se utilizará el modelo.

Alimentar un sistema que debe decidir si se concede o no un préstamo por parte de una entidad bancaria con todos los datos históricos sobre préstamos, sin realizar la selección antes indicada, llevará al modelo de IA a tomar como relevantes aspectos que, en realidad, deberían ignorarse por completo.

Por ejemplo, dado que históricamente, sobre todo hace ya unas décadas, la mayor proporción de préstamos han sido solicitados por hombres casados, el modelo de IA podría decidir rechazar la concesión simplemente porque la solicitante sea una mujer o no esté casada. Se ha obtenido un modelo sesgado pero que, siendo honestos, se limita a usar la información que se le ha facilitado. Según esa base de datos, si predice la concesión para hombres casados y la no concesión para mujeres o solteros alcanzará un ratio de acierto muy alto.

El problema, lógicamente, es que no deberían tenerse en cuenta rasgos de las personas que no influyen en su capacidad para afrontar los pagos del servicio prestado. Este contrasesgo ha de ser introducido en el modelo de alguna manera y, a priori, la vía más fácil es la de seleccionar de manera minuciosa las variables facilitadas.

2.- El problema de la distribución de casos

Una gran parte de los problemas generados por los modelos de IA, entre los que se encuentran los descritos anteriormente, tienen su raíz en la variedad de los datos usados por el algoritmo de entrenamiento como casos a partir de los que ajustar ese modelo. Para ser más precisos, el obstáculo estriba en la desigual representación de cada categoría considerada.

El desequilibrio en las categorías de datos influye en los modelos de IA

Un modelo, como puede ser una red neuronal, es similar a una cerebro primitivo y recién nacido, en el sentido de que es muy maleable y no cuenta con conocimientos previos. Es capaz de aprender muy rápido, a partir de la información que se le facilite. Es la manera en la que los bebés adquieren la capacidad de hablar y la mayor parte de comportamientos, observando el entorno a través de sus sentidos.

¿Qué ocurre si a una entidad de este tipo la alimentamos de una forma sesgada, ya sea intencionalmente o no? Si en su entorno se emplea principalmente lenguaje malsonante el modelo lo reproducirá, como ocurriría con un niño pequeño. Esto es precisamente lo que ocurrió con Tay, cuyas interacciones con otros usuarios de redes sociales estuvieron cargadas de mensajes sexistas y racistas.

Si a un modelo se le entrena para identificar personas y en su mayor parte todas las caras que se usan para ajustarlo son de personas con rasgos caucásicos, no es de extrañar que cuando se intenta usar con una persona con otras características raciales cometa errores. Esta es la razón de que sistemas como el de Clearview AI y similares fallen, al haber sido entrenados con bases de datos como el conjunto Flickr-Faces-HQ, con decenas de miles de caras principalmente de personas blancas.

Conclusiones

Los sistemas de IA no están compuestos de algoritmos escritos por personas, su conocimiento es adquirido a partir de la información que se le facilita como ejemplo y, en general, el mecanismo de aprendizaje es genérico, no guiado, es decir, se asimila todo lo posible de los casos que se conocen.

De entrada, no existen modelos de IA o algoritmos de IA malos, sino una selección de datos inadecuada para llevar a cabo su ajuste. No deberíamos echar la culpa al sistema de IA, sino a quien no ha llevado a cabo previamente un análisis exploratorio para determinar los problemas subyacentes: presencia de variables no relevantes, desbalanceo de los datos con muchos casos de un tipo y muy pocos de otros, etc.

Para la mayor parte de los defectos existentes en los datos pueden aplicarse medidas correctivas: selección de variables, generación de ejemplos artificiales para equilibrar la distribución o, incluso, realizar ajustes en el propio algoritmo de entrenamiento. Cuando este proceso, el del ajuste del modelo, se realiza mientras se interacciona con el entorno en tiempo real, como ocurrió con Tay, también existen alternativas si bien podrían ser algo más complejas, como puede ser el contar con un corpus de términos y temas ante los que debe reaccionarse de forma predeterminada.

Por eso, aunque se trata de un aspecto del Machine Learning que muchas veces no se considera o se desprecia frente a los más llamativos de procesos de predicción, el proceso de análisis y procesamiento de datos previo, es incluso más importante, y suele consumir un porcentaje muy alto de todo el proceso, pues de él depende el éxito de los modelos que generemos.

 


Noticias de programación para programadores ocupados #11: 3ª semana de Marzo de 2021

$
0
0

La API de persistencia de Java: ¿Qué es JPA? - JPA vs Hibernate vs EclipseLink vs Spring JPA

$
0
0

Imagen ornamental con logos de las tecnologías mencionadas

Casi cualquier aplicación que vayamos a construir, tarde o temprano tiene que lidiar con la persistencia de sus datos. Es decir, debemos lograr que los datos que maneja o genera la aplicación se almacenen fuera de esta para su uso posterior.

Esto, por regla general, implica el uso de un sistema de base de datos, bien tradicional basado en SQL, bien de tipo documental (también conocido como No-SQL).

A la hora de desarrollar, los programas modernos modelan su información utilizando objetos (Programación Orientada a Objetos), pero las bases de datos utilizan otros paradigmas: las relaciones (también llamadas a veces "Tablas") y las claves externas que las relacionan. Esta diferencia entre la forma de programar y la forma de almacenar da lugar a lo que se llama "desfase de impedancia" y complica la persistencia de los objetos.

Para minimizar ese desfase del que hablo y facilitar a los programadores la persistencia de sus objetos de manera transparente, nacen los denominados ORMs o mapeadores Objeto-Relacionales.

¿Qué es JPA?

Ahora que ya estamos más o menos situados, podemos empezar a ver qué es la API de Persistencia de Java o JPA.

Nota: aunque API de persistencia era su nombre original y, en realidad, el que todo el mundo sigue usando, conviene saber que el nombre oficial ahora es Jakarta Persistence, ya que Jakarta es el nombre actual de lo que antiguamente se llamaba Java Platform Enterprise Edition o Java EE (también llamada coloquialmente "Java empresarial"). El motivo es que en 2018 pasó a gestionarlo la fundación Eclipse y, como Java es una marca registrada de Oracle, se vieron forzados también a cambiarle el nombre, decidiéndose por "Jakarta".

JPA es una especificación que indica cómo se debe realizar la persistencia (almacenamiento) de los objetos en programas Java. Fíjate en que destaco la palabra "Especificación" porque JPA no tiene una implementación concreta, sino que, como veremos enseguida, existen diversas tecnologías que implementan JPA para darle concreción.

JPA forma parte de Java empresarial desde su versión 5, en el año 2006. Desde entonces han aparecido varias versiones de la especificación, que sigue el proceso de la comunidad Java, siendo la más reciente la 2.2, aparecida en el verano de 2017.

Aunque forma parte de Java empresarial, las implementaciones de JPA se pueden emplear en cualquier tipo de aplicación aislada, sin necesidad de usar ningún servidor de aplicaciones, como una mera biblioteca de acceso a datos.

¿Cómo funciona JPA?

Dado que es una especificación, JPA no proporciona clase alguna para poder trabajar con la información. Lo que hace es proveernos de una serie de interfaces que podemos utilizar para implementar la capa de persistencia de nuestra aplicación, apoyándonos en alguna implementación concreta de JPA.

Esquema de funcionamiento de JPA

Es decir, en la práctica significa que lo que vas a utilizar es una biblioteca de persistencia que implemente JPA, no JPA directamente. Más adelante, veremos algunas de estas implementaciones, pero, mientras tanto, conviene saber qué funcionalidades definen estas interfaces en la especificación, mediante las interfaces del diagrama anterior, ya que luego serán las que utilices con cada implementación concreta.

1.- Mapeado de entidades

Lo primero que tienes que hacer para usar una implementación de JPA es añadirla al proyecto y configurar el sistema de persistencia (por ejemplo, la cadena de conexión a una base de datos). Pero, tras esas cuestiones de "fontanería", lo más básico que deberás hacer y que es el núcleo de la especificación es el mapeado de entidades.

El "mapeado" se refiere a definir cómo se relacionan las clases de tu aplicación con los elementos de tu sistema de almacenamiento.

Si consideramos el caso común de acceso a una base de datos relacional, sería definir:

  • La relación existente entre las clases de tu aplicación y las tablas de tu base de datos
  • La relación entre las propiedades de las clases y los campos de las tablas
  • La relación entre diferentes clases y las claves externas de las tablas de la base de datos

Esto último es muy importante, ya que permite definir propiedades en tus clases que son otras clases de la aplicación, y obtenerlas automáticamente desde la persistencia en función de su relación. Mejor veámoslo con un ejemplo:

@Entity
public class Factura {
    @ManyToOne
    private List<LineaFactura> lineasFactura;
    ...
}

En este ejemplo, cada factura consta de varias líneas de factura, y con estos atributos estamos definiendo esta circunstancia. Posteriormente, cuando obtengamos una factura podremos consultar sus líneas de factura de manera transparente, pues será la implementación concreta de JPA la que se encargue de obtener automáticamente las asociadas a esa factura desde la base de datos sabiendo de esta relación.

Como ves, esto facilita enormemente el acceso a datos, y creo que ahora le empezarás a ver la potencia a JPA.

Nota: aunque esto es muy cómodo, es necesario tener mucho cuidado con los tipos de relaciones que definimos y de qué manera y dónde lo hacemos, ya que puede influir negativamente en el rendimiento de nuestra aplicación.

Como puedes observar en el fragmento anterior, lo que define JPA es también una serie de anotaciones con las que podemos decorar nuestras clases, propiedades y métodos para indicar esos "mapeados".

Además, JPA simplifica aún más el trabajo gracias al uso de una serie de convenciones por defecto que sirven para un alto número de casos de uso habituales. Por ello, solo deberemos anotar aquellos comportamientos que queramos modificar o aquellos que no se pueden deducir de las propias clases. Por ejemplo, aunque existe una anotación (@Table) para indicar el nombre de la tabla en la base de datos que está asociada a una clase, por defecto si no indicamos otra cosa se considerará que ambos nombres coinciden. Por ejemplo, en el fragmento anterior, al haber anotado con @Entity la clase Factura se considera automáticamente que la tabla en la base de datos donde se guardan los datos de las facturas se llama también Factura. Pero podríamos cambiarla poniéndole la anotación @Table(name="Invoices"), por ejemplo.

Nota: también define una manera de hacerlo al revés, es decir, partir de una base de datos y generar a partir de esta las entidades de la aplicación, pero no se recomienda su uso.

2.- Tipos de datos personalizados

Todos los tipos de datos fundamentales estándar están soportados por JPA. Pero, también es posible dar soporte a tipos de datos propios, personalizados, utilizando lo que se llaman convertidores, a través de la interfaz AttributeConverter y la anotación @Converter.

3.- JPQL y consultas nativas

JPA define también su propio lenguaje de consultas llamado JPQL. Es similar a SQL y se utiliza para lanzar consultas específicas pero basadas en las entidades que tenemos en la aplicación y no en las tablas de la base de datos. Es decir, las consultas JPQL hacen referencia a las clases Java y sus campos en lugar de a tablas y columnas. Y además son independientes del motor de bases de datos.

A partir de estas consultas obtenemos ya directamente entidades de nuestra aplicación. Por ejemplo:

TypedQuery<Factura> consulta = modelo
    .createQuery("SELECT f FROM Factura f WHERE f.id = :id", Factura.class);
consulta.setParameter("id", 5);
Factura f = consulta.getSingleResult();

También podemos lanzar consultas nativas a la base de datos:

Query consulta = modelo
    .createNativeQuery("SELECT * FROM Factura WHERE id = :id", Factura.class);
consulta.setParameter("id", 5);
Factura f = (Factura) consulta.getSingleResult();

Las consultas JPQL son más limitadas que las que ofrece el lenguaje SQL, especialmente si consideramos las particularidades de los "dialectos" de cada motor de datos, pero son suficientes para un porcentaje alto de los casos. En cualquier caso, no deberíamos abusar de ninguno de los dos tipos de consultas, pues van en contra de la filosofía de los ORMs.

4.- Otras características

Aparte de todo lo mencionado, a lo largo de los años y las versiones JPA han ido añadiendo soporte para más funcionalidades como:

  • Soporte de colecciones y listas ordenadas
  • API Criteria para construcción de consultas
  • API adicional para generación de consultas DDL (creación y modificación de estructura de la base de datos)
  • Soporte para validaciones
  • Ejecución de procedimientos almacenados
  • Etc...

Como es habitual en las especificaciones del programa de proceso de comunidad de Java, el PDF de la especificación de JPA es bastante claro y legible, por si te interesa profundizar en el tema, te dejo el enlace a su última versión.

Implementaciones de JPA

Como llevo diciendo desde el principio, JPA es una especificación, así que para usarlo en la práctica necesitamos una implementación concreta, que implemente todas las interfaces y cuestiones definidas por la especificación.

La principal ventaja de esto es que, si las bibliotecas de persistencia que utilices siguen la especificación JPA, podrás cambiar de una a otra, con más rendimiento o características mejores, sin tener que tocar tu código, simplemente cambiando las referencias.

Existen diversas implementaciones disponibles, como DataNucleus, ObjectDB, o Apache OpenJPA, pero las dos más utilizadas son EclipseLink y sobre todo Hibernate.

La implementación de referencia de JPA, es decir, la implementación que proporciona la propia Fundación Eclipse y que sirve para ver cómo crear un ORM basado en la especificación, es EclipseLink. Esta implementación incluye soporte para persistencia en bases de datos relacionales, bases de datos documentales (como MongoDB), almacenes XML (especificación JAXB) y servicios web de bases de datos, por lo que es muy completa. Además añade otras características propias por encima de JPA, como son eventos para reaccionar a cambios en bases de datos o poder mapear entidades en diferentes bases de datos mismo tiempo.

La otra gran implementación de JPA es Hibernate, que en la actualidad es casi el "estándar" de facto, puesto que es la más utilizada, sobre todo en las empresas. Es tan popular que existen hasta versiones para otras plataformas, como NHibernate para la plataforma .NET. Es un proyecto muy maduro (de hecho, la especificación JPA original partió de él), muy bien documentado y que tiene un gran rendimiento.

¿Y qué pasa con Spring JPA?

Spring incluye también soporte para JPA, pero no es una implementación propia de JPA. Necesita una implementación como Hibernate o EclipseLink por debajo para funcionar.

Spring JPA ofrece una abstracción sobre JPA para facilitar la creación del patrón repositorio, muy útil para crear aplicaciones basadas en microservicios. Puede generar consultas JPA a través de convenciones de nombres. Y, además, tiene otra ventaja fundamental, y es que permite controlar los límites de las transacciones de manera declarativa utilizando la anotación @Transactional.

Así que Spring JPA no compite con Hibernate o con otras implementaciones, sino que las complementa, pudiendo utilizar Spring JPA con cualquiera de ellas y cambiar de unas otras si lo necesitas.

Spring también incluye Spring JDBC que es una capa de acceso a datos basada en el más sencillo JDBC y útil para hacer consultas nativas a bases de datos. No tiene nada que ver con JPA y puede ser muy útil y ágil para persistencia sencilla de información, evitando gracias a Spring toda la parafernalia propia del JDBC nativo.

En resumen

Cuando uno comienza a trabajar con Java puede resultar confusa tanta terminología, por lo que en este artículo he querido dar una visión general de qué es JPA, para qué sirve y cómo lo hace, cuáles son sus beneficios... y reseñar brevemente sus principales implementaciones.

Otra confusión común se da entre los distintos frameworks de acceso a datos, como Hibernate o EclipseLink y frameworks más amplios que también incluyen soluciones para acceso a datos, como Spring.

Espero que haya quedada clara la diferencia entre todos ellos.

¿Por dónde empezar a implementar inteligencia artificial o aprendizaje automático en una pyme?

$
0
0

Imagen ornamental, personas delante de un ordenador. Foto por Scott Graham en Unsplash, CCO

Hoy en día son muchas las empresas que entienden que la inteligencia artificial y el aprendizaje automático (machine learning) no son el futuro, sino el presente, pero, aunque tienen claro sus beneficios no saben por dónde empezar.

A continuación presentamos 4 consejos para empresas principiantes en IA y ML que esperemos que te ayuden a perder el miedo y coger el toro por los cuernos:

1- Identifica cómo la inteligencia artificial y el machine learning pueden ayudar a tu empresa

A la hora de prepararse para usar inteligencia artificial en una empresa, lo primero que debe hacer cualquier organización es tener claro en qué le puede ayudar esta tecnología.
Si uno está un poco perdido, investigar a otras empresas que ya utilizan inteligencia artificial y aprendizaje automático para determinar paralelismos puede ser un comienzo. Como en otros aspectos de tu negocio, ver lo que hace la competencia siempre ayuda. Por lo tanto, vale la pena averiguar cómo han abordado el problema otras empresas con objetivos similares.

Dada la complejidad del tema, es fundamental tratar de ser lo más concisos posible en este punto, no divagar ni exponer generalidades. Se deben plantear casos de uso específicos en los que la IA podría resolver problemas concretos o proporcionar un valor demostrable.

Define claramente el problema a resolver usando IA: cuanto más específico, mejor.

2- Crear una estrategia de IA

Crear una estrategia de IA por el simple hecho de tenerla no producirá grandes resultados. Para aprovechar al máximo la tecnología, la estrategia de IA debe estar vinculada a con el modelo de negocio. Por ello, el primer paso es siempre revisar la estrategia de negocio, pues quizá a partir de ahora no sea adecuada, haya que actualizarla o modificar sus prioridades.

La estrategia empresarial es tan importante como la de la IA. Por más eficiente que sea el modelo de IA que se está diseñando, gradualmente perderá su eficacia si el modelo de negocio no se alinea con el mismo.

Alinea la estrategia de negocio y la estrategia IA.

Hay que tener en cuenta que las tecnologías que se intentan introducir en la organización no son sencillas. Es mejor comenzar por pequeños proyectos que impliquen menos dinero y tiempo, pero que ayuden a demostrar valor y a ganar aceptación para, posteriormente, proponer un proyecto de mayor envergadura.

3- Capacitación del personal

Antes de implementar el modelo de IA, es necesario verificar si la organización tiene las habilidades y capacidades necesarias para lidiar con el mismo.

Algunas preguntas que nos podríamos hacer a la hora de evaluar la idoneidad del personal serían:

  • ¿Tenemos conciencia y aceptación de la IA por parte de los líderes y en otros niveles del negocio? ¿Qué podemos hacer para crear conciencia y promover la aceptación?
  • El personal de la organización, ¿tiene las capacidades y la formación para afrontar un proyecto de IA?
  • En caso de no ser así, ¿qué sería más oportuno, contratar nuevos talentos, capacitar al personal existente o trabajar con un proveedor externo de inteligencia artificial?

La IA se está volviendo relativamente sencilla de implementar, con datos, algoritmos y recursos informáticos cada vez más disponibles. Pero, siempre hay que considerar el factor humano: los humanos pueden hacer las preguntas equivocadas, usar datos de entrenamiento defectuosos y aceptar resultados de algoritmos sin investigar su procedencia.

La formación sólida de un equipo de trabajo en IA y aprendizaje automático es fundamental.

4- Crear un plan de implementación

En este punto es cuando la estrategia de IA se convierte en realidad.

Este paso consiste en identificar los problemas, requisitos o desafíos comunes relacionados con la realización de tus proyectos de IA. ¿Qué obstáculos comunes pueden interponerse en tu camino? ¿Qué acciones puedes tomar para asegurarte de cumplir tus objetivos de IA?

En otras palabras, se debe tener claro:

  • Los objetivos a corto y largo plazo
  • Los KPI actuales y si es necesario cambiarlos
  • Quién es el responsable del proyecto
  • Un cronograma aproximado de los hitos de implementación de la IA
  • Obstáculos que pueden surgir y retrasar la implementación de la IA
  • Recursos técnicos/ tecnología necesarios
  • Capacitación para usuarios finales

A la hora de crear el plan de implementación de IA hay que ser realistas y tener en cuenta las limitaciones que presenta la IA.

 

Noticias de programación para programadores ocupados #12: 4ª semana de Marzo de 2021

$
0
0

5 Habilidades necesarias para ser un buen ingeniero DevOps

$
0
0

Foto de You X Ventures en Unsplash

DevOps es una metodología muy publicitada que se centra en la cooperación y la colaboraciónentre los desarrolladores de softwarey otros profesionales de TI más centrados en las operaciones. DevOps como idea es una consecuencia de la infraestructura ágil, extrapolada de manera efectiva a toda la empresa en lugar de solo al departamento de TI. El concepto ganó popularidad tras la primera conferencia de los devopsdays en Bélgica en 2009

En este post descubrirás qué es DevOps, por qué es importante y qué habilidades necesitas para desarrollar una carrera exitosa como ingeniero DevOps.

La cultura DevOps

¿Qué es DevOps?

DevOps (una combinación de "Desarrollo" y "Operaciones") enfatiza la importancia de la comunicación y la colaboración entre los desarrolladores de software y los profesionales de TI de producción al tiempo que automatiza la implementación de cambios de software e infraestructura.

El objetivo de DevOps es crear un entorno de trabajo en el que la compilación, prueba e implementación de software pueda ocurrir de manera rápida, frecuente y confiable. A su vez, esto permite que una organización logre sus objetivos más rápidamente, lo que permite un tiempo de respuesta más rápido en la implementación de nuevas funciones, parches de seguridad y corrección de errores.

No existe un único producto o una fórmula mágica que pueda solucionar los problemas existentes en una organización; el propósito de DevOps es aumentar la colaboración.

¿Por qué es importante DevOps?

En pocas palabras, DevOps es importante porque DevOps acelera todo el ciclo de vida del software, desde la confirmación del código hasta la implementación de producción.

Habilidades necesarias para ser un buen ingeniero DevOps

Ya sea durante una implementación o a la hora de gestionar incidentes, un ingeniero de DevOps se verá constantemente desafiado por nuevas tecnologías y problemas complejos. Es por ello, que además de necesitar una gran cantidad de habilidades técnicas para cualquier entorno dado, debe ser una persona curiosa, motivada e inteligente.

Estas son las habilidades básicas que necesita tener un buen ingeniero DevOps:

1- Conocimiento amplio de herramientas y tecnologías

Si bien las nuevas herramientas y tecnologías surgen continuamente en el mundo TI, es importante que un buen ingeniero de DevOps tenga un amplio conocimiento de las que se encuentran en las siguientes áreas:

  • Control de código fuente (Git, Bitbucket, …)
  • Contenedores (Docker, LXD, …)
  • Orquestación (Kubernetes, Swarm, …)
  • Cloud (Azure, AWS, …)
  • Integración continua (Jenkins, Bamboo, …)
  • Automatización de la infraestructura (Terraform, Puppet, Ansible, …)
  • Automatización y orquestación de la implementación (Jenkins, GitHub Actions, …)

2- Experiencia con herramientas de automatización de infraestructura

Anteriormente, el aprovisionamiento de la infraestructura de TI era un proceso largo, tedioso y manual. Con el nacimiento de la computación en la nube y las tecnologías de contenedores, la infraestructura que necesitan los desarrolladores se puede aprovisionar a través de un script automatizado. El script ejecuta los comandos necesarios y realiza la gestión de la configuración utilizando una herramientas para ello. La plataforma o infraestructura de aplicaciones requerida se entrega en segundos.

Un ingeniero de DevOps debe poder implementar tecnologías y herramientas de automatización en cualquier nivel, desde los requisitos hasta el desarrollo, las pruebas y las operaciones.

3- Testing

La automatización es impulsada por las pruebas, por lo que se necesitan sólidas habilidades en testing para ser un ingeniero de DevOps exitoso.

Es importante hacer test adecuados en todas las etapas, desde el desarrollo hasta la implementación, para asegurar que todo el sistema funciona correctamente.

El testing continuo es el proceso de reducir el tiempo de espera por la retroalimentación tras hacer las pruebas de código. El código se prueba en el propio entorno de desarrollo utilizando herramientas de prueba de automatización. Las herramientas más usadas para las pruebas continuas son: Selenium, TestComplete y TestingWhiz.

4- Conocimientos en seguridad

Si bien combinar el desarrollo y las operaciones es una excelente manera de optimizar el desarrollo y la implementación del código, ciclos más rápidos significa que las vulnerabilidades se pueden introducir en el código mucho más rápido que antes. Por lo tanto, los ingenieros de DevOps deben poder escribir código seguro para proteger las aplicaciones de ataques, así como defenderse de vulnerabilidades comunes de ciberseguridad.

Es clave crear software seguro desde el principio, en lugar de "arreglarlo" más tarde. Cuanto antes se aborde el tema de la seguridad más barato será solucionar los problemas.

Los profesionales de DevOps, aunque no necesitan ser profesionales expertos en seguridad, se beneficiarán enormemente de tener capacitación en seguridad de software.

5- Habilidades blandas (soft skills)

Las habilidades con las personas son clave. Como ingenieros de software, los profesionales de DevOps tienden, erróneamente, a enfocarse en las herramientas en lugar de las personas y los procesos.

Sin embargo, releyendo el apartado donde se definía la cultura DevOps, se deduce que un buen ingeniero DevOps debe poseer sólidas habilidades de comunicación, para que haga de puente entre los departamentos (desarrollo y operaciones) y reúna a los diferentes equipos para trabajar hacia un objetivo común.

Otra de sus principales habilidades es la colaboración y flexibilidad. Deben ser excelentes trabajadores en equipo y ayudar a eliminar los cuellos de botella donde se produzcan, ya sean realizando revisiones de código o escribiendo test de aceptación. La clave es tener empatía hacia los demás para que todo el equipo pueda trabajar más rápidamente.

Conclusión

Si es un novato en el mundo de DevOps, la lista de habilidades de DevOps puede abrumarte. Sin embargo, estas son las principales habilidades de ingeniería de DevOps que las empresas buscan y aprenderlas puede hacer que tu candidatura destaque sobre las demás.

Viewing all 776 articles
Browse latest View live