SG #55 https://sg.com.mx/ en Radar SG55 https://sg.com.mx/revista/55/radar-sg55 <span class="field field--name-title field--type-string field--label-hidden">Radar SG55</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 03/07/2018 - 22:53</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/lo-que-viene" hreflang="und">Lo que viene</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><h3 dir="ltr"><img alt="" data-entity-type="" data-entity-uuid="" height="142" src="https://lh3.googleusercontent.com/5bvRpvCcMQmUfV0wuBtt3GUYEkADLE-I-sh9MKEeTHlIB4RxV1r3EYZbw_-qlcO1wD4Tpnw9BWAHAIrkGV9xe1mG2XDVfih0YMfFqOHJU2BC9XXFPzmHVA3hApEPuCcNrgHM6gtJ" style="border: medium none; transform: rotate(0rad);" width="142" /></h3> <h3 dir="ltr">WebAssembly</h3> <p dir="ltr">Crecientemente, JavaScript ha estado jugando dos roles distintos: uno como lenguaje de programación, y otro como destino de transpilación —es decir, si tienes código en el lenguaje X y quieres ejecutarlo en el navegador, usas un transpilador que “traduce” tu código hacia JavaScript. Como podrás imaginarte, esto no es una solución óptima.</p> <p dir="ltr">Es por ello que se creó WebAssembly, que consiste en un nuevo formato de código binario que funciona como destino de compilación para otros lenguajes y que puede ser ejecutado por el motor de JavaScript del navegador. La ventaja de tener un formato de código expresamente diseñado con este propósito es que permite optimizarlo extensivamente para que su ejecución sea muy rápida. Así que podrás tener código JavaScript que pueda interactuar de forma transparente con componentes programados en otros lenguajes (por ejemplo C++ o Rust) que tengan muy alto desempeño y aprovechen capacidades de hardware a bajo nivel. Actualmente WebAssembly es soportado en Chrome y Firefox, y se espera que sea soportado en Safari y Edge antes de que termine el año.</p> <p dir="ltr"><a href="https://webassembly.org">https://webassembly.org</a></p> <p dir="ltr">&nbsp;</p> <hr /> <p>&nbsp;</p> <h3 dir="ltr"><img alt="" data-entity-type="" data-entity-uuid="" height="101" src="https://lh6.googleusercontent.com/VgsplGxovxbRRy0QGyqjVwzWFeZ6BtzV-2Vy2BwKGSnqFAcdWk5MJxAi2mcDJTbKIGYCMrUBFJAPs3CsC7qpGeQSQYi_PH8W29XCoEo08bn_189bw1-klgttM4Bc30SADVKWIczz" style="border: medium none; transform: rotate(0rad);" width="479" /></h3> <h3 dir="ltr" style="line-height:1.38;margin-top:14pt;margin-bottom:4pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:13.999999999999998pt;font-family:Lato;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.NET Core 2 y .NET Standard 2</span></b></h3> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Microsoft liberó oficialmente la versión 2 del .NET Core SDK, y de manera conjunta publicó la versión 2.0 de .NET Standard. </span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Si no te queda claro qué significa esto, te explicamos: En 2016, con el afán de permitir que los desarrolladores pudieran usar el .NET Framework para construir aplicaciones para distintas plataformas, Microsoft decidió soportar distintas implementaciones de .NET, entre ellas el .NET Framework (Windows), .NET Core (cross-platform y open source), y Xamarin (enfocado a móvil). Para facilitar la portabilidad, se definió una capa abstracta llamada .NET Standard que básicamente especifica las APIs que deben ser soportadas a través de las distintas implementaciones de .NET. En un inicio, .NET Standard definía menos de 10 mil APIs (extraídos del .NET Framework en Windows) que debían ser soportados, y esto ha ido creciendo hasta que la versión 2.0 del .NET Standard especifica alrededor de 32 mil APIs.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Después de ese breve contexto, sigamos con los detalles de .NET Core 2. Esta versión agrega soporte de ejecución en nuevas versiones de sistemas operativos tales como Ubuntu 17.04, macOS High Sierra, Fedora 26 y Linux Mint 18. También agrega Visual Basic como lenguaje fuente (limitado a componentes no visuales). Así que si por alguna extraña razón algunas vez has querido programar una biblioteca en Visual Basic para Linux, ya puedes hacerlo.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><a href="https://www.microsoft.com/net/core" style="text-decoration:none;"><span style="font-size:11pt;font-family:'Open Sans';color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">https://www.microsoft.com/net/core</span></a><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span></b></p> <p dir="ltr" style="line-height:1.7999999999999998;margin-top:0pt;margin-bottom:8pt;background-color:#ffffff;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:10.5pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"></span></b></p> <hr /> <p>&nbsp;</p> <h3 dir="ltr" style="line-height:1.7999999999999998;margin-top:0pt;margin-bottom:8pt;background-color:#ffffff;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:13.999999999999998pt;font-family:Lato;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><img alt="" data-entity-type="" data-entity-uuid="" height="199" src="https://lh3.googleusercontent.com/o5F-R6gCaUL0FqJRAIy2y-Q9x-e1tD__gJBbJLNuBRgvKGqLCVjMWaWrAH7-FFVWXYhmxa9XVNAxs2wLKuvNOACWvJb5pRZlfC_MAb3ykf7widLFQL_TJEHt3RUItyPRcA6VBhgd" style="border: medium none; transform: rotate(0rad);" width="199" /></span></b></h3> <h3 dir="ltr" style="line-height:1.7999999999999998;margin-top:0pt;margin-bottom:8pt;background-color:#ffffff;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:13.999999999999998pt;font-family:Lato;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ARKit</span></b></h3> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">En el WWDC 2017, Apple dio a conocer ARKit, un framework para construir apps de realidad aumentada (AR) para iOS. </span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">La realidad aumentada no es nada nuevo, y es un hecho que Apple viene tarde a la fiesta. Pero en realidad la fiesta todavía no ha comenzado, y todo parece indicar que lo que realmente iniciará la fiesta de AR será ARKit, que es parte de iOS 11 y llegará este otoño.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mientras que empresas como Google y Microsoft siguen tratando de crear visores sofisticados y/o buscando “killer applications” para AR, Apple está tomando un camino distinto: habilitar a su extensa base de desarrolladores con un framework que les permita fácilmente construir aplicaciones de AR para cientos de millones de dispositivos que ya están en el mercado. ARKit brinda soporte para capacidades tales como detección de movimiento, detección de planos horizontales, estimación de luz y tamaño.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><a href="https://developer.apple.com/arkit" style="text-decoration:none;"><span style="font-size:11pt;font-family:'Open Sans';color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">https://developer.apple.com/arkit</span></a><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"></span></b></p> <hr /> <p>&nbsp;</p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><img alt="" data-entity-type="" data-entity-uuid="" height="107" src="https://lh3.googleusercontent.com/K9kcTRxbBCPwL4SQq6J9ZFG7a486_myUKTAheQovi8BVFoxbtU9U5C5Jfv7fnAX-xBY3yc-pY_liRCw2fmdg5bL5dzEVpFHBOeiaDLIcEo00KbvOyIV4FhRMw3nvCIK0ZGoHKQfI" style="border: medium none; transform: rotate(0rad);" width="447" /></span></b></p> <h3 dir="ltr" style="line-height:1.38;margin-top:14pt;margin-bottom:4pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:13.999999999999998pt;font-family:Lato;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">LabView NXG</span></b></h3> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">LabView es un ambiente de programación visual hecha por National Instruments para construir sistemas electrónicos. Tiene cerca de 20 años en el mercado y a lo largo de este tiempo ha sido una herramienta de nicho, utilizada principalmente por ingenieros eléctricos para captar y registrar mediciones de instrumentos con alta precisión.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">La novedad es que National Instruments está lanzando una nueva generación de esta herramienta, llamada LabView NXG. El objetivo es hacerla mucho más amigable de usar, y con ello poder atraer a personas que no tengan una educación formal en diseño de sistemas electrónicos.</span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">La estrategia tiene bastante sentido, considerando que la necesidad por este tipo de herramientas aumentará conforme las empresas se involucren en proyectos de IoT e internet industrial. </span></b></p> <p dir="ltr" style="line-height:1.38;margin-top:10pt;margin-bottom:10pt;"><b id="docs-internal-guid-7d35dec8-03f5-18f7-b104-1c405a4e6eea" style="font-weight:normal;"><a href="https://ni.com/labviewnxg" style="text-decoration:none;"><span style="font-size:11pt;font-family:'Open Sans';color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">https://ni.com/labviewnxg</span></a><span style="font-size:11pt;font-family:'Open Sans';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span></b></p> <p>&nbsp;</p> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Thu, 08 Mar 2018 04:53:45 +0000 sg 8002 at https://sg.com.mx https://sg.com.mx/revista/55/radar-sg55#comments Prueba de Software: Lenguajes de Computación https://sg.com.mx/revista/55/prueba-software-lenguajes-computaci-n <span class="field field--name-title field--type-string field--label-hidden">Prueba de Software: Lenguajes de Computación</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 16:12</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/prueba-software" hreflang="und">Prueba de Software</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/aaron-moreno-monroy" hreflang="und">Aaron Moreno Monroy</a></li> <li><a href="/buzz/autores/luis-vinicio-leon-carrillo" hreflang="und">Luis Vinicio León Carrillo</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">Ahora que ya cubrimos algunos fundamentos teóricos, podemos abordar aspectos más prácticos que nos ayuden en nuestro objetivo original de obtener elementos para desarrollar lenguajes propietarios de propósito particular que nos ayuden a incrementar nuestra productividad en el desarrollo de software. Doy la bienvenida a Aarón Moreno, con quien estaré escribiendo en los siguientes números.</p><p dir="ltr">Todos estamos familiarizados con el concepto de Lenguajes de Programación (LPs) y existe bastate literatura sobre el tema (pueden profundizar en mucho de lo que veremos aquí en cualquier libro sobre “Lenguajes de Programación”). Sin embargo, si buscamos incrementar nuestra productividad deberíamos abrir nuestra panorámica y considerar no solo los LPs, sino lo que llamaremos aquí “Lenguajes de Computación” (LCs), concepto que incluye los LPs, pero también los Lenguajes de Documentación (como LaTeX y HTML), de Arquitectura (como ABACUS y CBabel), &nbsp;de Especificación (v.gr. de sanners/parsers como lex/YACC), de Documentación de Procesos (como XPDL y JPDL), y para la Prueba (como LoadRunner y Selenium), entre otros; desarrollar lenguajes propietarios para estas áreas también puede incrementar nuestra productividad. (El tema de este número es “El auto como plataforma de software”; el pasado marzo estuvimos en el CeBIT –exposición tecnológica en Alemania, tal vez la más grande del mundo–, y en ella se mostraron avances en el sector automotriz que por supuesto implican LCs de propósito particular para ese sector.)</p><p dir="ltr">Los LCs (y los LPs en particular) se desarrollan a lo largo de un proceso de sistematización–formalización–automatización durante el cual se va conociendo mejor el área para la cual se diseña el lenguaje (el “Application Domain”).</p><p dir="ltr">Procedamos a abordar nuestro tema apoyándonos en el desarrollo histórico de los LPs, lenguajes por antonomasia entre los LCs.</p><h3 dir="ltr">Lenguajes de Programación (LPs)&nbsp;</h3><p dir="ltr">Cuando los LPs son de propósito general (general purpose languages) tienen constructos que son comunes a muchos otros LPs, tales como mecanismos de secuenciación, alternación y repetición de instrucciones, definidos en el marco de lo que llamamos un Sistema de Control (Control System); &nbsp;y mecanismos de composición de tipos, definidos en el marco de un Sistema de Tipos (Type System). Cuando los LPs son de propósito particular (special purpose languages) tienen además una parte diseñada especialmente para abordar más efectivamente problemas del Dominio de Aplicación, como tipos de datos y estructuras de control ad hoc (v.gr. si el dominio fuera la Matemática, el LP podría tener construcciones y operaciones sobre matrices, entre otras cosas).</p><p dir="ltr">Hoy tenemos LPs incluso para programar videojuegos. Sin embargo, la inquietud que nos llevó a tener LPs no era generar una industria de entretenimiento, ni siquiera una industria de software. Los trabajos sobre los que finalmente se basa esta tecnología fueron principalmente de lógicos-matemáticos-filósofos que querían construir máquinas que pensaran… o “calcularan” (en el sentido lógico-matemático) como decía Leibniz (que por cierto, es lo que aún se busca, varios siglos después).</p><h3 dir="ltr">El Sistema de Control</h3><p dir="ltr">La estructura del Sistema de Control está fuertemente influenciada por el paradigma con el que fue desarrollado el LP (ver sección “Paradigmas” más adelante), pero podemos hablar en general de constructos (o “abstracciones”) como los descritos en la siguiente tabla.</p><p>&nbsp;</p><div dir="ltr"><table><colgroup><col width="161" /><col width="283" /><col width="213" /></colgroup><tbody><tr><td colspan="3"><p dir="ltr">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abstracciones de Control</p></td></tr><tr><td><p dir="ltr">Primitivas</p></td><td><p dir="ltr">Compuestas</p></td><td><p dir="ltr">De Unidad</p></td></tr><tr><td><p dir="ltr">Instrucciones simples como:</p><ul><li dir="ltr"><p dir="ltr">goto’s,</p></li><li dir="ltr"><p dir="ltr">return’s,</p></li><li dir="ltr"><p dir="ltr">Asignaciones</p></li><li dir="ltr"><p dir="ltr">Llamadas a</p></li></ul><p dir="ltr">subrutinas o macros</p></td><td><p dir="ltr">Instrucciones definidas en términos de otras &nbsp;instrucciones, en particular para construir…</p><ul><li dir="ltr"><p dir="ltr">Altenación: &nbsp;if’s, switch’s</p></li><li dir="ltr"><p dir="ltr">Repetición: while’s, for’s</p></li><li dir="ltr"><p dir="ltr">Secuenciación: bloques begin – end</p></li><li dir="ltr"><p dir="ltr">Bloques de &nbsp;instrucciones en forma de &nbsp;subrutinas (procedimientos, funciones, módulos, etc.) o clases</p></li></ul></td><td><p dir="ltr">Mecanismos para almacenar, en archivos distintos y utilizando mecanismos como include’s, uses’, y sees’, segmentos de código &nbsp;con operaciones relacionadas entre sí bajo algún criterio (“librerías”, clases o Abstract Data Types )</p></td></tr></tbody></table></div><p>&nbsp;</p><h3 dir="ltr">El Sistema de Tipos</h3><p>La estructura del Sistema de Tipos también está influenciada por el paradigma del LP, pero podemos igualmente hablar en general de construcciones (o “abstracciones”) como las descritas en la siguiente tabla.<br /><br /></p><div dir="ltr"><table><colgroup><col width="215" /><col width="265" /><col width="194" /></colgroup><tbody><tr><td colspan="3"><br /><p dir="ltr">Abstracciones de Datos</p></td></tr><tr><td><br /><p dir="ltr">Primitivas</p></td><td><br /><p dir="ltr">Compuestas</p></td><td><br /><p dir="ltr">De Unidad</p></td></tr><tr><td><p dir="ltr">Tipos de datos básicos (y predefinidos) como:</p><ul><li dir="ltr"><p dir="ltr">Ordinales: char, int, boolean, enumerated</p></li><li dir="ltr"><p dir="ltr">Continuos: real (con distintas precisiones)</p></li><li dir="ltr"><p dir="ltr">Apuntadores</p></li><li dir="ltr"><p dir="ltr">“Tipo nulo” o “comodín” (como el void de C)</p></li><li dir="ltr"><p dir="ltr">Rangos</p></li><li dir="ltr"><p dir="ltr">Archivos</p></li></ul></td><td><p dir="ltr">Tipos de datos definidos en términos de otros tipos utilizando Constructores de Tipos como los siguientes:</p><ul><li dir="ltr"><p dir="ltr">Registros (“clásicos” o variables)</p></li><li dir="ltr"><p dir="ltr">Conjuntos</p></li><li dir="ltr"><p dir="ltr">Secuencias (v.gr. arreglos y strings)</p></li><li dir="ltr"><p dir="ltr">Tipos no lineales (v.gr. listas, árboles &nbsp;y grafos)</p></li><li dir="ltr"><p dir="ltr">Clases</p></li></ul></td><td><p dir="ltr">Mecanismos para almacenar, en archivos distintos, segmentos de código &nbsp;con declaraciones/ definiciones de datos y de tipos de dato relacionados entre sí bajo algún criterio (incluyendo clases y Abstract Data Types) utilizando mecanismos como include’s, uses’, y sees’</p></td></tr></tbody></table></div><p>&nbsp;</p><p dir="ltr">El diseño del Sistema de Tipos es una actividad en sí misma por su complejidad y relevancia (define elementos vitales de la semántica del lenguaje).</p><p dir="ltr">La definición del Sistema de Tipos incluye cuestiones muy importantes como las siguientes:</p><ol><li dir="ltr"><p dir="ltr">Chequeo de tipos: Distinguimos entre strongly-typedy weakly-typed languages, dependiendo de la menor o mayor tolerancia a que a las variables de un programa no se les haya asociado explícitamente un tipo de dato. Si el chequeo de esta asociación se realiza en tiempo de compilación hablamos de statically-checked languages; si ocurre en tiempo de ejecución hablamos de dynamically-checked languages.</p></li><li dir="ltr"><p dir="ltr">Equivalencia de tipos: Se definen criterios para determinar cuándo se considera que dos variables tienen el mismo tipo, aunque eventualmente hayan sido declaradas de manera distinta. Algunas alternativas son:</p></li></ol><ul><li dir="ltr"><p dir="ltr">Declaration Equivalence: dos variables tienen tipos equivalentes cuando remiten a la misma declaración de tipo.</p></li><li dir="ltr"><p dir="ltr">Name Equivalence: dos variables tienen tipos equivalentes si fueron declaradas usando el mismo nombre de tipo en el mismo ámbito (scope).</p></li><li dir="ltr"><p dir="ltr">Structural Equivalence: dos variables tienen tipos equivalentes si fueron definidas partiendo de los mismos tipos básicos y utilizando los mismos constructores de tipos.</p></li></ul><ol start="3"><li dir="ltr"><p dir="ltr">Conversión de tipos: Para combinar variables de varios tipos se aplican mecanismos como los siguientes:</p></li></ol><ul><li dir="ltr"><p dir="ltr">Conversión implícita (promotion): como cuando una variable entera es convertida automáticamente a real por aparecer en una expresión real.</p></li><li dir="ltr"><p dir="ltr">Conversión explícita (casting): la que realiza el programador ya sea mediante la utilización de funciones predefinidas, o utilizando facilidades del lenguaje para “asignar tipos”, como el conocido casting.</p></li><li dir="ltr"><p dir="ltr">Generalización de un tipo de una variable a un tipo genérico, como el void del lenguaje C.</p></li></ul><ol start="4"><li dir="ltr"><p dir="ltr">Inferencia de Tipos: Permite deducir el tipo adecuado de v.gr. una subexpresión dentro de una expresión. Es particularmente importante en los weakly-typed languages; el conocido mecanismo de Unificación juega aquí un papel importante.</p></li></ol><h3 dir="ltr">Clasificaciones de Lenguajes de Programación</h3><p>Una manera de ganar perspectiva es mediante una clasificación, pero una taxonomía presupone criterios bajo los cuales clasificar. Para los LP podríamos tomar alguno(s) de los siguientes:</p><ol><li dir="ltr"><p dir="ltr">Su aspecto ante el programador, lo que permite v.gr. distinguir entre lenguajes visuales y textuales.</p></li><li dir="ltr"><p dir="ltr">Su “composición estructural” (y la complejidad de procesar cada lenguaje), lo cual es el origen de jerarquías como la Jerarquía de Lenguajes de Chomsky.</p></li><li dir="ltr"><p dir="ltr">El “marco conceptual” detrás de los programas que se escriben en un lenguaje particular, lo que facilita la clasificación en Paradigmas de LPs.</p></li><li dir="ltr"><p dir="ltr">El “origen cronológico” en el que fueron creados, lo que da pie al concepto de Generaciones de LPs.</p></li></ol><p dir="ltr">Vamos a poner en perspectiva algunos LPs relevantes considerando los 2 últimos criterios (ver figura más adelante).</p><h3 dir="ltr">Paradigmas</h3><p dir="ltr">La primera división usual en términos de paradigmas es la distinción entre lenguajes procedurales y no-procedurales. En los primeros, el programador debe especificar con precisión cómo debe ejecutarse la solución; en los segundos se busca que más bien se especifique qué es lo que debe solucionarse.</p><p dir="ltr">Dentro de los Lenguajes Procedurales tenemos los lenguajes no-estructurados, los estructurados, y losorientados a objetos, que fueron desarrollándose más o menos en ese orden. Podemos observar un incremento en la estructura que se le fue imponiendo al programador para accesar los datos y para escribir (bloques de) instrucciones:</p><ul><li dir="ltr"><p dir="ltr">En los Lenguajes no-Estructurados el programador tenía amplia libertad –aunque no muchas facilidades– para definir datos y manipularlos como y donde le pareciera mejor; tenía también mucha libertad para escribir instrucciones de salto (los famosos goto’s o sus equivalentes), incluso del interior de un bloque de instrucciones al interior de otro.</p></li></ul><p dir="ltr">Esta libertad, o mejor dicho, esta falta de estructura al escribir instrucciones y definiciones de datos (que generaba lo que suele llamarse “código spaghetti”) comenzó a causar grandes problemas en el desarrollo de software. &nbsp;(Ya en 1968, en la First Software Engineering Conference de la OTAN, personalidades de los medios académico e industrial dejaron ver que una “Crisis del Software” era patente. En esa misma reunión se acuñó el término “Software Engineering”.)</p><ul><li dir="ltr"><p dir="ltr">Los Lenguajes Estructurados ofrecen un Sistema de Tipos con tipos básicos y constructores para especificar de manera sistemática tipos compuestos a partir de los básicos. Ofrecen también un conjunto de instrucciones básicas y mecanismos para agruparlas y formar instrucciones (o bloques de instrucciones) compuestas que pueden ejecutarse solo de una manera: comenzando en su único punto de inicio y terminando en su único punto de cierre (Single-Entry, Single-Exit), sin permitir que a través de instrucciones goto (o sus equivalentes) la ejecución del programa salte del interior de una instrucción al interior de otra.</p></li><li dir="ltr"><p dir="ltr">En los Lenguajes Orientados a Objetos ya no se especifica solamente la definición de datos estructurados, sino que se vinculan esos datos con las operaciones (secuencias de instrucciones) válidas aplicables a los mismos. Ya no se puede entonces aplicar una operación cualquiera sobre los datos, sino que debe ser una de las explícitamente vinculadas a éstos.</p></li></ul><p dir="ltr">Los Lenguajes no-Procedurales, por su parte, suelen clasificarse en lenguajes declarativos y lenguajes aplicativos. Suelen ser altamente expresivos (ver sección “Criterios de Diseño” más adelante), weakly-typed y dynamically-checked, y en ellos tanto los datos como los programas suelen tener una representación uniforme común, todo lo cual los hace aptos para el desarrollo de prototipos:</p><ul><li dir="ltr"><p dir="ltr">En los Lenguajes Declarativos (llamados también Lenguajes Lógicos), el qué debe hacer la computadora se suele especificar en términos de conjunciones, disyunciones, negaciones, e implicaciones lógicas. La repetición del equivalente a las “instrucciones” suele realizarse mediante de recursión.</p></li><li dir="ltr"><p dir="ltr">En los Lenguajes Aplicativos (llamados también Lenguajes Funcionales), la especificación de la solución se hace en términos de procesos llamados funciones (asemejando las utilizadas en las matemáticas). Una representación común para datos y programas son las listas (como en LISP, lenguaje prototipotípico de este paradigma), y usualmente tienen la recursión como un mecanismo de repetición.</p></li></ul><h3>Generaciones</h3><p dir="ltr">Utilizando esta clasificación, los LPs se suelen agrupar como sigue:</p><p dir="ltr">La 1ª Generación de LPs la componen los primeros lenguajes de bajo nivel (low-level Languages) como los lenguajes ensambladores y los “lenguajes máquina”.</p><p dir="ltr">Los primeros programas de software fueron escritos en lenguaje máquina. La inserción de una nueva instrucción podía requerir tener que revisar manualmente el programa completo, lo cual motivó el desarrollo de Ensambladores Simbólicos, que hacían actualización automática de referencias y permitían utilizar nemónicos en lugar de códigos de operación de instrucciones. Los posteriores Procesadores de Macros fueron más allá y permitieron que un solo símbolo fuera sustituido por una secuencia de instrucciones.</p><p dir="ltr">La 2ª Generación la conforman los primeros lenguajes de alto nivel (high-level Languages) de propósito general (general purpose Languages) (aunque prácticamente solo se usaban en la ciencia). Para desarrollarlos se habían detectado patrones de construcciones comunes, como la evaluación de expresiones aritmético-algebraicas, el llamado a subrutinas, y las instrucciones de alternación (como el “if”) y de repetición (como el “while”).</p><p dir="ltr">La 3ª Generación incluye lenguajes de propósito general de alto nivel estructurados, en los que solo se permiten instrucciones estructuradas (Single-Entry, Single-Exit) y no instrucciones goto.&nbsp; Para desarrollarlos se habían detectado también patrones en el uso de datos, que condujeron al desarrollo de Sistema de Tipos que incluían tipos básicos y constructores de tipos. Vino la introducción de módulos, que permitió “aislar” subrutinas y tipos de datos para impedir su modificación, y proveer solamente interfaces para el uso de los mismos a (el resto de) los programadores.</p><p dir="ltr">Con la 4ª &nbsp;Generación se asocian lenguajes de propósito particular(special purpose Languages), diseñados para realizar con facilidad tareas en un área de aplicación específica (como lenguajes para Manejadores de Bases de Datos (SQL) y para desarrollar Compiladores (lex/YACC)). Suelen tener constructos no-procedurales.</p><p dir="ltr">Con la 5ª Generación se asocian lenguajes de muy alto nivel (very high-level Languages), que fueron utilizados principalmente en la Inteligencia Artificial “clásica” (no en la “nouvelle AI” actual) para hacer por ejemplo Procesamiento de Lenguaje Natural o Razonamiento Automático, y para desarrollar Sistemas Expertos. Se trata de LPs escencialmente no-procedurales. En esta generación renació un interés por continuar los trabajos procedentes del Paradigma Funcional.</p><p>&nbsp;</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/evUmhz2bR18RMtjcGY8s2eCSzoNJJTdthJE4m7CNL362ZOSoAz2YtM627v6Rm6LcFLfpqHvh841OAXqDdXW_C1IL5xn8FrGUIrX7xsJwPgUt2z5BuM1kxtFE0l-Q493g1yHvr1y4ThvKk1bnNw" width="673" height="485" /></p><p dir="ltr">&nbsp;</p><h3 dir="ltr">Desarrollo histórico</h3><p dir="ltr">Muy probablemente habrán visto en una de las columnas de Hanna Oktaba la ilustración de lo que el autor podría llamar “La Torre de Babel de los LPs”. Y es que a lo largo del tiempo se han desarrollado muchos LPs.</p><p>Aquí listamos descripciones breves sólo de aquellos LPs que han tenido gran relevancia en el desarrollo de la informática (ver figura de arriba), y &nbsp;que sentaron las bases para LPs posteriores hasta llegar a los utilizados en la actualidad (Java, .net, PHP, HTML, Delphi, C y C++, así como scripting languages).<br /><br /></p><ol><li dir="ltr"><p dir="ltr">FORTRAN (FORmula TRANslation) fue desarrollado en la IBM (1957) por un grupo encabezado por John Backus. Uno de los criterios más importantes para su implantación fue la eficiencia del código generado por el compilador. FORTRAN “introdujo”, entre otras cosas, los arreglos, la instrucción de alternación “if”, y los ciclos controlados por una variable indexada. Los programas debían escribirse con un formato léxico fijo (fixed-format), en el cual v.gr. ciertas cosas tenían que escribirse en columnas preestablecidas.</p></li><li dir="ltr"><p dir="ltr">Plankalkül&nbsp;(“Cálculo de Planes”) fue en los hechos el primer LP de alto nivel. Fue desarrollado (1944) por el alemán Konrad Zuse para la Z3, primera computadora programable moderna, desarrollada también por él (1941). Plankalkül incluía, entre otros constructos: instrucciones de asignación, condicionales e iterativas; subrutinas; aritmética de punto flotante; manejo de excepciones; arreglos, registros y grafos. El diseño de Plankalkül estuvo influenciado por los trabajos en lógica matemática de Gottlob Frege (de finales del siglo XIX), y los de éste por los de Leibniz (de finales del siglo XVII).</p></li></ol><ol start="2"><li dir="ltr"><p dir="ltr">LISP (LISt Processor) fue diseñado en el Massachussets Institute of Technology (MIT) por John McCarthy (1958). A LISP se le considera el LP funcional por excelencia. Su diseño se basó en la idea de la aplicación de funciones como noción fundamental de cómputo, y estuvo influenciado por los trabajos en el Cálculo Lambda de Alonzo Church. Introdujo conceptos como árboles (las estructuras de datos), dynamic Typing, Funciones de Orden Superior, Recursión, linked lists, el método “Garbage Collection” para recuperar de manera automática la memoria que los programas ya no utilizaban, así como las S-Expressions (Symbolic-Expressions), que son constructos con los cuales se expresan tanto los datos como los programas, lo cual permite a los programadores agregar nuevos elementos sintácticos al lenguaje y crear ligeras variantes del mismo.</p></li></ol><ol start="3"><li dir="ltr"><p dir="ltr">COBOL (COmmon Business Oriented Language) fue desarrollado en el Department of Defense de los EEUU (1960). Es quizás aún el lenguaje de programación más utilizado. Introdujo la estructura registro, la idea de separar los datos del programa colocándolos en secciones diferentes, y el formateo de la impresión en pantalla usando pictures. Los programas podían escribirse sin un fixed-format. Un criterio para su diseño fue que su sintaxis fuera English-like, lo que lo hace, en no pocos casos, caer en descripciones con exceso de palabras.</p></li></ol><ol start="4"><li dir="ltr"><p dir="ltr">ALGOL-60 (ALGOrithmic Language) fue desarrollado por un comité (1960). Tuvo una enorme influencia en el desarrollo posterior de los lenguajes de programación. Introdujo instrucciones estructuradas(“single-entry, &nbsp;single-exit”), declaraciones de tipos, paso de parámetros por valor, y fue el primer lenguaje en el que se utilizó BNF (Backus-Naur Form) para definir la sintaxis.</p></li><li dir="ltr"><p dir="ltr">BASIC (Beginners All-purpose Symbolic Instruction Code) fue desarrollado por &nbsp;<a href="https://en.wikipedia.org/wiki/John_G._Kemeny">John G. Kemeny</a>&nbsp;and&nbsp;<a href="https://en.wikipedia.org/wiki/Thomas_E._Kurtz">Thomas E. Kurtz</a> en el Dartmouth College, EEUU (1964), para hacer accesible la programación a estudiantes (no solo &nbsp;a científicos). Ha sido el primer lenguaje de muchos programadores.</p></li><li dir="ltr"><p dir="ltr">Simula-I (principios de los 60’s). Introdujo el concepto de clase y se le considera el primer lenguaje de programación orientado a objetos. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p></li></ol><ol start="7"><li dir="ltr"><p dir="ltr">Pascal fue diseñado por el suizo Niklaus Wirth (1969), destilando ideas de ALGOL-60 en un lenguaje pequeño, simple y estructurado. Fue muy utilizado.</p></li></ol><ol start="8"><li dir="ltr"><p dir="ltr">C fue desarrollado por Dennis Ritchie en los Bell Labs (1972), con el objetivo de crear un lenguaje sencillo, reduciendo la complejidad del Sistema de Tipos y el ambiente de tiempo de ejecución (run-time environment). Es muy portable y ofrece grandes facilidades para accesar directamente los dispositivos de la computadora, lo que lo hace apto para el desarrollo de sistemas (que incluyen hardware).</p></li></ol><ol start="9"><li dir="ltr"><p dir="ltr">PROLOG (PROgramming in LOGic) fue desarrollado por un grupo en Marsella dirigido por A. Colmerauer (comenzando en 1972). Se trata fundamentalmente de un demostrador de teoremas. Se ha utilizado para hacer procesamiento de lenguaje natural y razonamiento automático, y fue escogido por los japoneses para su Proyecto de 5ª Generación de Computadoras.</p></li></ol><ol start="10"><li dir="ltr"><p dir="ltr">Scheme es un dialecto de LISP desarrollado en el MIT (1978).</p></li></ol><ol start="11"><li dir="ltr"><p dir="ltr">Smalltalk fue desarrollado en Xerox Corporation’s Palo Alto Research Center (1972-1980) para aplicar el enfoque orientado a objetos en una forma completamente consistente. Se le considera el ejemplo más puro de un lenguaje orientado a objetos.</p></li></ol><h3>Criterios de Diseño</h3><p dir="ltr">Ahora bien, cuando diseñamos un LC, debemos considerar los objetivos que se persiguen con él. Tomando en cuenta eso y que el lenguaje propietario que queremos desarrollar muy probablemente no generará código objeto sino código en el LP de alto nivel que ahora utilizamos para desarrollar software, describimos enseguida varias características que podrían ser deseables en el diseño de nuestro lenguaje propietario.</p><ol><li dir="ltr"><p dir="ltr">Simplicidad</p></li></ol><p dir="ltr">Este criterio está vinculado con la Legibilidad: a mayor simplicidad, mayor legibilidad. La simplicidad facilta el uso del lenguaje; sin embargo, hay que considerar que "Everything should be made as simple as possible, but not simpler", pues la sobresimplificación hace engorroso el uso del lenguaje, le resta Expresividad, y lo deja sujeto a muchas restricciones. Las características de Generalidad, Ortogonalidad y Uniformidad conllevan frecuentemente a una disminución de la Simplicidad.</p><p dir="ltr">Ejemplos:</p><ul><li dir="ltr"><p dir="ltr">BASIC: La falta de constructos fundamentales, como declaraciones y bloques, hace más difícil la programación de aplicaciones grandes.</p></li><li dir="ltr"><p dir="ltr">LISP, PROLOG: pocos constructos básicos facilitan las cosas, pero se depende de un sistema de ejecución complejo.</p></li></ul><ol start="2"><li dir="ltr"><p dir="ltr">Legibilidad</p></li></ol><p dir="ltr">Facilidad con la que alguien no-experto puede leer programas escritos en ese lenguaje y entenderlos. Tiene relación con lo que llamaríamos Mantenibilidad, que es la facilidad con la que puede modificarse un programa (v.gr. detectar y corregir errores, y agregar funcionalidad).</p><ol start="3"><li dir="ltr"><p dir="ltr">Expresividad</p></li></ol><p dir="ltr">Facilidad con la cual, escribiendo poco código, se pueden expresar procesos y estructuras complejos.</p><p dir="ltr">Esto es muy claro cuando comparamos un lenguaje de alto nivel con uno de bajo nivel, pero aquí hay otros Ejemplos:</p><ul><li dir="ltr"><p dir="ltr">La posibilidad de utilizar recursión permite resolver ciertos problemas con pocas instrucciones.</p></li><li dir="ltr"><p dir="ltr">En LISP, durante la ejecución de un programa, se pueden modificar no solo los datos sino también el programa mismo.</p></li></ul><p dir="ltr">La Expresividad puede entrar en conflicto con la Simplicidad, como por Ejemplo: &nbsp;</p><ul><li dir="ltr"><p dir="ltr">PROLOG es muy expresivo, pero no simple.</p></li><li dir="ltr"><p dir="ltr">C es expresivo, pero instrucciones como &nbsp;&nbsp;while ( *s++ &nbsp;= &nbsp;*t++ ) no son tan fáciles de entender para un novato.</p></li></ul><ol start="4"><li dir="ltr"><p dir="ltr">Generalidad</p></li></ol><p dir="ltr">Facilidad para combinar constructos estrechamente relacionados en uno solo más general, sin necesidad de casos especiales.</p><p dir="ltr">Ejemplos:</p><ul><li dir="ltr"><p dir="ltr">Pascal tiene declaración de procedimientos y paso de procedimientos como parámetros, pero no tiene variables que tomen procedimientos como valores.</p></li><li dir="ltr"><p dir="ltr">En Pascal el operador &nbsp;de comparación " = " &nbsp;puede ser aplicado solamente a escalares, apuntadores y conjuntos, pero no a arreglos y registros.</p></li></ul><ol start="5"><li dir="ltr"><p dir="ltr">Ortogonalidad</p></li></ol><p dir="ltr">Permite que los constructos del lenguaje puedan ser combinados de cualquier manera que haga sentido, pero al mismo tiempo impide que la interacción entre diferentes constructos, o el contexto en que se están usando, causen restricciones o comportamientos inesperados o inadecuados.</p><p dir="ltr">Ejemplos:</p><ul><li dir="ltr"><p dir="ltr">En C una función puede retornar valores de cualquier tipo de datos excepto arreglos.</p></li><li dir="ltr"><p dir="ltr">En C se pueden pasar todos los parámetros por valor, excepto los arreglos, que deben pasarse por referencia.</p></li></ul><ol start="6"><li dir="ltr"><p dir="ltr">Uniformidad</p></li></ol><p dir="ltr">Consistencia en la apariencia y comportamiento de los constructos del lenguaje:</p><ul><li dir="ltr"><p dir="ltr">Evitar que cosas no similares se vean o se comporten de manera similar.</p></li><li dir="ltr"><p dir="ltr">Evitar que cosas similares se vean o comporten de manera distinta.</p></li></ul><p dir="ltr">Ejemplos:</p><ul><li dir="ltr"><p dir="ltr">En Pascal el constructo repeat–until abre y cierra un bloque de &nbsp;instrucciones, mientras que las instrucciones 'while' e 'if' requieren de pares 'begin' - 'end’.</p></li><li dir="ltr"><p dir="ltr">En Pascal se utiliza &nbsp;";" para separar instrucciones, pero también para terminar una declaración.</p></li></ul><ol start="7"><li dir="ltr"><p dir="ltr">Extensibilidad</p></li></ol><p dir="ltr">Existencia de un mecanismo general que permita al programador añadir nuevas características al lenguaje. (No se consideran extensiones la definición de nuevos tipos de datos, ni la definición de funciones nuevas en una librería.)</p><p dir="ltr">Ejemplo:</p><ul><li dir="ltr"><p dir="ltr">Añadir nuevas palabras clave y constructos (como matrices, números complejos, etc.). LISP v.gr., permite extender su sintaxis.</p></li></ul><p dir="ltr">Continuamos en la siguiente columna!</p><p>&nbsp;</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">Aarón Moreno Monroy es Director de Operaciones y co-fundador de e-Quallity. Fue profesor de asignatura de la Universidad ITESO. Estudió su maestría en el CINVESTAV; su trabajo de tesis tuvo que ver con verificación formal, la cual aborda la prueba de software utilizando modelos matemáticos.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 21:12:11 +0000 sg 7742 at https://sg.com.mx https://sg.com.mx/revista/55/prueba-software-lenguajes-computaci-n#comments Adquisición y Análisis de Datos en el STC Metro https://sg.com.mx/revista/55/adquisici-n-y-lisis-datos-el-stc-metro <span class="field field--name-title field--type-string field--label-hidden">Adquisición y Análisis de Datos en el STC Metro</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/metro.jpg" width="776" height="350" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 16:04</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/buzz/secci-n-revista/caso-estudio" hreflang="und">Caso de Estudio</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/liliana-toledo" hreflang="und">Liliana Toledo</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La adquisición y análisis de datos cobra especial interés en un mundo que se dirige a la digitalización. Para lograr esto, las señales análogas deben ser capturadas, purificadas de ruido y acondicionadas rápidamente para ser de utilidad. El Sistema de Transporte Colectivo Metro es una de tantas organizaciones que enfrenta este reto de digitalización. En este artículo compartimos el caso de un proyecto realizado recientemente por esta organización.</p> <h3 dir="ltr">Contexto</h3> <p dir="ltr">El STC se construyó hace más de cuarenta años con tecnología de punta de esos momentos. Cuatro décadas después, darle mantenimiento a este sistema para que pueda atender a más de 5 millones de usuarios diarios, tiene diversas complicaciones. Una de ellas surge de que la mayoría de los componentes electrónicos &nbsp;en los vagones utilizan tecnología vieja que ya no es soportada.</p> <p dir="ltr">Tal es el caso de los equipos de tracción que utilizan más de 17 mil tarjetas electrónicas para controlar el movimiento de los más de 150 trenes. Aunque los vagones siguen funcionando bien, los escáneres de lógica de tracción se diseñaron con microcontroladores antiguos que después de tantos años presentan fallas de cableado y dejan de funcionar. Al solicitar nuevos equipos al proveedor comentó que ya no soportaba esa tecnología y la única opción era comprar vagones nuevos.</p> <h3 dir="ltr">Solución</h3> <p dir="ltr">A través de una colaboración con el Centro de Ingeniería y Desarrollo Industrial (CIDESI) con sede en Querétaro, se estableció el Laboratorio de Electrónica Digital Avanzada (LEDA), que homologa las comunicaciones de este medio de transporte en un formato de electrónica digital. CIDESI se encarga principalmente de implementar tecnología para adquisición y análisis de datos, mientras que el personal de STC aporta su profundo conocimiento de los trenes y operación.</p> <p dir="ltr">Uno de los proyectos derivados de esta iniciativa fue la actualización del sistema de diagnóstico de las tarjetas de potencia. Anteriormente, este era un procedimiento lento y complicado en el que las señales analógicas de voltaje y/o corriente eran sometidas a diversos sistemas separados de prueba que incluían osciloscopio, fuente, generador, etcétera. Cada uno entregaba diferentes gráficas y en base a ellas los técnicos diagnosticaban las reparaciones requeridas.</p> <p dir="ltr">El sistema de pruebas ahora se basa en una plataforma de software a la que se conectan tarjetas de adquisición de datos y las tarjetas de tracción. Lo más interesante es que, a través de la plataforma, se pueden simular &nbsp;las condiciones de uso real de los trenes y con ello extraer los datos correctos para hacer el diagnóstico. El sistema de pruebas consta de dos etapas. La primer etapa consiste en obtener una señal analógica, limpiarla y digitalizarla. En la segunda etapa, la plataforma trabaja con esta señal digital para inyectar señales que simulan el comportamiento de un tren en movimiento. Ya con los resultados de la simulación, el técnico determina que área de la tarjeta de tracción es la que presenta problemas.</p> <h3 dir="ltr">Beneficios</h3> <p dir="ltr">Sergio Guevara, laboratorista del STC, nos comenta que el nuevo sistema ha cuadruplicado su capacidad para diagnosticar tarjetas. Adicionalmente, el nuevo sistema disminuye significativamente la curva de aprendizaje de los técnicos y operarios, ya que es mucho más amigable.</p> <p dir="ltr">Otra ventaja consiste en que el conocimiento para diagnosticar las tarjetas ya no solo está en la mente de los técnicos que trabajan en STC por muchos años y que al jubilarse o cambiar de empleo se pierde, sino que ahora también reside en una plataforma que permite tener esa información siempre disponible.</p> <p dir="ltr">Después de este proyecto, se han hecho otras evoluciones tecnológicas dentro de STC, la mayoría basada en software, como por ejemplo, las pruebas de los pilotos automáticos de los trenes.</p> <p dir="ltr">El Sistema de Transporte Colectivo se incorpora de esta forma a la era moderna de la adquisición &nbsp;y análisis de datos, teniendo como misión, dentro de su recién inaugurado Laboratorio de Electrónica Digital Avanzada, seguir evolucionando conforme el metro lo requiera.&nbsp;</p> <p dir="ltr">&nbsp;</p> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Liliana Toledo Rivera (@lilitoledo_), egresada de la Ingeniería de Comunicaciones y Electrónica por la Universidad de Guadalajara; dentro de su multifacética ruta profesional es periodista de ciencia y tecnología en diversos medios.</p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 21:04:17 +0000 sg 7741 at https://sg.com.mx https://sg.com.mx/revista/55/adquisici-n-y-lisis-datos-el-stc-metro#comments Los 6 Niveles de Autonomía https://sg.com.mx/revista/55/los-6-niveles-autonom <span class="field field--name-title field--type-string field--label-hidden">Los 6 Niveles de Autonomía</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/shutterstock_404716201.jpg" width="1033" height="431" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 16:02</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/pedro-galvan" hreflang="und">Pedro Galván</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p style="text-align: center;"><em>“Esta empresa ya tiene vehículos con nivel 3 autonomía, y se espera que antes del año 2020 lance vehículos nivel 4.”</em></p><p>¿Alguna vez has leído o escuchado una frase similar, donde se hable de niveles de autonomía en los vehículos? Si no te ha sucedido, pronto sucederá. Así que es buena idea de una vez entender a qué se refiere eso de los niveles de autonomía.</p><p dir="ltr">A continuación comparto una guía que explica qué significa cada nivel, desde el nivel 0 donde el humano hace todo hasta el nivel 5 que es completamente autónomo.</p><p dir="ltr">La escala de niveles de autonomía fue publicada originalmente por la Society of Automotive Engineers (SAE) en el año 2014 como parte de su reporte “Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated Driving Systems". El reporte describe un mapa de ruta en el que los fabricantes de vehículos se están basando para desarrollar las capacidades de sus vehículos autónomos. En Estados Unidos, la National Highway Traffic Safety Administration (NHTSA) había ya creado su propia escala en 2013 sin embargo en septiembre de 2016 decidió descartarla y adoptar la escala de SAE como estándar.</p><p dir="ltr">A continuación describo los distintos niveles de la escala SAE</p><h3 dir="ltr">Nivel 0: Sin asistencia</h3><p dir="ltr">Este es el nivel inicial, en el que no hay asistencia y por lo tanto el conductor realiza todas las tareas (acelerar, frenar, girar) en todo momento. Es posible que el automóvil tenga sistemas de notificación al detectar eventos u objetos, pero aún así el conductor tiene el control completo. La mayoría de los automóviles en las calles actualmente se encuentran en este nivel.</p><h3 dir="ltr">Nivel 1: Conducción asistida</h3><p dir="ltr">Estos automóviles pueden tener uno o más sistemas que controlen la velocidad o la dirección, pero no ambos al mismo tiempo. Por ejemplo, algunos automóviles modernos cuentan con piloto automático adaptativo (que acelera o frena de forma automática dependiendo del tráfico), que es un ejemplo de una capacidad de nivel 1. Otro ejemplo son los sistemas con control de carril, que automáticamente evita que un automóvil se salga de su carril. En resumen, el conductor sigue controlando el carro y debe mantener las manos en el volante, pero recibe asistencia para escenarios específicos.</p><h3 dir="ltr">Nivel 2: Autonomía parcial</h3><p dir="ltr">Un vehículo nivel 2 tiene capacidad de tomar el control tanto de la dirección como de la aceleración y frenado, pero solo bajo ciertas condiciones y por periodos cortos de tiempo (típicamente menos de un minuto). Aunque el automóvil se está conduciendo solo, el conductor debe estar detrás del volante y atento para tomar el control en cualquier momento. Tesla Autopilot ha estado en este nivel desde hace un par de años, aunque ya otras marcas tienen en el mercado automóviles con capacidades similares.</p><h3 dir="ltr">Nivel 3: Autonomía condicional</h3><p dir="ltr">En el nivel 3 el automóvil ya se puede conducir solo en la mayoría de las situaciones y por periodos extendidos de tiempo, pero al igual que en el nivel 2 se requiere que un conductor humano esté detrás del volante por si el automóvil no sabe qué hacer en alguna situación y necesita ceder control al conductor. El problema con este nivel es desde la perspectiva legal, ya que en caso de algún accidente no está claro qué tanta responsabilidad tendría el conductor; es por ello que algunas empresas planean saltarse este nivel.</p><h3 dir="ltr">Nivel 4: Alta autonomía</h3><p dir="ltr">Un automóvil con autonomía nivel 4 se conduce por sí solo y sin necesidad de que una persona esté al pendiente. En caso de que el automóvil se encuentre ante una situación en la que no pueda conducirse —por ejemplo durante una tormenta donde se reduzca significativamente la visibilidad—, busca un lugar seguro donde detenerse y espera a que se resuelva la situación o el pasajero le provea información adicional. Un automóvil nivel 4 no necesariamente cuenta con controles para conducción manual.</p><p dir="ltr">Algunas empresas ya tienen prototipos con autonomía nivel 4 —tal es el caso de Waymo (Google)—, y en el caso del Modelo S de Tesla ya cuenta con todo el hardware necesario, pero las computadoras a bordo todavía están recopilando horas de manejo para entrenar los algoritmos de conducción autónoma; una vez que se cuente con suficiente entrenamiento se activará en los automóviles este nivel de autonomía. Otras marcas como Ford y Volvo han anunciado que planean tener disponibles autos nivel 4 a más tardar en el año 2021.</p><h3 dir="ltr">Nivel 5: Autonomía completa</h3><p dir="ltr">En este nivel el automóvil se conduce por sí solo en todos los escenarios, incluso los más extremos. Aunque el paso entre nivel 4 y 5 parece pequeño, en realidad involucra superar una gran cantidad de retos técnicos para poder satisfacer todos los escenarios. Es por ello que ninguna empresa ha hecho compromisos para tener automóviles nivel 5 en menos de siete años.</p><p dir="ltr">Referencia</p><ol><li dir="ltr"><p dir="ltr"><a href="https://www.sae.org/misc/pdfs/automated_driving.pdf">https://www.sae.org/misc/pdfs/automated_driving.pdf</a></p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Pedro Galván es cofundador y director editorial de Software Guru.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 21:02:28 +0000 sg 7740 at https://sg.com.mx https://sg.com.mx/revista/55/los-6-niveles-autonom#comments Deep Learning y Vehículos Autónomos https://sg.com.mx/revista/55/deep-learning-y-veh-culos-aut-nomos <span class="field field--name-title field--type-string field--label-hidden">Deep Learning y Vehículos Autónomos</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/isee%20copy.jpg" width="490" height="300" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:49</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/gary-silberg" hreflang="und">Gary Silberg</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Piensa en todas las tareas que tu cerebro ha hecho mientras conduciste tu automóvil al trabajo esta mañana. Viste 235 letreros, 12 bicicletas, 20 peatones y 1,376 automóviles. Aceleraste, frenaste, diste vuelta y cambiaste de carriles.</p><p dir="ltr">Ahora imagina escribir un programa que pudiera conducir a un automóvil en ese mismo viaje que hiciste. Probablemente requeriría miles de millones de líneas de código.</p><p dir="ltr">Parece imposible, pero hacia allá vamos. El aprendizaje profundo (deep learning), una forma de inteligencia artificial, está llegando al punto de poder conducir automóviles de forma autónoma y en cualquier tipo de condición.</p><h3 dir="ltr">¿Qué es el aprendizaje profundo?</h3><p dir="ltr">Aunque no lo sepas, seguramente ya has estado expuesto a aplicaciones de aprendizaje profundo. Es lo que hace que Siri pueda responder a tus preguntas, Google lo usa para encontrar los resultados que buscas, y Amazon para recomendarte un producto. En el ámbito automotriz, el aprendizaje profundo permite que los ingenieros no tengan que programar cada uno de los eventos y acciones posibles que se darían en un trayecto. En lugar de esto, la computadora recopila experiencias y a partir de estos datos genera deducciones para la toma de decisiones.</p><p dir="ltr">El sistema de aprendizaje de un automóvil autónomo trabaja aprendiendo a detectar objetos y patrones de forma automática. Conforme se le alimentan más datos va aumentando su precisión. El sistema es entrenado por medio de repetición, continuamente recibiendo datos de entrada y optimizando su habilidad para realizar predicciones sobre qué significan los datos y qué hacer con ellos. Al desplegar un sistema de este tipo a través de una flotilla de vehículos, la flotilla entera se beneficia del conocimiento colectivo generado por cada uno de los vehículos. Cuando un automóvil encuentra algo nuevo —por ejemplo un camino no mapeado o una acción no contemplada por parte de otro automóvil— envía la experiencia al sistema de aprendizaje, éste la analiza y envía el aprendizaje a toda la flotilla.</p><p dir="ltr">De esta manera, el aprendizaje profundo tiene la capacidad de resolver uno de los principales retos de la conducción autónoma: lidiar con lo impredecible. Sería prácticamente imposible que ingenieros humanos programaran manualmente algoritmos para expresar de forma adecuada todos los escenarios posibles al manejar.</p><p dir="ltr">El aprendizaje profundo ya es utilizado para habilitar capacidades de conducción autónoma en automóviles comerciales. Por ejemplo, el sistema de cámaras del Audi A7 utiliza aprendizaje profundo para reconocer señales de tráfico. El sistema Autopilot de Tesla también lo utiliza, y aunque el Modelo S ya tiene todo el equipo necesario para conducción autónoma, por el momento se encuentra recopilando experiencias de los automóviles en las calles y aprendiendo, para que cuando se determine que ha aprendido lo suficiente se pueda activar la conducción autónoma de niveles superiores.</p><p dir="ltr">Hacia el futuro, la mayoría de las empresas automotrices han anunciado que planear tener vehículos autónomos en el mercado alrededor del año 2020. En un principio estos vehículos estarán restringidos a ambientes sencillos y bien mapeados, pero eventualmente serán capaces de llevarnos a cualquier lugar sin importar las condiciones.</p><h3 dir="ltr">Técnica 1: abstracción semántica</h3><p dir="ltr">Existen dos grandes técnicas para aplicar el aprendizaje profundo a la conducción autónoma: abstracción semántica, y aprendizaje de punta a punta.</p><p dir="ltr">La abstracción semántica se enfoca en dividir el problema en distintos componentes. Por ejemplo, un componente se dedica a detectar vehículos, otro componente detecta carriles, otro más detecta qué hay más allá del carril (otros automóviles, banqueta, barrera). Utilizando conocimiento previo, los ingenieros de software entrenan cada componente individual etiquetando o anotando imágenes para identificar su significado en el mundo real.</p><p dir="ltr">Una vez que cada uno de los componentes ha dominado su tarea, los distintos componentes comparten datos para que puedan colaborar y decidir cómo controlar el vehículo. Es decir, una vez que el componente de detección de vehículos sabe dónde están los vehículos, y el componente de detección de carriles sabe dónde están los carriles, y el componente de detección de fronteras sabe dónde está la banqueta, combinan este conocimiento con muchos otros datos aportados por otros componentes. La computadora maestra entonces decide qué trayectoria tomar y cuál es la velocidad adecuada para realizar la maniobra de manera segura.</p><p dir="ltr">Ventajas:</p><ul><li dir="ltr"><p dir="ltr">Menor tolerancia a fallas. Antes de que la red sea descargada a un vehículo autónomo activo, los algoritmos responsables de cada componente son entrenados de forma independiente hasta que cada uno tenga un alto nivel de precisión en su tarea.</p></li><li dir="ltr"><p dir="ltr">Facilita detectar errores. En caso de que haya una falla —el automóvil toma una decisión incorrecta— los ingenieros pueden detectar qué componente provocó el error y corregirlo.</p></li><li dir="ltr"><p dir="ltr">Mayor capacidad para lidiar con lo impredecible: El sistema ha sido alimentado previamente con datos etiquetados que lo ayudan a adaptarse a situaciones inusuales. Por ejemplo, si de pronto un niño cruza la calle persiguiendo una pelota, el sistema sabe que el niño es una persona, cómo se comportará y cómo evitar golpearlo.</p></li></ul><p dir="ltr">Desventajas:</p><ul><li dir="ltr"><p dir="ltr">Se requiere mucho trabajo previo. Antes de que el sistema esté disponible el equipo de ingenieros debe diseñar una red de conocimiento y codificar algoritmos para cada componente. Posteriormente tiene que entrenar cada componente por medio de etiquetar meticulosamente grandes cantidades de datos, lo cual requiere mucho tiempo y esfuerzo.</p></li><li dir="ltr"><p dir="ltr">Típicamente se etiqueta más información de la necesaria. Dado que se busca cubrir de forma anticipada todos los escenarios posibles es necesario etiquetar una gran cantidad de datos y al final muchos de ellos serán redundantes, por lo que hay un desperdicio en el esfuerzo.</p></li></ul><h3 dir="ltr">Técnica 2: aprendizaje de punta a punta</h3><p dir="ltr">El aprendizaje de punta a punta (end-to-end learning) es una técnica más disruptiva en la que el aprendizaje se realiza de forma automática por medio de captar y analizar experiencias reales de manejo. En vez de dividir la conducción en distintos aspectos y entrenar componentes por separado, el sistema opera de forma holística a través del conjunto de datos completo, sin enfocarse en detectar eventos en componentes individuales.</p><p dir="ltr">Ventajas</p><ul><li dir="ltr"><p dir="ltr">Al ser alimentado con big data, el sistema puede clasificarlos sin necesidad de que los datos estén previamente etiquetados. El sistema no necesita que previamente se le diga qué es un vehículo o cómo se ve un carril, sino que toma las entradas de datos y automáticamente clasifica los objetos y situaciones conforme los va experimentando. Esto significa que los ingenieros no necesitan predefinir o preprogramar todos los componentes que se conjuntan para conducir.</p></li><li dir="ltr"><p dir="ltr">Conforme hay más datos sobre distintas situaciones, el sistema se hace más robusto. Las empresas automotrices pueden aprovechar el poder de su flotilla para rápidamente captar millones de horas de experiencia.</p></li><li dir="ltr"><p dir="ltr">Se optimiza considerando el proceso completo. Los algoritmos internos son optimizados teniendo en consideración el desempeño del sistema completo, no de componentes individuales (como por ejemplo detectar carriles). Esto puede llevar a sistemas con mejor desempeño, que resuelvan las tareas usando el mínimo de pasos necesarios. &nbsp;</p></li></ul><p dir="ltr">Desventajas</p><ul><li dir="ltr"><p dir="ltr">Se requiere capturar cantidades de datos enormes. Como ya comentamos, en el caso de los automóviles esto se puede mitigar acumulando la experiencia de una flotilla grande pero en otros casos de uso esto podría no ser posible.</p></li><li dir="ltr"><p dir="ltr">Es difícil entrenar para escenarios fuera de lo normal. Es posible que aún después de acumular millones de horas no se cuente con experiencia de casos extremos. En estos casos, los sistemas deben ser aumentados con asistencia humana para ayudar al sistema a tomar una decisión acertada.</p></li><li dir="ltr"><p dir="ltr">Técnicamente complicado. El diseño de estas redes de aprendizaje es complicado, requiere conocimientos avanzados y tiempo para optimizar los algoritmos.</p></li></ul><h3 dir="ltr">Ver, pensar, conducir y aprender</h3><p dir="ltr">Para lograr vehículos autónomos necesitamos que dichos vehículos tengan la capacidad de ver, pensar, conducir y aprender para mejorar. A continuación explicamos cómo funciona cada uno de estos pasos.</p><p dir="ltr">La capacidad de “ver” se refiere a cómo es que los vehículos detectan el ambiente a su alrededor. Para poder ver, los vehículos hacen uso de tres grandes fuentes de datos:</p><ul><li dir="ltr"><p dir="ltr">Sensores: Existen distintos tipos de sensores que obtienen datos en tiempo real sobre el entorno del automóvil. Los sensores más usados son: ópticos (cámaras que capturan color y contraste), LIDAR (pulsos de luz), radar (radio ondas), ultrasónico (alta frecuencia). Cada uno tiene un mejor desempeño en distintas condiciones, por lo que típicamente se usa una combinación de varios sensores para asegurar que el automóvil pueda detectar con precisión su entorno en todo tipo de condiciones.</p></li><li dir="ltr"><p dir="ltr">Datos en la nube: Para reconocer su entorno los vehículos también hacen uso de datos en la nube tales como mapas y rutas, señales de tráfico, condiciones del camino.</p></li><li dir="ltr"><p dir="ltr">Datos de otros dispositivos: Al corto plazo, el escenario más común es el de un smartphone que pueda proveer información al vehículo, pero eventualmente los automóviles tendrán comunicación entre sí (vehículo a vehículo), así como la infraestructura en ciertos lugares (ej. un estacionamiento inteligente que informa al automóvil donde hay espacios disponibles).</p></li></ul><p dir="ltr">“Pensar” se refiere a cómo el automóvil integra la información obtenida y determina la acción correspondiente. La figura 1 ilustra este procedimiento a grandes rasgos. La ejecución de este procedimiento (integrar datos, analizarlos y decidir una acción) debe tomar milisegundos a lo mucho. Adicionalmente, a partir de lo que está sucediendo en el momento, el automóvil debe ir extrapolando para intuir lo que sucederá en el futuro inmediato. El aprendizaje profundo ayuda a realizar dicha extrapolación.</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/1cx4jyJNknJOGneUTcepl-KR1vIHVJPk8GbSlR4P5wNMfKABSEpjb6q12XHUiFi6krLAM7wshtGzVyjCjuQa1ZFfqKuAtj4Nqccfp3bbyCyWoiatBsCwjB-8lOoS3i5VezglgWMr" width="624" height="332" /></p><p dir="ltr"><em>Figura 1. El proceso de pensamiento de un vehículo autónomo</em></p><p dir="ltr">Una vez que el sistema toma una decisión, requiere ejecutarla de manera confiable y segura, a esto nos referimos con “conducir”. Por ejemplo, se debe determinar el ángulo adecuado al que debe girar las llantas, así como la intensidad de aceleración o frenado. A su vez, los distintos componentes proveen retroalimentación sobre el resultado de la acción en ejecución (que sí se esté logrando disminuir la velocidad de acuerdo a lo planeado, que se esté manteniendo la tracción necesaria).</p><p dir="ltr">Cada que un automóvil se encuentra con una nueva experiencia o caso extremo, el sistema lo analiza y “aprende” de lo sucedido. El aprendizaje se despliega a toda la flotilla de vehículos para que estén preparados la próxima vez que se encuentren con dicho escenario.</p><h3 dir="ltr">Impacto en la industria</h3><p dir="ltr">Conforme nos dirigimos a la conducción autónoma, las empresas del ecosistema automotriz deben reconocer las implicaciones de este cambio.</p><p dir="ltr">En principio, surgirá un nuevo mercado para servicios de movilidad basados en conducción autónoma y conectividad. Los vehículos podrían estar en uso continuo, por lo que habrá el modelo de propiedad de vehículos cambiará, y la cantidad de kilómetros que acumula cada carro aumentará significativamente. KPMG estima que el mercado de servicios basados en conducción autónoma tendrá un valor anual de más de un millón de millones de dólares para el año 2030.</p><p dir="ltr">La conducción autónoma también traerá una reducción significativa de accidentes viales, ya que se estima que el 94% de los accidentes son provocados por errores humanos. Uno de los sectores que más será afectado por este cambio es el de las aseguradoras. Otro sector que será afectado de forma indirecta es el de las autopartes y talleres de reparación.</p><p dir="ltr">Finalmente, las empresas automotrices están desarrollando nuevas capacidades para los automóviles que aprovechen este contexto. Desde tecnologías para mejorar “el sistema nervioso” del automóvil hasta servicios de entretenimiento y productividad para los pasajeros (“que estarán liberados de tener que conducir el automóvil y ahora podrán hacer otras cosas a bordo”). Empresas de software como Google, Apple y Microsoft ya están buscando penetrar el segmento de software y servicios a bordo para pasajeros, pero las empresas automotrices no cederán fácilmente esta rebanada del pastel y ya están desarrollando tecnología y canales para ofrecer estos servicios bajo sus propios términos.</p><h3 dir="ltr">Consideraciones para el nuevo paradigma</h3><p dir="ltr">Las empresas automotrices que no reaccionen de forma sabia y rápida a los efectos que provocará este nuevo paradigma en su industria, desaparecerán en pocos años. Estas son algunas consideraciones que deben tener en cuenta:</p><p dir="ltr">Las empresas automotrices ya no se dedicarán solamente a hacer automóviles. La mayoría evolucionará a ser proveedores de servicios de movilidad. La estrategia que cada una elija afectará cómo generará ingresos y si logra mantenerse en el mercado.</p><p dir="ltr">Los kilómetros son oro. El aprendizaje profundo detonará una carrera para acumular kilómetros manejados. De especial valor serán las situaciones extraordinarias que extiendan el aprendizaje de los vehículos.</p><p dir="ltr">El talento es clave. Las personas con la capacidad de construir y operar sistemas de aprendizaje profundo serán muy valiosas. Actualmente la mayoría de las personas con esta habilidad trabaja en empresas de software (ver figura 1) pero las empresas automotrices ya se las están peleando.</p><p dir="ltr">El sistema nervioso será el enfoque de diseño del automóvil. Entramos a una nueva era de diseño automotriz centrada en el “sistema nervioso” del automóvil, que incluye el cerebro del automóvil, sensores, controladores y telecomunicación. Este es un cambio radical para los fabricantes de automóviles.</p><p dir="ltr">El poder de la flotilla eclipsará la importancia del automóvil individual. La interacción del automóvil con una flotilla y el ecosistema será esencial. La conectividad asegurará una interacción constante entre los integrantes de la red.</p><p dir="ltr">La forma de innovar cambiará. Conforme la industria automotriz adopta y desarrolla capacidades de aprendizaje profundo, aprenderá a innovar de una forma distinta que afectará a otras industrias.</p><p dir="ltr">Las plataformas de software automotriz serán clave. Las plataformas de software surgirán como un mecanismo para operar y actualizar el automóvil. Contar con una plataforma sofisticada, segura, capaz de desplegarse en distintos modelos de automóvil y que pueda ser actualizada fácilmente, será un elemento crucial de competitividad para las empresas automotrices.</p><p dir="ltr"><img src="https://lh4.googleusercontent.com/YlEY3DsBjYPgH3JmpGUgLNgAGDsVVdEtKxOdjVq56Hb3uVfVgOPSPSKmtyKt4254mbl3m4b-PdqQ8-WBqZ9QczmACBt_QsQJwUgX_M3kecN4r7Q8k1ZUJkfZLqexMaeWQilnYWsC" width="624" height="436" /></p><p dir="ltr"><em>Figura 2. Talento especializado en deep learning</em></p><h3 dir="ltr">Conclusión</h3><p dir="ltr">El aprendizaje profundo está acelerando las capacidades de autonomía y antes de que nos demos cuenta estará en la mayoría de los vehículos. Esto traerá cambios masivos. Aunque nadie sabe con certeza lo que sucederá, es un hecho que se generarán nuevas oportunidades para empresas de distintas industrias: automotriz, software, servicios, entretenimiento. Específicamente, las empresas automotrices deben revisar en qué espacio competirán, con qué producto y servicios, cómo diseñarán los automóviles, cómo gestionarán su flotilla, y cuál es su enfoque hacia la innovación, el talento y la tecnología.</p><div style="background-color: #c0c0c0; margin: 0 20px; padding: 10px;"><p><em>Este artículo es una versión traducida y editada por Software Guru del reporte original “<a href="http://swgu.ru/t4">I see, I think, I drive (I learn)</a>” publicado por KPMG.</em></p></div><p dir="ltr">&nbsp;</p><p dir="ltr">Referencia</p><ol><li dir="ltr"><p dir="ltr">G. Silberg, et al. “I see, I think, I drive (I learn)”. KPMG. <a href="http://swgu.ru/t4">http://swgu.ru/t4</a></p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">Gary Silberg es socio director para sector automotriz en KPMG Estados Unidos.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:49:58 +0000 sg 7739 at https://sg.com.mx https://sg.com.mx/revista/55/deep-learning-y-veh-culos-aut-nomos#comments Tecnologías detrás del Automóvil Conectado https://sg.com.mx/revista/55/tecnologias-detras-del-automovil-conectado <span class="field field--name-title field--type-string field--label-hidden">Tecnologías detrás del Automóvil Conectado</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/connected-w.jpg" width="1169" height="396" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:44</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/pedro-galvan" hreflang="und">Pedro Galván</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Está muy bien que platiquemos sobre las posibilidades del automóvil conectado, los escenarios de uso que abre y el impacto que tendrá en distintas industrias. Pero como desarrolladores de software, una de las preguntas que inevitablemente nos hacemos es: ¿cómo podemos desarrollar aplicaciones para este segmento?, ¿qué tecnologías se utilizan y dónde puedo aprender al respecto?, ¿qué oportunidades están abiertas para desarrolladores externos?</p> <p dir="ltr">Para contestar dichas preguntas, echemos un vistazo a las principales áreas en las que se puede construir soluciones para el automóvil conectado, así como las empresas que están detrás.</p> <h2 dir="ltr">Capas aplicativas</h2> <p dir="ltr">Los automóviles modernos utilizan software para resolver distintos aspectos. Aunque no hay un estándar de los distintos grupos aplicativos, en general podemos reconocer los de telemática, infotainment, instrumentación, ADAS y conducción autónoma. A continuación explico cada uno.</p> <h3 dir="ltr">Infotainment</h3> <p dir="ltr">Como su nombre lo indica, esta capa ofrece servicios de información y entretenimiento, apoyándose en las capacidades de conectividad, audio y despliegue de información en pantallas. Esto se puede utilizar tanto para escenarios de productividad (ej. hacer llamadas telefónicas, escuchar mensajes de correo) como de entretenimiento (servicios de música, juegos o video para pasajeros).</p> <h3 dir="ltr">Telemática</h3> <p dir="ltr">La capa de telemática brinda información sobre la actividad, historial y ubicación de un automóvil. El uso más básico de estos servicios es para construir aplicaciones de navegación por GPS, asistencia en el camino o localización de autos robados. Sin embargo, al contar con la información del estado de un automóvil, tanto histórico como en tiempo real, y combinarlas con servicios de analítica predictiva las posibilidades aplicativas son infinitas. Por ejemplo:</p> <ul> <li dir="ltr"> <p dir="ltr">Ofrecer pólizas de seguro personalizadas a los hábitos de manejo de un conductor.</p> </li> <li dir="ltr"> <p dir="ltr">Alertar al conductor cuando se esté acercando a un cruce donde hay una alta incidencia de accidentes.</p> </li> <li dir="ltr"> <p dir="ltr">Alertar al conductor cuando se esté estacionando en un lugar prohibido, o de alto riesgo.</p> </li> </ul> <p dir="ltr">Si adicionalmente combinamos esta información con la capacidad de identificar al conductor (por medio de biométricos o con mecanismos más rudimentarios como contraseñas), podemos habilitar escenarios tales como restringir a que nuestros hijos solo puedan manejar dentro de cierta área geográfica o llegar a cierto límite de velocidad.</p> <h3 dir="ltr">Cluster de instrumentos</h3> <p dir="ltr">El cluster de instrumentos es el espacio que despliega información crítica para el conductor, tal como velocidad, temperatura y alertas. En los automóviles modernos se está comenzando a utilizar pantallas digitales en lugar de los tradicionales medidores análogos. En principio podríamos pensar que esto se podría delegar al sistema de infotainment, sin embargo acostumbra manejarse como una capa distinta ya que se requiere desempeño en tiempo real con alta confiabilidad. En otras palabras, no hay mucho problema si el sistema de entretenimiento no despliega correctamente los metadatos de una canción, pero sí hay problema si no sabemos que el auto está sobrecalentado. Es por ello que el cluster de instrumentos requiere operar a bajo nivel sobre un OS para tiempo real conectado al bus interno del automóvil, mientras que el sistema de infotainment opera más arriba sobre frameworks orientados a la información y conectividad externa.</p> <h3 dir="ltr">Asistencia de manejo</h3> <p dir="ltr">Esta capa, conocida en inglés como ADAS (advanced driver assistance systems) contiene servicios y aplicaciones para ayudar al conductor a manejar el automóvil, por ejemplo alertar al conductor cuando se detectan objetos cercanos o se está saliendo del carril. Los servicios no solo son de alerta, sino que incluso también pueden controlar cierto aspecto del automóvil, como por ejemplo el frenado de emergencia o el control de velocidad adaptativo (adaptive cruise control). La figura 1 muestra los principales componentes involucrados en estos sistemas y las principales empresas proveedoras para cada uno.</p> <h3 dir="ltr">Conducción autónoma</h3> <p dir="ltr">Se refiere a la plataforma que habilita que un automóvil pueda conducirse de manera autónoma. Involucra la operación de los sensores, motor de analítica/decisión, y control del automóvil.</p> <p dir="ltr">Como es de esperarse, las capas que están más cercanas al control del automóvil (instrumentos, ADAS, conducción autónoma) típicamente son cerradas y como desarrolladores externos no hay mucha posibilidad de interactuar con ellas. En contraste, la capa de infotainment es donde hay mayor apertura y dinamismo. En la siguiente sección revisamos a los principales jugadores y plataformas.</p> <p class="text-align-center" dir="ltr"><img height="397" src="https://lh6.googleusercontent.com/2Ldzgzv3dqDUKujdxZFDQGtCe3MD4NAzNMkczxz5lCZ14dXWt9OdFqLhs-4Ek1ah0hDHIoxbpk6EDuL4y7vO2QZnKu9sGL0ld1me1_Q_AnqtUgLgETek58Ze16P-RbKi4JfGECP7" width="624" /></p> <p class="text-align-center" dir="ltr">Figura 1. Componentes y proveedores ADAS</p> <h2 dir="ltr">Plataformas y proveedores</h2> <p dir="ltr">A continuación describo las que considero las plataformas de software más relevantes para automóvil conectado.</p> <h3 dir="ltr">QNX</h3> <p dir="ltr">QNX Software Systems es parte de BlackBerry (fue comprada en 2010), y es líder de mercado en el segmento automotriz. El corazón de su tecnología es el Neutrino RTOS, un sistema operativo de tiempo real basado en Unix que destaca por su arquitectura de microkernel.</p> <p dir="ltr">QNX tiene una alta penetración en las áreas de telemática e infotainment. Automóviles de marcas como Audi, BMW, Ford, Honda y General Motors, entre otros, utilizan esta plataforma. Típicamente, QNX opera como plataforma de bajo nivel, y las marcas construyen sus propias aplicaciones sobre esta.</p> <p dir="ltr">El desarrollo de aplicaciones para QNX se hace en C++ utilizando el framework Qt. Específicamente en la capa de infotainment (QNX Car Platform for Infotainment) también se puede utilizar tecnologías web como HTML5 y Javascript. [1]</p> <h3 dir="ltr">Linux</h3> <p dir="ltr">Linux ha sido una opción común para las marcas que construyen su propio OS para automóviles. De hecho, el software que opera los automóviles Tesla está basado en Linux, sin embargo es cerrado.</p> <p dir="ltr">En 2009 se creó la GENIVI Alliance con el objetivo de impulsar la adopción de software open source en sistemas de infotainment. Entre los miembros de alto nivel están empresas como BMW, Honda, Nissan, Daimler y Volvo. El principal resultado de esta alianza es la Genivi Development Platform (GDP), una plataforma abierta basada en Linux para construir aplicaciones de infotainment. GDP puede funcionar sobre distintas arquitecturas de hardware tales como Intel, NVidia, Qualcomm e incluso tabletas de bajo costo como Raspberry Pi. [2]</p> <p dir="ltr">Otra iniciativa que vale la pena notar es Automotive Grade Linux (AGL), que es operada por la Linux Foundation. Actualmente, la plataforma de AGL solo cubre infotainment, lo cual la hace parecer redundante con GENIVI, pero a diferencia de esta última AGL busca cubrir todo el espectro de software para un automóvil incluyendo telemática, clúster de instrumentos, ADAS y conducción autónoma. Aunque ambas organizaciones son abiertas, y hay muchas empresas que forman parte de ambas, hay empresas con mayor peso detrás de cada una. Por ejemplo, en el caso de GENIVI BMW es uno de los miembros con mayor protagonismo mientras que en el caso de AGL es Toyota. De hecho, el primer despliegue de AGL en un automóvil comercial será el sistema de infotainment del Camry 2018. [3]</p> <h3 dir="ltr">Apple CarPlay</h3> <p dir="ltr">CarPlay es básicamente un mecanismo que permite ver y controlar las apps de un iPhone desde la consola de infotainment de un automóvil. Varios automóviles ya lo soportan y funciona con dispositivos iPhone 5 o superior.</p> <h3 dir="ltr">Android Automotive</h3> <p dir="ltr">A lo largo de los años Android ha tenido distintos acercamientos en el área de infotainment en automóviles. Posiblemente lo más conocido es Android Auto, que es prácticamente lo mismo que CarPlay (mostrar y controlar las apps de tu smartphone desde el sistema de infotainment), pero para Android.</p> <p dir="ltr">Otra posibilidad es instalar una capa de Android directamente como sistema de infotainment (sin necesidad de un smartphone). Algunas marcas ya han intentado esto, tomando el código fuente de Android y modificándolo ellos mismos. Al no ser un esfuerzo oficialmente soportado por Google, los resultados no han sido óptimos ya que modificar el sistema operativo no es trivial y requiere bastante esfuerzo por lo que los automóviles terminan usando versiones de Android anticuadas; por ejemplo, el Honda Accord 2017 usa Android 4.2, un sistema operativo del 2012. La buena noticia en este sentido es que Google anunció en mayo del 2017 la iniciativa Android Automotive, que básicamente será una versión de Android optimizada para el automóvil y oficialmente soportada por Google. Volvo y Audi están contemplando incluirlo en algunos modelos de 2019. [4]</p> <h3 dir="ltr">SmartDeviceLink</h3> <p dir="ltr">SmartDeviceLink (SDL) es, al igual que CarPlay y Android Auto, un framework para que los smartphones puedan interactuar con los sistemas de infotainment de los automóviles. La diferencia es que SDL es abierto e independiente de Apple y Google. SDL fue originalmente creado por Ford, pero fue donado como open source y actualmente está siendo adoptado por varias automotoras, entre ellas Toyota (parece ser que el Camry 2018 que usará Automotive Grade Linux también soportará SDL para interactuar con smartphones).</p> <p dir="ltr">De las distintas tecnologías para interactuar desde el smartphone con el automóvil, SDL es la que me parece más amigable para desarrolladores terceros. En su sitio web [5] puedes encontrar guías de arranque, y los SDK están disponibles en GitHub.</p> <p dir="ltr">Otra capacidad atractiva para desarrolladores de SDL es Manticore. Esta es una instancia del core de SDL disponible en línea para que puedas probar cómo se comporta tu app en un automóvil con SDL. Lo único que haces es entrar desde un navegador web a Manticore [6], apuntar tu aplicación hacia el URL y puerto que te indique, y se cargará en el navegador tu app corriendo para que puedas probar las interacciones y depurarla (ver figura 2). Su uso es gratuito, simplemente regístrate como desarrollador SDL.</p> <p class="text-align-center" dir="ltr"><img height="388" src="https://lh4.googleusercontent.com/c21ibOWlchELr83z6YHArkBKkQTtNpbWHojHToHOQcQ_Nw2oC9V7WwnOBJAI8qbp3pYcScxZTwG3Zncz0dPQOqPOhczcUeAHTN577Uzq39UsBkmXj53KZt0tCPbyTX3DQTD0qtD8" width="624" /></p> <p class="text-align-center" dir="ltr">Figura 2. Manticore permite probar apps en SDL desde tu navegador</p> <h3 dir="ltr">Microsoft Connected Vehicle</h3> <p dir="ltr">Microsoft fue uno de los pioneros en el área de sistemas operativos para infotainment, lanzando Microsoft Auto en 1998 que después de varios cambios de nombre terminó como Windows Embedded Automotive. Las primeras dos generaciones del sistema Sync de Ford estaban basadas en este sistema operativo, sin embargo en 2014 Ford movió Sync hacia QNX. En 2016 Microsoft hizo un cambio drástico de estrategia, abandonando la intención de ser el sistema operativo del automóvil y enfocándose en ofrecer servicios basados en la nube que habiliten aplicaciones en el automóvil. Esta iniciativa actualmente lleva el nombre de Microsoft Connected Vehicle y entre otras cosas abarca servicios de infotainment (llamadas por Skype, servicios de Cortana), analítica predictiva basada en telemática, e información en tiempo real sobre las condiciones del camino. [7]</p> <h2 dir="ltr">Sistemas de cómputo</h2> <p dir="ltr">Una batalla no menos interesante es la que se está dando en el lado del hardware sobre el que se ejecuta el sistema operativo del automóvil. Hasta hace poco, los automóviles usaban sistemas en chip (SoC) de gama relativamente baja. Sin embargo, conforme los automóviles se hacen más inteligentes demandan soluciones expresamente diseñadas para este segmento y con mayor poder. Estos son los jugadores y lo que están haciendo …</p> <p dir="ltr">Renesas Electronics, una empresa de origen japonés especializada en semiconductores y microcontroladores para el sector automotriz es uno de los jugadores originales de este segmento. Aunque tradicionalmente ha estado enfocada en el área de instrumentación &nbsp;y ADAS, recientemente mostró un prototipo de vehículo autónomo.</p> <p dir="ltr">NVIDIA se ha posicionado rápidamente como líder en cómputo para inteligencia artificial para conducción autónoma, siendo la elección de marcas como Tesla y Toyota. Su oferta para automóviles considera: Drive PX, una tarjeta de cómputo basada en GPUs optimizada para procesar la información captada por las cámaras y sensores del automóvil; Driveworks, un SDK con herramientas y bibliotecas para construir capacidades de conducción autónoma y NVIDIA DGX que son sistemas para el centro de datos optimizados para aprendizaje profundo (deep learning), estos sistemas analizan los datos obtenidos por los automóviles, los analizan y en base a ello entrenan a la computadora del automóvil. Es por ello que Tesla indicó que el Modelo S ya incluye todo el hardware necesario para conducción autónoma pero esta capacidad será activada hasta que se hayan analizado suficientes horas de conducción, lo que está sucediendo es que estos automóviles vienen equipados con una computadora Drive PX que estará enviando información al centro de datos para ser analizada y en base a ello entrenar a la computadora a bordo para tomar decisiones instantáneas. [8]</p> <p dir="ltr">Intel recientemente lanzó la línea de SoC Atom A3900 orientada específicamente al sector automotriz. Este sistema está diseñado para habilitar clusters de instrumentos y sistemas de infotainment. Sin embargo, la meta importante para Intel está en alcanzar a NVIDIA en el ámbito de cómputo para conducción autónoma. Su estrategia es similar, contemplando una computadora SoC a bordo del automóvil que se comunique con sistemas en un centro de datos donde se haga el aprendizaje profundo; sin embargo, la oferta de Intel también considera la plataforma para comunicación inalámbrica utilizando tecnología 5G. [9]</p> <p dir="ltr">Qualcomm ha sido un poco lento en entrar al espacio automotriz, pero ya está corrigiendo el rumbo. Por el momento está empujando el Snapdragon 820a como SoC para habilitar capacidades de infotainment y telemática. Su propuesta hace fuerte énfasis en la conectividad, de hecho uno de los puntos a destacar del Qualcomm Connected Car Reference Platform que estará disponible en la segunda mitad del 2017 es que se basa en el modem X16 LTE que puede alcanzar velocidades de Gigabit. Más allá de esto, la reciente compra de NXP Semiconductors habilitará a Qualcomm para ofrecer sistemas automotrices más avanzados y de conducción autónoma. [10]</p> <h3 dir="ltr">Bosch y su omnipresencia</h3> <p dir="ltr">Conforme me acerco al final de este artículo considero que me hace falta mencionar a Bosch, pero confieso que no encuentro donde acomodarlos, ya que están involucrados en distintos niveles. Bosch tiene una amplia tradición como proveedor de partes para el automóvil tradicional, pero se ha modernizado junto con el automóvil. Bosch también provee sensores y componentes para manejo asistido (ADAS), así como componentes clave para vehículos eléctricos.</p> <p dir="ltr">Entre las tecnologías que ha creado Bosch para el automóvil moderno está CAN (Controller Area Network) [11] que es el bus de comunicación que conecta todos los sensores y componentes electrónicos. Es un protocolo de comunicación serial que soporta control en tiempo real con alta seguridad, y que prácticamente todos los automóviles modernos utilizan.</p> <p dir="ltr">Pero más allá de los componentes individuales para automóviles, lo que destaca a Bosch es su visión y capacidad para soluciones integrales en el contexto de ciudades inteligentes. Un ejemplo de esto sería un sistema de estacionamiento inteligente donde un automóvil que está buscando lugar de estacionamiento pueda ser informado por la red de automóviles en la cercanía sobre dónde hay lugar disponible. Este tipo de soluciones involucra una gran cantidad de subsistemas tales como la inteligencia artificial para detectar lugares, comunicación entre vehículos y coordinación con infraestructura de la ciudad. Bosch es una de las pocas empresas que está pensando a ese nivel, y que tiene amplias capacidades tanto a nivel de ingeniería de bajo nivel como de integrar “sistemas de sistemas”. Por cierto, vale la pena mencionar que Bosch recientemente abrió un centro de desarrollo de software y servicios de ingeniería en Guadalajara, así que seremos testigos de cerca de lo que hagan en este espacio. [12]</p> <h3 dir="ltr">Conclusión</h3> <p dir="ltr">El automóvil conectado involucra una gran variedad de tecnologías y empresas que lo habilitan. En este artículo echamos un vistazo a algunos de los jugadores clave y sus estrategias. Algunas de estas tecnologías son cerradas o fuera del alcance de los desarrolladores independientes, pero hay otras que son abiertas y con las que cualquiera puede comenzar a experimentar. Así que si te interesa, te invito que consultes los enlaces que comparto en la sección de referencias para conocer más.</p> <p dir="ltr"><strong>Referencias</strong></p> <ol> <li><a href="http://www.qnx.com/content/qnx/en/products/qnxcar/index.html">http://www.qnx.com/content/qnx/en/products/qnxcar</a></li> <li><a href="https://www.genivi.org">https://www.genivi.org</a></li> <li><a href="https://www.automotivelinux.org">https://www.automotivelinux.org</a></li> <li><a href="https://source.android.com/devices/automotive">https://source.android.com/devices/automotive</a></li> <li><a href="https://www.smartdevicelink.com">https://www.smartdevicelink.com</a></li> <li><a href="https://smartdevicelink.com/resources/manticore/">https://smartdevicelink.com/resources/manticore/</a></li> <li><a href="https://www.microsoft.com/en-us/internet-of-things/connected-vehicles">https://www.microsoft.com/en-us/internet-of-things/connected-vehicles</a></li> <li><a href="http://www.nvidia.com/object/drive-px.html">http://www.nvidia.com/object/drive-px.html</a></li> <li><a href="https://www.intel.com/content/www/us/en/automotive/automotive-overview.html">https://www.intel.com/content/www/us/en/automotive/automotive-overview.html</a></li> <li><a href="https://www.qualcomm.com/solutions/automotive">https://www.qualcomm.com/solutions/automotive</a></li> <li><a href="https://www.canbus.us">https://www.canbus.us</a></li> <li><a href="http://www.bosch-mobility-solutions.com">http://www.bosch-mobility-solutions.com</a></li> </ol> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Pedro Galván es director editorial de Software Guru.</p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:44:10 +0000 sg 7738 at https://sg.com.mx https://sg.com.mx/revista/55/tecnologias-detras-del-automovil-conectado#comments El Camino de la Experiencia hacia la Innovación Automotriz https://sg.com.mx/revista/55/el-camino-la-experiencia-hacia-la-innovaci-n-automotriz <span class="field field--name-title field--type-string field--label-hidden">El Camino de la Experiencia hacia la Innovación Automotriz</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/shutterstock_589267616.jpg" width="2598" height="1713" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:39</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/gunther-barajas" hreflang="und">Gunther Barajas</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">A medida que entramos en la industria 4.0, una nueva era de sistemas ciber-físicos, Internet de las cosas y procesos conectados ¿cuál es el futuro que vamos a crear para la industria automovilística durante los próximos 10 o 15 años?</p><p dir="ltr">Conforme visualizamos la movilidad del futuro ¿Podremos crear y producir nuestro propio coche personalizado? ¿Podemos ir más allá de un vehículo de cero emisiones a un modo de transporte que apoye activamente la salud y el equilibrio medioambientales? ¿Qué pasa con los vehículos que son tan inteligentes que literalmente no pueden chocar e incluso pueden contribuir a la seguridad personal y urbana?</p><p dir="ltr">Una cosa es cierta, con el inmenso impacto social y emocional de la movilidad y con la creciente tasa de cambio tecnológico, la industria automotriz evoluciona a un ritmo nunca antes visto.</p><h3 dir="ltr">Uso de aplicaciones de datos en el vehículo para centrarse en la experiencia del cliente</h3><p dir="ltr">Con los vehículos autónomos previstos para estar disponibles al público antes del año 2020, el foco de los fabricantes de autos se centrará en la creación de experiencias de movilidad en torno a cómo los consumidores utilizan e interactúan con sus automóviles. Los pasajeros pueden ahora mirar una película, cenar o trabajar con otras personas, entre otras muchas opciones, &nbsp;esto requiere un entendimiento integral de las capacidades y necesidades de los consumidores más allá de la conducción, inspirando a los proveedores &nbsp;a forjar nuevas alianzas tecnológicas y de negocios mientras desarrollan nuevos estándares de industria y tecnología.</p><p dir="ltr">Un típico “nuevo modelo” de auto viene con 100 millones de líneas de código y de 50 a 80 unidades de control electrónico que responden a más de 30 mil requerimientos funcionales. La electrónica comprende entre el 20 y el 40 por ciento del costo actual del desarrollo de vehículos, con un número que se prevé que crezca hasta el 50% para 2030, modificando rápidamente la complejidad del vehículo e influyendo en el proceso de desarrollo. Se espera que el 80% de las innovaciones de vehículos en el futuro sean en sistemas integrados, gran parte de ellos enfocados en seguridad activa o pasiva, entretenimiento y rendimiento.</p><p dir="ltr">Será cada vez más crucial validar los &nbsp;subsistemas y &nbsp;el desempeño de un vehículo en una etapa temprana del ciclo de desarrollo del producto. Las nuevas metodologías de la ingeniería de sistemas, que enlazan dominios de procesos dispares , serán necesarias para hacer pruebas dinámicas &nbsp;del vehículo previo a su producción, para garantizar que se cumplan estándares de desempeño y seguridad.</p><p dir="ltr">Para reducir el riesgo de innovación en este nuevo mundo de la experiencia de movilidad, los clientes estarán fuertemente involucrados en el proceso de creación a través de experiencias virtuales realistas en 3D. La capacidad de ejecutar pruebas dinámicas e inmersivas en un entorno virtual durante la etapa de diseño, ofrecerá nuevas formas de entender y validar los deseos del consumidor en torno a la movilidad. Además, el aprovechamiento de cantidades masivas de información no estructurada (big data) catalizará la creación de experiencias personalizadas de movilidad. Los sensores dentro de los vehículos proporcionarán nuevos niveles de retroalimentación en tiempo real para que técnicos y empresarios puedan interpretar el comportamiento del cliente. Los subsistemas de los automóviles son cada vez más inteligentes y cada vez más dependientes de la conexión con los datos de otros sistemas. De los faros a &nbsp;los sistemas de escape, cuando antes un “ajuste y acabado” eran la única integración necesaria, entender ahora cómo el software, hardware y la electrónica trabajan juntos es crucial. Toda esta información, mezclada con datos externos de las redes sociales en línea, se utilizará para mejorar continuamente el rendimiento de la conducción y proporcionar así la experiencia deseada.</p><p dir="ltr">Para comprender el impacto completo de la innovación, los fabricantes irán más allá de las características físicas y tecnológicas del vehículo hasta simular aspectos funcionales y de comportamiento. Por si fuera poco, el automóvil, el cual es ahora visto como un sistema inteligente, será simulado dentro de sistemas tan amplios como el tráfico, la energía o incluso las redes comunitarias y domésticas.</p><p dir="ltr">El concepto del auto Link &amp; Go de AKKA Technologies es un ejemplo de cómo los innovadores en la cadena de suministro automotriz pueden combinar conocimientos avanzados de sistemas de ingeniería con la innovación social para ofrecer nuevas e impresionantes perspectivas para la movilidad auto-dirigida en las carreteras urbanas [1].</p><h3 dir="ltr">Ser ágil administrando la creciente complejidad</h3><p dir="ltr">Esto puede sonar contradictorio, pero en la era de Automotive 4.0 los fabricantes de automóviles serán capaces de dominar la inmensa complejidad de los sistemas detrás de los procesos de desarrollo y fabricación, simplificando al mismo tiempo la experiencia del usuario en toda la empresa. El primer método para lograr esto es la integración dentro de los actuales entornos de las tecnologías de la información, en los que muchas aplicaciones aisladas han crecido a lo largo de décadas, y donde las oportunidades son numerosas, entre ellas:</p><ul><li dir="ltr"><p dir="ltr">integración de diseño e ingeniería para preservar la idea original de una creación,</p></li><li dir="ltr"><p dir="ltr">integración de ingeniería y simulación para compensaciones costo-rendimiento y cumplimiento de productos,</p></li><li dir="ltr"><p dir="ltr">integración mecánica, de software y desarrollo punto a punto para obtener una arquitectura de desarrollo optimizada,</p></li><li dir="ltr"><p dir="ltr">integración de pruebas y validación con mercadotecnia y ventas para conocer los requerimientos.</p></li></ul><p dir="ltr">Cada parte de la organización se beneficiará de una intensa integración, conectando personas, información y procesos a través de un entorno único, intuitivo y colaborativo.</p><p dir="ltr">La siguiente clave para la gestión de la complejidad es la modularización -idealmente a través de la aplicación de una estrategia, otra vez, que requiera la integración de diversas disciplinas- desde los requerimientos sobre el diseño de sistemas, la ingeniería detallada y las pruebas hasta la fabricación. La integración comprenderá el mundo virtual y físico: pruebas integradas de hardware y software, planificación y operación integrada en la fabricación, etcétera, mediante la cual objetos inteligentes y modulares establecerán el comportamiento de sistemas complejos.</p><p dir="ltr">La tecnología base y los conceptos están disponibles hoy en día. El siguiente paso -la implementación de sistemas inteligentes y &nbsp;auto-adaptables en la fabricación y la logística - sólo estará limitado por el alcance de las estrategias de integración y modularización. &nbsp;Si las impresoras 3D son capaces de manejar una parte de la producción de piezas de repuesto ¿cuál será el impacto en el diseño del producto, su empaquetado y los aspectos comerciales?</p><p dir="ltr">Últimamente, la gestión de la complejidad tiene otra dimensión. Al igual que los usuarios de transporte tendrán la posibilidad de personalizar su experiencia, los creadores de soluciones de movilidad también tendrán que beneficiarse de un banco de trabajo más flexible, atractivo, intuitivo y personalizable para las necesidades individuales. Fiat Chrysler Automobile, el séptimo mayor fabricante de automóviles del mundo, ha comenzado a implementar la solución de experiencia por industria "Drive Emotion" en sus estudios de diseño global. Esto permite a sus expertos colaborar en tiempo real en las experiencias y elementos holísticos del usuario como el estilo artístico o calidad de la superficie del vehículo.</p><h3 dir="ltr">Asumir una mayor responsabilidad</h3><p dir="ltr">Las empresas están acostumbradas a actuar como ciudadanos corporativos responsables, pero estas obligaciones crecerán con la capacidad de las tecnologías del mañana. Los aspectos ambientales han sido durante mucho tiempo parte de las preocupaciones de la industria automotriz, los conductores de hoy en día esperan la entrega de vehículos eco-amigables y eficientes en cuanto al combustible sin sacrificar el rendimiento. Con tanto software en los vehículos, los principales competidores de la industria del automóvil han trabajado juntos para desarrollar el estándar Automotive Open System Architecture (AUTOSAR). Estos fabricantes tienen ahora la tarea de cumplir con el nuevo estándar de seguridad funcional eléctrica/electrónica ISO26262, que requiere la documentación del proceso completo, análisis y verificación de todos los sistemas integrados de los productos que fabrican.</p><p dir="ltr">Con diferentes lineamientos que cumplir en todo el mundo, los proveedores de esta industria utilizarán una plataforma que gestione la complejidad de las normas y permita la simulación de modelos y comportamientos, que muestren el balance energético y el potencial impacto del diseño de sus vehículos en el medio ambiente.</p><p dir="ltr">El aumento de la seguridad de los pasajeros y los peatones seguirá siendo un elemento que empuje la innovación futura y pronto veremos como este enfoque crece rápidamente. Esta es la razón por la cual los enfoques Target-Zero-Defect son (y seguirán siendo) tan importantes en la agenda de esta industria. &nbsp;Estos dirigen la operación sin fallos y sin incidentes alrededor de los diversos procesos y datos corporativos.</p><p dir="ltr">Y ¿qué pasa con la retención de clientes y el uso de sus datos? Con la gama de sensores en el vehículo e información externa disponible, se puede esperar que la industria contribuya realmente al bienestar social y la salud personal. Estos aspectos podrían comenzar por el registro del estado de un pasajero y - según la situación – proveer una sensación calmante dentro del vehículo, iniciar un masaje que evite el dolor de espalda o coágulos de sangre, o conectarse inmediatamente a un médico especialista en caso de emergencia.</p><p dir="ltr">Generar y procesar este tipo de datos personales, al menos en los países donde la información es sensible, requerirá que los pasajeros sientan una gran familiaridad con las compañías. Las promesas de las marcas y de los fabricantes, así como la dimensión de confianza, tendrán que reflejarse en modelos de negocios que llevarán a variables como "el placer de conducir" o "ventaja tecnológica" a un nuevo nivel.</p><h3 dir="ltr">Viendo hacia adelante</h3><p dir="ltr">No somos clarividentes para predecir el futuro de la industria automotriz, sin embargo, estamos seguros de que la integración y el impacto de la innovación social serán elementos fundamentales para controlar la creciente complejidad de la innovación en la industria de la movilidad, lo que contribuirá a aumentar el tiempo de comercialización y su productividad.</p><p dir="ltr">Una mayor conectividad dentro de los vehículos con sus entornos, así como la demanda continua de movilidad individualizada, abrirán nuevas oportunidades para que los innovadores automovilísticos creen experiencias diferenciadas para sus clientes. Los ambientes virtuales de trabajo que son realistas, colaborativos, "inteligentes" e intuitivos serán los laboratorios de innovación para crear estas experiencias. Las tecnologías de hoy &nbsp;día, aunque en constante evolución, ya construyen un puente para proporcionar el nivel de colaboración necesario para operar mañana el Automotive 4.0.&nbsp; </p><p><strong>Referencias</strong></p><ol><li dir="ltr"><p dir="ltr"><a href="http://blogs.3ds.com/perspectives/autonomous-cars-in-the-age-of-experience/">http://blogs.3ds.com/perspectives/autonomous-cars-in-the-age-of-experience/</a></p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Gunther Barajas (@GBV_001) es Vice Presidente de Dassault Systèmes para México. <a href="https://www.3ds.com/es">https://www.3ds.com/es</a>&nbsp;</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:39:45 +0000 sg 7737 at https://sg.com.mx https://sg.com.mx/revista/55/el-camino-la-experiencia-hacia-la-innovaci-n-automotriz#comments Exportando Sistemas Relacionales a Sistemas Columnares Distribuidos https://sg.com.mx/revista/55/exportando-sistemas-relacionales-sistemas-columnares-distribuidos <span class="field field--name-title field--type-string field--label-hidden">Exportando Sistemas Relacionales a Sistemas Columnares Distribuidos</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/datos-fig1.png" width="502" height="236" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:31</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/seccion-revista/gestion-datos" hreflang="und">Gestión de datos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/hugo-la-mora" hreflang="und">Hugo de la Mora</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>El manejo de información masiva se ha hecho cotidiano, y una estrategia común para analizar grandes cantidades de datos es moverla de las bases de datos relacionales tradicionales (RDBMS) hacia bases de datos columnares distribuidas.</p><p dir="ltr">En el presente artículo muestro los pasos necesarios para migrar información relacional a una infraestructura de Hive en Hadoop. La idea básica es importar grandes datos de un origen relacional como Microsoft SQL Server a un almacenamiento en Hadoop como Hive o HDFS, teniendo la posibilidad de analizar esa información a través de Hue.</p><h3 dir="ltr">Panorama</h3><p dir="ltr">Para esta labor utilizaremos Apache Sqoop [1], una herramienta precisamente creada para mover datos entre bases de datos estructuradas y Hadoop. Sqoop trabaja con tablas individuales, cada fila de una tabla se trata como un registro en HDFS. Todos los registros se almacenan como datos de texto en archivos de texto, en Hive o HBase (ver figura 1).</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/rppAtPXM6A0yfFfQ60DFtcv5rEu-gGzjivIvHJXDb8OwXMY8QrLwsSDv8l_A3zEAB-_Rl3G-fDpaqBtHokxSU7WPq8mcGI9vmd8eMkx0cdbNGM51WB1M-7N2Mn44o-RfpOM76zfq5z9N7fy8TA" width="589" height="274" /></p><p dir="ltr"><em>Figura 1. Flujo de Sqoop</em></p><h3>Prerrequisitos</h3><p dir="ltr">Para el propósito de este tutorial voy a suponer que ya se tiene instalado y funcionando tanto un ambiente de SQL Server como otro de Hadoop. Si no tienes el de Hadoop, para propósito de aprendizaje puedes utilizar una máquina virtual de Cloudera Quickstart [2]. En tu ambiente de Hadoop necesitas tener instalado Sqoop. Checa si ya tienes, invocando el comando “sqoop” desde la línea de comandos. Si no lo tienes, lo más conveniente es instalarlo por medio del manejador de paquetes de tu sistema operativo (en el caso de OSX está disponible para Homebrew).</p><h3 dir="ltr">Preparando la conexión</h3><p dir="ltr">Nos conectaremos a SQL Server por medio de JDBC. Para que esto funcione primero necesitamos habilitar TCP/IP en nuestra instancia. Esto se hace desde el SQL Server Configuration Manager.</p><p dir="ltr">Posteriormente vamos a descargar el driver de JDBC de SQL Server en nuestro ambiente Hadoop. Este se obtiene del sitio web de Microsoft y al momento de escribir este artículo la versión más reciente se obtiene en <a href="http://swgu.ru/t3">http://swgu.ru/t3</a> . Dentro del paquete encontraremos una carpeta jre7 y otra jre8 y dentro de cada una hay un archivo .jar que corresponde al driver. Así que seleccionaremos el archivo que corresponda a la versión de java que estemos usando y lo copiaremos en /var/lib/sqoop . Si esta carpeta no existe, la creamos y le asignamos los permisos necesarios como se ve a continuación.</p><p class="code" dir="ltr">$ mkdir -p /var/lib/sqoop<br />$ chown sqoop:sqoop /var/lib/sqoop <br />$ chmod 755 /var/lib/sqoop<br />$ sudo cp sqljdbc_6.0/enu/jre8/sqljdbc42.jar /var/lib/sqoop/</p><h3 dir="ltr">Importando datos</h3><p dir="ltr">Para verificar que podemos conectarnos de nuestro ambiente Hadoop a SQL Server vamos a comenzar listando las bases de datos. Para ello utilizamos sqoop list-databases con los argumentos de conexión requeridos (en este ejemplo nuestro SQL Server está disponible en la ip 192.168.56.1 y exponiendo el puerto 1444, y tiene un usuario hadoopUser con contraseña hadoop… ).</p><p class="code" dir="ltr">$ sqoop list-databases --connect jdbc:sqlserver://192.168.56.1:1444 --username hadoopUser --password hadoop...</p><p dir="ltr">Con lo anterior obtendremos una lista de las bases de datos.</p><p dir="ltr">A continuación importamos la base de datos y tablas que queremos (en este caso la tabla employee de la base de datos sqoopDB).</p><p class="code" dir="ltr">$ sqoop import --connect "jdbc:sqlserver://192.168.56.1:1444;username=hadoopUser; password=hadoop...; database=sqoopDB" --table employee --hive-import</p><p dir="ltr">Por cierto, si quisieramos importar todas las tablas de la BD sin necesidad de especificarlas una por una utilizaríamos sqoop import-all-tables –connect “jdbc://sqlserver….” --hive-import</p><p dir="ltr">Si quieres revisar lo que se importó a Hadoop, puedes hacerlo por medio Hue, una interfaz gráfica web para navegar Hadoop.</p><h3 dir="ltr">Hagámoslo repetible</h3><p dir="ltr">Si quisieramos estar realizando esta tarea frecuentemente, lo más conveniente es &nbsp;crear un “job” en sqoop que simplemente podemos invocar. Para ello usamos sqoop job con el argumento --create y el resto de la información para conectarse a SQL Server.</p><p class="code" dir="ltr">$ sqoop job --create jobImpEmpl -- import --connect "jdbc:sqlserver://192.168.56.1:1444;username=hadoopUser;password=hadoop...;database=sqoopDB" --table employee --hive-import</p><p dir="ltr">Lo más probable es que no querramos importar todos los datos cada vez que ejecutamos la tarea, sino que solo querramos importar los datos nuevos o modificados. Para lograr esto usamos la opción --incremental e indicamos la columna con el timestamp a verificar.</p><p class="code" dir="ltr">$ sqoop job --create jobImpEmplInc -- import --connect "jdbc:sqlserver://192.168.56.1:1444;username=hadoopUser;password=hadoop...;database=sqoopDB" --table employee --incremental lastmodified -check-column creationdate --hive-import</p><p dir="ltr">Ya creamos los jobs, pero todavía no los ejecutamos. Para ejecutar un job utilizamos sqoop job --execute &lt;nombre-del-job&gt;. Para ver los jobs que tenemos definidos podemos usar sqoop job --list. Y si queremos consultar los detalles de algún job usamos sqoop job --show &lt;nombre-del-job&gt;.</p><h3 dir="ltr">Ejecución periódica automatizada</h3><p dir="ltr">Si deseamos estar importando datos de manera periódica y automatizada, lo más conveniente es programar la tarea por medio de Oozie, que es una herramienta del ecosistema Hadoop que permite gestionar workflows desde una interfaz web.</p><p dir="ltr">Oozie tiene un editor en el cual defines el workflow. Si ya tienes el comando de sqoop que deseas ejecutar simplemente puedes “pegarlo” en un campo de texto al crear tu workflow. Después de eso podemos crear “coordinadores” para calendarizar el envío de información al sistema HDFS (ver figura 2).</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/DYYH_O1XfK_Rbb5F5HV2PrlK6uICsvrtEmdQMbvUG6waFw9A57lJXQUM7hnZKsn80hnxGAv7_s-y141zhpMVxgg8MYoJV5ZahO6nM-BkRNQSjHnKl75byG6mu39aKuKGCUpQI-oieUh3tnAMWg" width="320" height="384" /></p><p dir="ltr"><em>Figura 2. Coordinar workflows en Oozie</em></p><h3 dir="ltr">Conclusión</h3><p dir="ltr">Se ha mostrado de una forma sencilla la extracción de datos desde un popular ambiente de bases de datos relacionales hasta un sistema columnar como Hive.</p><p dir="ltr"><strong>Referencias</strong></p><ol><li><a href="http://sqoop.apache.org">http://sqoop.apache.org</a></li><li><a href="https://www.cloudera.com/developers/get-started-with-hadoop-tutorial.html">https://www.cloudera.com/developers/get-started-with-hadoop-tutorial.html</a></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El MSC Hugo Enrique De La Mora Carrillo (@hugodelamora) es Chief Information Security Officer en CONTPAQi. Anteriormente ha trabajado con sistemas distribuidos, big data, desarrollo para cloud y móvil.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:31:18 +0000 sg 7736 at https://sg.com.mx https://sg.com.mx/revista/55/exportando-sistemas-relacionales-sistemas-columnares-distribuidos#comments Visión Computacional https://sg.com.mx/revista/55/visi-n-computacional <span class="field field--name-title field--type-string field--label-hidden">Visión Computacional</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/118168_computer_vision_ecology.jpg" width="700" height="300" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:26</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/herramientas" hreflang="und">Herramientas y Tecnologías</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/ana-loyo" hreflang="und">Ana Loyo</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La visión computacional trata de emular en las computadoras la capacidad que tienen nuestros ojos. Es decir, trata de interpretar las imágenes recibidas por dispositivos como cámaras y reconocer los objetos, ambiente y posición en el espacio.</p><p dir="ltr">Lograr tal interpretación al mismo nivel que el ser humano es un problema complejo. Sin embargo, ha habido avances considerables a lo largo de los años.</p><p dir="ltr">Del procesamiento de imágenes a la visión computacional</p><p dir="ltr">Durante la década de los 1970s se dieron los primeros avances significativos en el campo de análisis de imágenes por computadora. Resaltan los siguientes trabajos::</p><ul><li dir="ltr"><p dir="ltr">Azriel Rosenfeld es uno de los pioneros en este campo, su trabajo se enfocó principalmente en el desarrollo de técnicas empíricas basadas en criterios matemáticos para representar objetos físicos por medio de un conjunto de discreto de datos.</p></li><li dir="ltr"><p dir="ltr">Otro enfoque fue el propuesto por Waltz y Mackworth en 1975, reduciendo el alcance del problema a un mundo de bloques blancos mate iluminados sobre fondo negro. Los bloques podían tener cualquier forma, siempre que todas sus superficies fueran planas y todos sus bordes rectos. Aunque este enfoque fue útil para experimentar, dadas sus restricciones no se pudo llevar a mundos complejos.</p></li><li dir="ltr"><p dir="ltr">Por su parte, el trabajo de Berthold Horn se enfocó en establecer modelos de cálculo que expresan la formación de imágenes a través de ecuaciones diferenciales que relacionan los valores de intensidad de la imagen con la geometría, la reflectancia de la superficie y el punto de vista del observador. La idea era que debía existir un nivel adicional de comprensión en el que el carácter de las tareas de procesamiento de la información llevadas a cabo durante la percepción se analicen y comprendan de modo independiente a los mecanismos y escrituras particulares que los implementa en nuestros cerebros.</p></li></ul><p dir="ltr">Ahora bien, debemos considerar que la visión computacional y el procesamiento de imágenes son cuestiones diferentes. &nbsp;El procesamiento de imagen trata sobre cómo mejorar una imagen para su interpretación por una persona mientras que la visión computacional trata de interpretar las imágenes por la computadora.</p><p dir="ltr">La visión computacional se puede dividir en 3 grandes etapas:</p><ol><li dir="ltr"><p dir="ltr">Procesamiento de nivel bajo. Se extraen propiedades como orillas, gradiente, profundidad, textura, color, etcétera.</p></li><li dir="ltr"><p dir="ltr">Procesamiento de nivel intermedio. Agrupa elementos de nivel bajo para obtener contornos y regiones con el propósito de segmentar.</p></li><li dir="ltr"><p dir="ltr">Procesamiento de alto nivel. Consiste en la interpretación utilizando modelos y/o conocimiento del dominio del problema.</p></li></ol><h3 dir="ltr">Experimentando con OpenCV</h3><p dir="ltr">Actualmente, una de las tecnologías más usadas para visión computacional es OpenCV. &nbsp;Esta es una librería publicada bajo licencia BSD que está disponible para una gran variedad de sistemas operativos y tiene más de 500 funciones que abarcan una amplia gama de áreas en el proceso de visión y reconocimiento de objetos, calibración de cámaras, visión estérea y visión robótica. Se puede utilizar con los lenguajes de programación Python, C++ y Java, entre otros.</p><p dir="ltr">A continuación explicaré como instalar un ambiente de desarrollo para visión computacional con OpenCV y Python.</p><p dir="ltr">En este caso, Python es una excelente opción de lenguaje de programación por ser un lenguaje de código abierto, multiplataforma, con una sintaxis intuitiva, una curva de aprendizaje corta y un amplio ecosistema de bibliotecas. En caso de que no tengas Python instalado, puedes obtenerlo en <a href="https://www.python.org/downloads">https://www.python.org/downloads</a> . Procura usar una versión 2.7.x de Python (al momento de este artículo la versión más reciente de esta rama es la 2.7.13) ya que si usas una versión 3.6.x tendrás problemas de compatibilidad cuando trates de usarlo con las otras herramientas que recomiendo en este artículo.</p><p dir="ltr">Si quieres utilizar un editor de código, personalmente me gusta LiClipse, pero en gustos se rompen géneros así que utiliza tu preferido.</p><p dir="ltr">El siguiente paso a seguir es la instalación de NumPy (en su última versión), un paquete fundamental de Python que contiene sofisticadas funciones y extiende el soporte para vectores, matrices y funciones matemáticas de alto nivel. La forma más sencilla de instalar numpy es por medio de la utilería pip. Si trabajas en Windows, como yo, recuerda agregar las variables del sistema correspondientes a la ruta donde tienes tu archivo Python.exe y a la carpeta Scripts dentro de Python. Hecho lo anterior solamente tendrás que ejecutar desde la línea de comandos:</p><p><code dir="ltr">pip install numpy</code></p><p dir="ltr">Si todo sale bien obtendrás un mensaje confirmando que numpy se instaló exitosamente.</p><p dir="ltr">Ahora vamos a instalar OpenCV. Si usas Windows, para instalar OpenCV debes descargarlo de <a href="http://opencv.org/releases.html">http://opencv.org/releases.html</a> donde encontrarás un ejecutable de Windows. Este archivo es un paquete que descomprime OpenCV en la carpeta que elijas. Una vez hecho esto, entra a la carpeta que se creó y localiza el archivo cv2.pyd bajo la ruta build/python/2.7/x64 &nbsp;(el x64 &nbsp;ruta es suponiendo que tu sistema operativo sea de 64 bits, que es lo más probable). Ahora copia el archivo cv2.pyd a la carpeta lib/site-packages de tu instalación de Python.</p><p dir="ltr">Si usas Linux, puedes instalar OpenCV del repositorio de paquetes de tu sistema operativo. En el caso de OSX, lo más sencillo es instalar OpenCV por medio de Homebrew (tienes que habilitar el repositorio homebrew/science).</p><p dir="ltr">Para verificar que nuestra instalación de OpenCV funciona correctamente hagamos un pequeño programa. Crea en tu computadora una carpeta donde pongas un archivo de imagen, y crea un programa python con el código mostrado en el listado 1.</p><p dir="ltr"><img src="https://lh5.googleusercontent.com/QXOHCQYq8nkQr51FpMqiQdoFdH3uS0Q1Z-IOwo-4rPyJAzqS_Kj4kUpixaI5NzFnvp-0s_3T79mk3WlCgMLkaxYn-kW5bKybukVVhpVMKlmSu4XciDENfKYnA2izNPl7zuq8MC2r" width="624" height="104" /></p><p dir="ltr"><em>Listado 1. Prueba de opencv</em></p><p dir="ltr">Reemplaza “carro.jpg” por el nombre de archivo de tu imagen (recuerda incluir la ruta en caso que tu imagen esté en una imagen distinta a tu programa).</p><p dir="ltr">Si todo está bien, al ejecutar tu programa se desplegará una ventana con tu imagen, tal como se muestra en la figura 1.</p><p dir="ltr"><img src="https://lh4.googleusercontent.com/G1aBDd4SteZGhUnBVuRZ1fB2aOT3ZFpMOMup5HQ71nd_nRJyFXJ7cm1BNLtQHwDo-MdEHNIoKMdgq28jpjaQG9D2h96m8QnuHu-9mktac2n7C_0DqVTs81PLZNbVSxrDsWGV_mDL" alt="img4.png" width="624" height="299" /></p><p dir="ltr"><em>Figura 1. Ejecución de programa con OpenCV</em></p><p dir="ltr">Teniendo todo esto instalado puedes comenzar a experimentar con el reconocimiento de imágenes. Obviamente necesitarás más que esto pero el objetivo del artículo es que puedas realizar una configuración mínima necesaria para comenzar, suerte con tus proyectos.</p><p dir="ltr">Te comparto algunas recomendaciones para continuar en tu exploración:</p><ul><li dir="ltr"><p dir="ltr">Puedes tener problemas al querer usar PIP, verifica que estén bien las variables de entorno en tu sistema operativo.</p></li><li dir="ltr"><p dir="ltr">Cuando descomprimas OpenCV asegúrate de estar copiando el archivo correcto en &nbsp;la ruta correcta porque si no lo haces bien, no reconocerá el import de cv2.</p></li><li dir="ltr"><p dir="ltr">En <a href="http://opencv.org/links.html">http://opencv.org/links.html</a> puedes encontrar varios tutoriales e información de referencia sobre OpenCV.</p></li><li dir="ltr"><p dir="ltr">Cuando trabajas con dispositivos como la RaspBerry tu código será un poco distinto. No pretendas probar sin tener el hardware, inicia tu código y pruebas hasta que lo tengas y te evitarás re-trabajo.</p></li></ul><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Ana Luz Loyo Páez es Ingeniero en Sistemas Computacionales (UNIVO) con Maestría en Comercio Electrónico (ITESM). Actualmente es Coordinadora de contenidos en Software Guru, y catedrático en la Universidad Veracruzana. Además es desarrolladora, instructora y asesora de TI y Negocios Electrónicos freelance. &nbsp;TW @ana_loyo</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:26:49 +0000 sg 7735 at https://sg.com.mx https://sg.com.mx/revista/55/visi-n-computacional#comments CDO: Se buscan líderes digitales https://sg.com.mx/revista/55/cdo-se-buscan-l-deres-digitales <span class="field field--name-title field--type-string field--label-hidden">CDO: Se buscan líderes digitales</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/brooke-lark-176366.jpg" width="800" height="369" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 08/21/2017 - 15:19</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/55" hreflang="und">SG #55</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/seccion-revista/columna-invitada" hreflang="und">Columna invitada</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/author-speaker/olivia-salas" hreflang="und">Olivia Salas</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Una de las preguntas clave que la alta dirección se hace al emprender una iniciativa de transformación digital es: ¿quién debe liderar el viaje hacia la innovación? En muchas organizaciones, la respuesta se ha materializado en un nuevo rol corporativo: el director de Digitalización, o Chief Digital Officer (CDO), a quien se le encomienda concretar la evolución innovadora del negocio.</p><p dir="ltr">Por la sustancia digital del cargo, que exige una sólida competencia tecnológica en temas como IoT, Big Data, movilidad, entre otras, se asume que el CIO es un candidato ideal para dirigir una iniciativa de transformación digital. Sin embargo, de acuerdo con encuestas entre corporaciones globales, sólo el <a href="https://leadingedgeforum.com/publication/digital-drama-in-the-c-suite-2495/">35% de los CIO</a> dirigirá la transformación digital de sus organizaciones. Estos especialistas también deben afrontar una pregunta, al parecer, sin respuesta sencilla: “¿Y por qué yo no?”.</p><h3 dir="ltr">CDO: una evolución posible para el experto TI</h3><p dir="ltr">En la elección de un líder para dirigir la transformación digital, según los expertos, la mayoría de los CIO pierde la oportunidad por la misma razón: no logran demostrar de forma contundente que su habilidad tecnológica está firmemente alineada a los valores de negocio. Por ejemplo, los CIO pueden proyectar un gran conocimiento sobre IoT, pero pierden confianza ante cuestionamientos que un CDO debería responder: ¿qué significará IoT para la experiencia del cliente?, ¿esta innovación generará nuevas oportunidades o líneas de negocio?, ¿tendrá un efecto negativo en una oferta?, ¿cómo influirá IoT en la estrategia de ventas y mercadotecnia?</p><p dir="ltr">En ese sentido, en el marco de una transformación digital, el CDO entiende qué necesita cambiar, por qué debe hacerlo y cuál será la repercusión de negocio, mientras que el CIO se concentra en cómo realizar la modificación. &nbsp;&nbsp;&nbsp;</p><p dir="ltr">No obstante, un líder del área de Tecnología o Sistemas puede tomar las riendas de una iniciativa digital si cambia su enfoque y desarrolla nuevas capacidades. Entre otros aspectos, debería poner atención a:</p><ul><li dir="ltr"><p dir="ltr">Mejorar la comunicación con los líderes de negocio. En sus diálogos con otros gerentes y directivos es necesario reducir el uso de palabras como “algoritmo”, “protocolo” o “zettabytes”, y privilegiar conceptos como “trayecto del cliente”, “ventas multicanal” y “experiencia del usuario”, entre otros. Esto implica una nueva actitud y enfoque: no sólo pensar en el costo, la implementación y la gestión de la innovación, sino en cómo utilizarla para alcanzar metas de negocio que generan valor a la empresa.</p></li><li dir="ltr"><p dir="ltr">Definir nuevos parámetros de colaboración. Dado su foco y experiencia en la operación, los CIO tienden a hablar y pensar en escala de “proyectos”. Hoy, la prioridad es interactuar con los distintos departamentos empresariales, entender sus objetivos y plantear “resultados de negocios”. El CDO es un habilitador de capacidades, no un gestor de tareas. Los mejores CDO detectan las necesidades de las áreas corporativas, incluso antes de que éstas las reconozcan.</p></li><li dir="ltr"><p dir="ltr">Nueva escala de valores. En la dinámica de su equipo de trabajo original, el departamento de Sistemas o Tecnología, el CIO debe inculcar una cultura de la velocidad, la agilidad y el foco en el cliente. Esto creará una mentalidad “de CDO” entre los especialistas técnicos, lo que enriquecerá su visión de la empresa, la toma de decisión y el liderazgo.</p></li><li dir="ltr"><p dir="ltr">Colaboración multidisciplinaria. En su camino a la posición de CDO, un líder tecnológico hará bien en acostumbrarse a trabajar con especialistas en ventas, mercadotecnia, logística, administración, producción, redes sociales, atención al cliente, etc. Sumar la perspectiva de estos colaboradores, en las metas de TI, fortalece la capacidad de análisis y ejecución de un CDO.</p></li></ul><p dir="ltr">Más allá de estos aspectos, para asumir el timón de una transformación digital, los CIO deben superar un gran desafío. En muchas ocasiones, abrumados por las tareas operativas de TI que deben atender todos los días, los CIO no tienen tiempo para desarrollar la visión, la creatividad y las capacidades que exige el rol de CDO.</p><p dir="ltr">En este aspecto,soluciones de software para infraestructura, automatización, desarrollo y gestión de nube entre mucha más, facilitan la administración y operación de la infraestructura de TI existente, y habilitan el camino a tecnologías emergentes. Ambas capacidades, permiten que el líder de TI se concentre en la transformación innovadora del negocio, y tome mucho menos tiempo en tareas operativas.</p><p dir="ltr">Un CIO que se compromete con una nueva visión y el desarrollo de nuevas habilidades, sin lugar a dudas, puede ponerse al frente de una transformación digital, la transformación de la organización hacia el futuro de un negocio que evoluciona.</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">Olivia Salas es Directora de Marketing de Red Hat México.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 21 Aug 2017 20:19:37 +0000 sg 7734 at https://sg.com.mx https://sg.com.mx/revista/55/cdo-se-buscan-l-deres-digitales#comments