<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1994917754886445503</id><updated>2026-06-09T03:38:17.306-03:00</updated><category term="Programming"/><category term="Programación"/><category term="Business"/><category term="UX"/><category term="Solutions"/><category term="Java"/><category term="News"/><category term="UXDesign"/><category term="Android"/><category term="Desarrollo"/><category term="Design"/><category term="Noticias"/><category term="Mobility"/><category term="ProductDesign"/><category term="UI"/><category term="UIDesign"/><category term="VirtualBox"/><category term="ALM"/><category term="Add-ins"/><category term="CSharp"/><category term="ChillOut"/><category term="Error"/><category term="Featured"/><category term="Gadgets"/><category term="Python"/><category term="VM"/><category term="Visual Studio 2008"/><category term="Windows 7"/><category term="iPhone 5"/><category term="ubuntu"/><category term="Ant"/><category term="Developers"/><category term="Development"/><category term="Eventos"/><category term="Hiper-V"/><category term="Humor"/><category term="IOS"/><category term="Maven"/><category term="PHP"/><category term="Problemas"/><category term="ProjectManagement"/><category term="Telegram"/><category term="Tools"/><category term="UserExperience"/><category term="VDI"/><category term="VHD"/><category term="Windows Server 2008 R2"/><category term="Windows XP"/><category term="crowdfunding"/><category term="0xc0000225"/><category term="12.10"/><category term="2012"/><category term="2013"/><category term="ADB"/><category term="Able2Extract Professional 8"/><category term="Agile"/><category term="Algorithm"/><category term="Angular"/><category term="Animación"/><category term="App"/><category term="Apple"/><category term="Arte"/><category term="AugmentedReality"/><category term="Avast"/><category term="BadPractices"/><category term="BehavioralDesign"/><category term="Bipartite"/><category term="BugBounty"/><category term="CEO"/><category term="CI"/><category term="Cambiar UUID"/><category term="Capacitación Online"/><category term="Cohort Analysis"/><category term="Compactar"/><category term="Compactar VDI"/><category term="Compra"/><category term="Configuracion"/><category term="Conversión"/><category term="Convert"/><category term="Coolers"/><category term="Curiosidades"/><category term="CyberCrime"/><category term="CyberInsurance"/><category term="CyberSecurity"/><category term="DCJ"/><category term="Database"/><category term="Debug"/><category term="Declarative"/><category term="DeclarativeProgramming"/><category term="DesignCommunication"/><category term="DesignForChildren"/><category term="DesignPodcast"/><category term="DesignPsychology"/><category term="DesignThinking"/><category term="DesignTrends"/><category term="Diseño"/><category term="Django"/><category term="Downloads"/><category term="Dropwizard"/><category term="Dual Piezoelectric Cooling Jet"/><category term="Eclipse"/><category term="Entrepreneur"/><category term="Excel"/><category term="Facebook"/><category term="Feliz Año Nuevo"/><category term="Feliz Navidad"/><category term="Form 1"/><category term="Formlabs"/><category term="Freelance"/><category term="Freemium"/><category term="Future"/><category term="GIT"/><category term="General Electric"/><category term="Graph"/><category term="Growth"/><category term="Hacked"/><category term="Hardware"/><category term="Hashtagthinking"/><category term="Hiring"/><category term="Hugo Barra"/><category term="Indiegogo"/><category term="Innovación"/><category term="Instalación"/><category term="Integración Continua"/><category term="IntelliJ"/><category term="Internet Business"/><category term="IronPython"/><category term="JDK"/><category term="JVM"/><category term="JavaScript"/><category term="Jenkins"/><category term="Jobs"/><category term="Jython"/><category term="Kickstarter"/><category term="Kotlin"/><category term="Microservices"/><category term="MixedReality"/><category term="Mobile"/><category term="Modelado 3D"/><category term="MySQL"/><category term="Netbeast"/><category term="NetworkEffects"/><category term="Node.js"/><category term="NodeRED"/><category term="Onboarding"/><category term="Open Source"/><category term="P3DGraphics"/><category term="PDF"/><category term="PHP7"/><category term="Password"/><category term="Performance"/><category term="PersuasiveDesign"/><category term="PowerBI"/><category term="PowerPivot"/><category term="Pricing"/><category term="Programacion"/><category term="ProgrammingLanguage"/><category term="PyPy"/><category term="REST"/><category term="RPython"/><category term="React"/><category term="Recuperar"/><category term="Retention"/><category term="RubyPython"/><category term="SCM"/><category term="SaaS"/><category term="SiliconValley"/><category term="SiteMaps"/><category term="Software-as-a-Service"/><category term="SoftwareEstimation"/><category term="Soporte"/><category term="Stick-N-Find Technologies"/><category term="StickNFind"/><category term="Tim Cook."/><category term="Tips"/><category term="TortoiseGIT"/><category term="Tutorial"/><category term="UTF8"/><category term="Udemy"/><category term="Unicode"/><category term="Variables de Entorno"/><category term="VirtualReality"/><category term="Visual Studio 2010"/><category term="VisualProgramming"/><category term="Web"/><category term="WebGL"/><category term="WhatsApp"/><category term="Wireframing"/><category term="Wordpress"/><category term="Xcode"/><category term="Zend"/><category term="add-apt-repository"/><category term="adduser"/><category term="bad design"/><category term="best practices"/><category term="bootstrapped"/><category term="commands"/><category term="digital design"/><category term="free space"/><category term="graph-models"/><category term="iPhone"/><category term="iPhone 5c"/><category term="iPhone 5s"/><category term="impresora 3d"/><category term="industrial design"/><category term="interface"/><category term="internetofthings"/><category term="iot"/><category term="linux"/><category term="longevity"/><category term="smarthome"/><category term="sudo"/><category term="toptal"/><category term="trabajo a distancia"/><title type='text'>David G Technology Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>74</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-916708437059001637</id><published>2018-03-16T07:09:00.000-03:00</published><updated>2018-03-16T16:01:10.459-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AugmentedReality"/><category scheme="http://www.blogger.com/atom/ns#" term="MixedReality"/><category scheme="http://www.blogger.com/atom/ns#" term="Programación"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="VirtualReality"/><title type='text'>Realidad Aumentada vs. Realidad Virtual vs. Realidad Mixta: Una Guía Introductoria</title><content type='html'>&lt;h3 id=&quot;a-pesar-de-tener-muchas-cosas-en-comn-vr-ar-y-mr-no-son-lo-mismo-este-artculo-analiza-los-diferenciadores-clave-las-fuerzas-impulsoras-y-los-casos-de-uso-de-estas-tres-tecnologas-relacionadas-prometedoras&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de tener muchas cosas en común, VR, AR y MR no son lo mismo. Este artículo analiza los diferenciadores clave, las fuerzas impulsoras y los casos de uso de estas tres tecnologías relacionadas prometedoras.&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La tecnología actual ha recorrido un largo camino desde los días de los discos de cartón fino de View-Master que contienen siete pares 3D estereoscópicos de pequeñas fotografías en color, hasta la realidad virtual de hoy y su primo cercano AR. De hecho, gracias a las grandes inversiones de gigantes como Facebook, Google, Samsung y muchos otros que apuestan a los retornos de alto valor, la realidad virtual y aumentada se está abriendo paso en nuestras fuentes de noticias cada vez con mayor frecuencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Reels de View-Master Disneyland, anuncio de 1963&quot; src=&quot;https://uploads.toptal.io/blog/image/124462/toptal-blog-image-1508845756377-0a154af36f4c1c94cc7ff60a9bfe483b.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Reels de View-Master Disneyland, anuncio de 1963&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, comenzamos resaltando los matices entre VR, AR y MR, y luego realizamos un rápido viaje atrás en el tiempo para ver cómo evolucionó VR / AR. Finalmente, evaluamos cómo encajan en la realidad de hoy y cómo pueden afectar la del mañana.&lt;/div&gt;
&lt;h2 id=&quot;qu-es-la-realidad-virtual-vr&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es la Realidad Virtual (VR)?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Realidad Virtual o VR es una experiencia simulada e inmersiva proyectada por un dispositivo a la vista del usuario. Imagina caminar por el Champs-Elisée (París), mientras estás sentado en tu sótano en San Francisco. Todo lo que necesita es un auricular que lo proyecte a una simulación a través de un visor. Eso es exactamente lo que VR promete, y mucho más.&lt;/div&gt;
&lt;h2 id=&quot;cmo-funciona-la-realidad-virtual&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo funciona la realidad virtual?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF doblando un teléfono Google Pixel en un auricular DayDream&quot; src=&quot;https://uploads.toptal.io/blog/image/124463/toptal-blog-image-1508845764944-0245b58accf7e73efa8f9527b23032e3.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
&lt;a href=&quot;https://vr.google.com/daydream/smartphonevr/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Daydream&lt;/a&gt;, auriculares VR&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunos de ustedes recordarán que fue una experiencia emocionante usar el View-Master de Mattel, que se introdujo en la década de 1960. La realidad virtual de hoy es la versión moderna de ese efecto estereoscópico turístico: requiere un conjunto de lentes dentro de una ventana gráfica en un auricular y un dispositivo montado donde se almacena o se calcula la experiencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF de alguien que pinta en el espacio 3D con realidad virtual con la aplicación HTC Vive Tilt Brush VR&quot; src=&quot;https://uploads.toptal.io/blog/image/124464/toptal-blog-image-1508845777150-847ff1a13b29d4b832694404acb67f7a.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
&lt;a href=&quot;https://www.tiltbrush.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Tiltbrush&lt;/a&gt;&amp;nbsp;por Google&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde la observación pura hasta la inmersión completa, el rango de capacidades de realidad virtual varía según el dispositivo y el tipo de auricular utilizado. El uso de un control remoto en sincronización con los auriculares montados permite al usuario interactuar con objetos tridimensionales en el espacio, dentro de la experiencia, ya sea para juegos de realidad virtual o interfaces y aplicaciones virtuales.&lt;/div&gt;
&lt;h2 id=&quot;la-breve-historia-de-la-realidad-virtual-y-su-evolucin-a-travs-del-tiempo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La breve historia de la realidad virtual y su evolución a través del tiempo&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dejando de lado el tecnicismo de la realidad virtual por un momento, y centrándonos en la inmersiva experiencia de 360​​° que pretende proyectarnos, podríamos argumentar que la realidad virtual comenzó a partir de los “murales de 360 ​​grados (o pinturas panorámicas) del siglo XIX, “como la&amp;nbsp;&lt;a href=&quot;https://www.vrs.org.uk/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Virtual Reality Society&lt;/a&gt;&amp;nbsp;afirma en su&amp;nbsp;&lt;a href=&quot;https://www.vrs.org.uk/virtual-reality/history.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;History of Virtual Reality&lt;/a&gt;&amp;nbsp;Pasamos de un simulador de vuelo temprano (1929) a la primera pantalla montada en la cabeza VR de Morton en 1960, a Neo experimentando todo el mundo como una simulación dentro de The Matrix en 1999.&lt;/div&gt;
&lt;h2 id=&quot;qu-empresas-lideran-el-mercado-de-realidad-virtual-hoy&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué empresas lideran el mercado de realidad virtual hoy?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Las personas que usan auriculares principales VR en el mercado hoy en día son de: Google Daydream, Samsung Gear VR, Oculus Rift, Sony Playstation VR, HTC Vive&quot; src=&quot;https://uploads.toptal.io/blog/image/124465/toptal-blog-image-1508845797153-c90c4692a5f8bab7c8dee347da37c9eb.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
© Google, Samsung, Oculus/Facebook, Sony, HTC&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Avance rápido hasta 2014, donde Google inició un mercado masivo de auriculares DIY que utiliza un teléfono inteligente para impulsar la experiencia de realidad virtual:&amp;nbsp;&lt;a href=&quot;https://vr.google.com/cardboard/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google Cardboard&lt;/a&gt;. Samsung siguió el año siguiente con su&amp;nbsp;&lt;a href=&quot;http://www.samsung.com/global/galaxy/gear-vr/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Gear VR&lt;/a&gt;, y la nueva carrera para la realidad virtual estaba oficialmente activada. Oficialmente adquirido en junio de 2014, Oculus VR se unió a la familia de Facebook para acelerar su objetivo de dominación en el espectro de gama alta de los auriculares de realidad virtual.&lt;/div&gt;
&lt;h2 id=&quot;qu-es-la-realidad-aumentada-ar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es la Realidad Aumentada (AR)?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tal como lo sugiere su nombre, Augmented Reality, o AR, se agrega a nuestra percepción del mundo superponiendo gráficos generados por computadora, imágenes o un conjunto de datos interactivos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Demostración de Apple AR en la WWDC 2017, un camaleón renderizado en 3D sobre una mesa en realidad aumentada&quot; src=&quot;https://uploads.toptal.io/blog/image/124466/toptal-blog-image-1508845805478-af3b6400725cfd11032dc38db2ee3925.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Fuente:&amp;nbsp;&lt;a href=&quot;http://developer.apple.com/videos/play/wwdc2017/602/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Apple WWDC 2017&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&quot;cmo-funciona-ar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo funciona AR?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A partir de hoy, AR solo requiere un teléfono inteligente con una cámara y una aplicación AR. Dos elementos clave que lo hacen funcionar son la capacidad de la cámara para capturar el entorno a su alrededor mientras se mueve y el software que calcula y proyecta algunos elementos visuales o contenidos generados por computadora.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Demo de la aplicación IKEA Place AR que muestra muebles renderizados en 3D proyectados en una sala de estar en AR&quot; src=&quot;https://uploads.toptal.io/blog/image/124467/toptal-blog-image-1508845818629-2366c1293b0b276228cc94e26b5a4dba.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
© IKEA Place AR App&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un gran ejemplo de esto en acción es la reciente aplicación AR de IKEA que permite a cualquier persona imaginar cómo se sentiría cualquier habitación o espacio con algunos de los muebles de la marca.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/digital&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñadores&lt;/a&gt;&amp;nbsp;y los arquitectos podrían beneficiarse claramente de esta nueva forma de crear objetos a escala de vida en un contexto de vida real. “Ahora, la tecnología ha alcanzado nuestra ambición. AR nos permite redefinir una vez más la experiencia de la venta minorista de muebles, en nuestra inquieta búsqueda de crear una mejor vida cotidiana para todos, en todas partes”&amp;nbsp;&lt;a href=&quot;http://www.ikea.com/us/en/about_ikea/newsitem/091217_IKEA_Launches_IKEA_Place&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;dice Michael Valdsgaard&lt;/a&gt;, Líder de la Transformación Digital en Inter IKEA Systems.&lt;/div&gt;
&lt;h2 id=&quot;una-breve-historia-de-ar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una breve historia de AR&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde el lanzamiento del primer marcador virtual de línea amarilla durante un juego en vivo de la NFL en 1998 hasta la superposición de datos cartográficos para ayudar a las simulaciones de vuelo de la NASA, la realidad aumentada ha vivido fuera de la ciencia ficción durante muchas décadas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En 1974, Myron Kruger combinó proyectores y cámaras de video en un entorno interactivo; fue el nacimiento de AR tal como lo conocemos hoy.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Más recientemente, AR dio un gran salto hacia una adopción más amplia en la WWDC 17 de Apple, cuando el desarrollo de AR se introdujo en las masas con ARKit, un marco de desarrollo para aplicaciones de realidad aumentada creadas para iPhones y iPads.&lt;/div&gt;
&lt;h2 id=&quot;arkit-vs-arcore---la-lucha-entre-apple-y-google-para-la-dominacin-ar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
ARkit vs. ARCore - La lucha entre Apple y Google para la dominación AR&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Apple ARKit contra Google ARCore tecnologías de realidad aumentada&quot; src=&quot;https://uploads.toptal.io/blog/image/124468/toptal-blog-image-1508845871932-4ac7ebe18698273b75d2518ea278b92c.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
© Apple and Google&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://developer.apple.com/arkit/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ARKit de Apple&lt;/a&gt;&amp;nbsp;para iOS 11 promete democratizar el desarrollo de contenido de AR y el consumo masivo. Es una respuesta directa al&amp;nbsp;&lt;a href=&quot;https://developers.google.com/ar/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ARCore de Google&lt;/a&gt;&amp;nbsp;que tiene la ventaja de aprovechar su conocimiento de estar también en el espacio de realidad virtual, al contrario que Apple. Tanto el diseño de AR como los marcos de desarrollo prometen simplificar y acelerar el proceso de creación y poner la tecnología en manos de millones que ya usan teléfonos Android e iOS.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dado que las aplicaciones de realidad aumentada aún son nuevas para el mercado masivo, es demasiado pronto para decir qué tan diferentes son estos kits de desarrollo, excepto que son específicos para sus propios sistemas operativos y públicos centrales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora que las dos compañías tecnológicas más destacadas -entre ellas, que controlan el 99% del mercado de teléfonos inteligentes- han hecho un movimiento tan público detrás de la realidad aumentada, deberíamos estar listos para ver cómo se trastornan las industrias, una vez más.&lt;/div&gt;
&lt;h2 id=&quot;qu-pasa-con-la-realidad-mixta-mr&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué pasa con la realidad mixta (MR)?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La realidad mixta es un híbrido de realidad virtual y AR, y tiene como objetivo ofrecer lo mejor de ambos mundos. Por ejemplo, mientras usa un auricular como VR, al ver a través de una ventana o vidrio translúcido, también proyecta imágenes en la parte superior de nuestro entorno.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo que hace que MR se destaque es su aspecto altamente interactivo y la representación realista de la proyección que agrega a nuestro entorno. En lugar de depender únicamente de los controles remotos o las pantallas de los teléfonos, podemos interactuar con el contenido inmersivo usando gestos naturales del cuerpo y de los dedos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Apple y Google claramente lideran el camino en la tecnología de AR, pero el paisaje de MR de hoy favorece a Microsoft (HoloLens) y al enormemente financiado Magic Leap (hasta ahora solo una demostración de concepto).&lt;/div&gt;
&lt;h2 id=&quot;microsoft-hololens-y-magic-leap---los-dos-reyes-de-la-carrera-de-realidad-mixta&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Microsoft HoloLens y Magic Leap - Los dos reyes de la carrera de realidad mixta&lt;/h2&gt;
&lt;h3 id=&quot;microsoft-hololens&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Microsoft HoloLens&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF de la demo de la aplicación de realidad mixta Microsoft HoloLens - estudio anatómico&quot; src=&quot;https://uploads.toptal.io/blog/image/124469/toptal-blog-image-1508845882271-c803e2da05aaf0f58e102040ef883c26.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
&lt;a href=&quot;https://www.microsoft.com/hololens&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Microsoft HoloLens&lt;/a&gt;&amp;nbsp;tecnología holográfica&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de la falla comercial de Google Glass, Microsoft no rehuyó probar su propia&amp;nbsp;&lt;a href=&quot;https://www.microsoft.com/en-ca/hololens&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;“computadora holográfica”&lt;/a&gt;&amp;nbsp;en el juego MR. El nombre “HoloLens” proviene de la experiencia central “que le permite interactuar con su contenido digital e interactuar con hologramas en el mundo que lo rodea”.&lt;/div&gt;
&lt;h3 id=&quot;magic-leap&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Magic Leap&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF de la demo de tecnología de realidad mixta de Magic Leap --- elefante virtual 3D interactivo&quot; src=&quot;https://uploads.toptal.io/blog/image/124470/toptal-blog-image-1508845903095-c77c52db80e4cbd410c743f8bdffdcf4.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Crédito:&amp;nbsp;&lt;a href=&quot;https://www.magicleap.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Magic Leap&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como uno de los emprendimientos pre-producto más financiados, esta empresa respaldada por Google es también uno de los proyectos más reservados de la industria tecnológica. El CEO de Magic Leap, Rony Abovitz lo llama&amp;nbsp;&lt;a href=&quot;https://www.wired.com/2015/04/rony-abovitz/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;“realidad cinematográfica: un cambio completo en la computación visual”.&lt;/a&gt;&amp;nbsp;Esta empresa de tecnología de realidad mixta aborda el desafío de&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/interactive/designing-for-interactive-environments-and-smart-spaces&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñar entornos interactivos&lt;/a&gt;&amp;nbsp;aprovechando lo mejor de los sistemas de realidad virtual y aumentada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque todavía no se ha hecho público, las gafas holográficas utilizan la Señal de campo dinámico digitalizada, proyectando imágenes directamente en el ojo y “engañando” al cerebro haciéndole creer que es real. El resultado es una experiencia aumentada más rica y creíble.&lt;/div&gt;
&lt;h2 id=&quot;cmo-estn-vr-ar-y-mr-redefiniendo-la-forma-en-que-vemos-y-experimentamos-el-mundo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo están VR, AR y MR redefiniendo la forma en que vemos y experimentamos el mundo?&lt;/h2&gt;
&lt;h3 id=&quot;vr-para-entretenimiento-y-consumo-de-medios-masivos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
VR para entretenimiento y consumo de medios masivos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF de la página de aterrizaje de Lego Star Wars 360 moviendo la vista de página en panorámico&quot; src=&quot;https://uploads.toptal.io/blog/image/124471/toptal-blog-image-1508845915797-728365c8a4a78384be3cdc9f93d43985.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
© Lego/Star Wars&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Uno de los ganadores obvios de la aparición de la realidad virtual es la industria del entretenimiento. Lego&amp;nbsp;&lt;a href=&quot;https://lc-www-live-s.legocdn.com/FranchiseSites/Starwars/Games/360VideoExperience/v14/index.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Star Wars 360 Experience&lt;/a&gt;&amp;nbsp;es un ejemplo de gran adopción e implementación de la realidad virtual, haciendo posible que los espectadores experimenten la narración de una manera totalmente diferente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al&amp;nbsp;&lt;a href=&quot;http://variety.com/2017/digital/news/oculus-go-1202587073/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;anunciar&lt;/a&gt;&amp;nbsp;el primer auricular independiente VR (que no requiere un teléfono o una computadora para adjuntarlo), el gigante tecnológico Facebook es a la ofensiva con su plan para democratizar la realidad virtual.&lt;/div&gt;
&lt;h3 id=&quot;ar-reinventa-nintendo-----una-empresa-centenaria-----casi-durante-la-noche&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
AR Reinventa Nintendo — Una empresa centenaria — Casi durante la noche&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con el explosivo éxito de&amp;nbsp;&lt;a href=&quot;http://www.pokemongo.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Pokemon Go&lt;/a&gt;&amp;nbsp;en 2016, el mundo tuvo su primera visión de cómo AR literalmente podía “mover” nuestra realidad al aumentarla con pequeños monstruos que entraban y salían de nuestras pantallas de teléfonos inteligentes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Extracto GIF de los videos promocionales de Pokemon Go&quot; src=&quot;https://uploads.toptal.io/blog/image/124472/toptal-blog-image-1508845928846-7afcbe594c6cea910066faec18a25032.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
© Pokemon Go&lt;/div&gt;
&lt;h3 id=&quot;realidad-mixta-realidad-fusionada-sentimientos-encontrados&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Realidad mixta. Realidad fusionada? Sentimientos encontrados.&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con distinciones poco claras de sus primos VR y AR, la realidad mixta tiene dificultades para definir su futuro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al igual que VR, MR usa un auricular para iniciar la experiencia. Pero los dispositivos de realidad mixta son diferentes del hardware VR típico porque usan gafas translúcidas montadas como&amp;nbsp;&lt;a href=&quot;https://www.x.company/glass/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google Glass&lt;/a&gt;&amp;nbsp;que nos permiten mantenernos enraizados en el mundo real — la realidad virtual se mezcla con la realidad real.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al igual que AR, MR superpone contenido digital y simulaciones además de lo que normalmente veríamos. Pero las experiencias de realidad mixta te permiten interactuar físicamente con la simulación de maneras que AR no puede … todavía. Y en lugar de depender solo de la pantalla de su teléfono, puede usar su cuerpo y los controladores remotos para interactuar con el entorno de forma más interactiva.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hoja de ruta de realidad según Intel, que prefiere el término de realidad combinada a realidad mixta&quot; src=&quot;https://uploads.toptal.io/blog/image/124473/toptal-blog-image-1508845945801-e799a7344afce362b01ef8ca60d45bb7.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 904.5px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Mapa de realidad de acuerdo a Intel, quienes prefieren la “realidad combinada”, (Cortesía&amp;nbsp;&lt;a href=&quot;http://www.extremetech.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ExtremeTech&lt;/a&gt;)&lt;/div&gt;
&lt;h2 id=&quot;the-vr-ar-y-mr-landscape-in-numbers&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
The VR, AR, y MR Landscape in Numbers&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con el fin de realmente retomar y alcanzar una adopción más amplia, la tracción financiera será un indicador clave de la tracción tecnológica y experiencial.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Respaldado por inversionistas de alto perfil como Google Ventures de Alphabet, Alibaba y Andreessen Horowitz, Magic Leap lidera el juego de inversiones de MR con casi $ 2 mil millones en fondos de riesgo hasta la fecha.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Repasemos las principales inversiones en compañías clave de VR / AR en el mercado actual.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfico de barras de las principales inversiones en compañías clave de VR / AR en el mercado&quot; src=&quot;https://uploads.toptal.io/blog/image/124480/toptal-blog-image-1508847787434-831ff68993444cc26549f194d527d1e5.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 840px;&quot; /&gt;&lt;/div&gt;
&lt;h2 id=&quot;consideraciones-de-diseo-para-las-nuevas-realidades&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Consideraciones de diseño para las nuevas realidades&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñar para VR, AR y MR es similar a crear nuevas realidades. Este nuevo paradigma de creación de contenido inmersivo y multidimensional exige nuevas reglas y consideraciones. El diseño de realidad aumentada, virtual y mixta aprovecha las habilidades existentes que van desde&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/visual&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseño visual&lt;/a&gt;(3D, UI) hasta&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/%20designers/product-design&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseño de experiencia&lt;/a&gt;&amp;nbsp;(UX, producto) y desarrollo, entre otros.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde una comprensión de la anatomía humana, la empatía, el diseño de sonido a visual y mucho más: cuando se trata de diseñar fuera del lienzo rectangular 2D estándar, las creatividades tienen un nuevo campo de juego.&lt;/div&gt;
&lt;h3 id=&quot;d-y-diseo-visual&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
3D y diseño visual&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objetos 3D y malla&quot; src=&quot;https://uploads.toptal.io/blog/image/124475/toptal-blog-image-1508845962956-032b46069a2ff2431e7a70f03d136933.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640.5px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.toptal.com/virtual-reality&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los diseñadores de realidad virtual&lt;/a&gt;&amp;nbsp;deben usar un enfoque completamente diferente y un conjunto de herramientas para crear experiencias e interfaces inmersivas. Más precisamente, tienen que pensar fuera de la pantalla 2D o en los rectángulos y en su lugar pensar en su lienzo creativo como un espacio ilimitado de 360°.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todo se convierte en tridimensional, y en consecuencia, los diseñadores de realidad virtual colaboran mejor con los expertos en 3D y/o adquieren una comprensión básica de&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/javascript/3d-graphics-a-webgl-tutorial&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gráficos 3D utilizando WebGL&lt;/a&gt;&amp;nbsp;y otras herramientas de código abierto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El popular software de creación 3D incluye:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://unity3d.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Unity3D&lt;/a&gt;&amp;nbsp;(diseño + motor de juego)&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://vr.google.com/blocks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google VR Blocks&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.blender.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Blender 3D&lt;/a&gt;&amp;nbsp;(libre, fuente abierta)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;comprender-la-escala-y-el-posicionamiento&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comprender la escala y el posicionamiento&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfico de una persona en una habitación con medidas de espacio para los requisitos de espacio de HTC Vive VR&quot; src=&quot;https://uploads.toptal.io/blog/image/124476/toptal-blog-image-1508845972193-90c6da515531b25ce8cd20a342616298.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Crédito: HTC Vive space requirements&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las consideraciones de escala y posicionamiento para el diseño de realidad virtual y AR están vinculadas y se afectan entre sí. Por un lado, la distancia de un elemento del espectador afecta la legibilidad y la facilidad con la que uno puede interactuar con él. Por otro lado, la escala de un objeto dentro de la realidad simulada refleja cuán grande / pequeño, o lejano/cerca estaría el mismo objeto en el mundo real.&lt;/div&gt;
&lt;h3 id=&quot;seguimiento-y-movimiento&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Seguimiento y movimiento&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Oculus Rift Touch Controllers - Sistema de seguimiento de movimiento VR&quot; src=&quot;https://uploads.toptal.io/blog/image/124477/toptal-blog-image-1508845980923-cf609c9b72c7d80b018b29608807d84a.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Crédito: Oculus Rift Touch Controllers&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El concepto de seguimiento de movimiento está vinculado al hardware y software virtual, aumentado y de realidad mixta que se utiliza. Por ejemplo, aunque Google Cardboard permite principalmente el seguimiento de movimiento básico desde el acelerómetro del teléfono, el auricular más reciente Google Daydream VR viene con un control remoto que le permite señalar las cosas e impulsar las interacciones dentro del espacio virtual.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En el extremo superior del espectro, los sistemas inmersivos como&amp;nbsp;&lt;a href=&quot;https://www.oculus.com/rift/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Oculus Rift&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;https://www.vive.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;HTC Vive&lt;/a&gt;&amp;nbsp;permiten un movimiento más receptivo sistemas de seguimiento y controladores interactivos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñar para rastreadores de movimiento y controladores requiere una buena comprensión de los gestos humanos naturales y de la capacidad física. Hacer esto bien ayuda a mejorar el efecto de inmersión.&lt;/div&gt;
&lt;h3 id=&quot;tomando-seales-de-disciplinas-ms-tradicionales&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tomando señales de disciplinas más tradicionales&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Lista de arte tradicional y principios de animación&quot; src=&quot;https://uploads.toptal.io/blog/image/124478/toptal-blog-image-1508845990699-acbb2cf66068cb94b10791795cedfaca.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Fuente:&amp;nbsp;&lt;a href=&quot;http://mikealger.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Mike Alger&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No es necesario reinventar la rueda cuando se trata de diseñar para AR/VR/MR. Al igual que cuando hicimos la transición de la impresión a la web, podemos tomar muchas claves y aplicar muchos principios de formas de arte más tradicionales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, la teoría del color, las reglas de composición y las mejores prácticas de iluminación aún se aplican a los nuevos medios. Debido a que sigue siendo el mundo real el que estamos tratando de emular y experimentar en un contexto diferente, al aprovechar las nuevas tecnologías, los principios fundamentales de las artes visuales pueden aprovecharse al diseñar las nuevas realidades que estamos construyendo.&lt;/div&gt;
&lt;h3 id=&quot;principios-de-animacin-y-transicin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Principios de animación y transición&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;GIF animado de un cuadrado que rebota&quot; src=&quot;https://uploads.toptal.io/blog/image/124479/toptal-blog-image-1508845998338-d9ce190a47f8d6f6cfa9bfec4e15e00e.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 1134.02px;&quot;&gt;
Fuente:&amp;nbsp;&lt;a href=&quot;https://vimeo.com/93206523&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;The Illusion of Life&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo mismo ocurre con los principios de animación: el efecto de transición y el movimiento en una realidad virtual ganan mucha credibilidad cuando se aplican los&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;12 principios de animación&lt;/span&gt;&amp;nbsp;(nada menos que por Disney). Repasemos brevemente:&lt;/div&gt;
&lt;ol style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Squash and Stretch:&lt;/span&gt;&amp;nbsp;Expandir y comprimir un objeto para simular el peso y el volumen en movimiento.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Anticipación:&lt;/span&gt;&amp;nbsp;Un indicador de que una acción importante está a punto de llevarse a cabo.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Puesta en escena:&lt;/span&gt;&amp;nbsp;Tener una intención clara en cada estado / posición de un objeto.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;En línea recta y pose a pose:&lt;/span&gt;&amp;nbsp;Primero se definen los estados de inicio y fin y luego se rellena el espacio.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Acción de seguimiento y superposición:&lt;/span&gt;&amp;nbsp;Cuando muchas piezas en movimiento se detienen, no todas se detienen a la vez.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Lento de entrada y desaceleración:&lt;/span&gt;&amp;nbsp;A.k.a. efecto de relajación - ir despacio, luego rápido, luego lento.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Arco:&lt;/span&gt;&amp;nbsp;En pocas palabras, agregando un poco de agitación en la mayoría de los movimientos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Acción secundaria:&lt;/span&gt;&amp;nbsp;Agregar a una acción principal para reforzarla o complementarla.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Sincronización:&lt;/span&gt;&amp;nbsp;Usando velocidad o latencia para simular física o escala de tiempo.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Exageración:&lt;/span&gt;&amp;nbsp;Acentuar movimientos específicos para ayudar a enfatizar algo.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Dibujos sólidos:&lt;/span&gt;&amp;nbsp;Hacer que las cosas se vean más tridimensionales.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Apelación:&lt;/span&gt;&amp;nbsp;Este principio requiere características interesantes y atractivas.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;herramientas-y-recursos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Herramientas y recursos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con el objetivo de democratizar estas tecnologías emergentes y estimular un espíritu de co-creación, muchas empresas comparten sus marcos de diseño y desarrollo con el mundo. Estos son algunos recursos clave para comenzar con realidades virtuales, aumentadas y mezcladas:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Facebook Design –&amp;nbsp;&lt;a href=&quot;http://facebook.design/vr&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;VR resources&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Apple –&amp;nbsp;&lt;a href=&quot;https://developer.apple.com/arkit/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ARkit&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Microsoft HoloLens Mixed Reality –&amp;nbsp;&lt;a href=&quot;https://developer.microsoft.com/en-us/windows/mixed-reality&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;MR Kits&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;el-futuro-de-las-realidades-aumentadas-virtuales-y-mixtas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El futuro de las realidades aumentadas, virtuales y mixtas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
AR ha mostrado una tasa de adopción más amplia si consideramos el éxito mundial del éxito de Pokemon Go. Hoy en día, todo lo que se necesita para experimentar la realidad aumentada es un teléfono inteligente con un sistema operativo actualizado, una cámara decente y una aplicación AR. No hay costo de entrada, y tenemos todo el mundo como nuestro lienzo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La reciente entrada de Apple en el juego AR promete impulsar aún más las tendencias de realidad aumentada.&amp;nbsp;&lt;a href=&quot;http://www.bbc.com/news/technology-41590323&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Tim Cook ha expresado su posición&lt;/a&gt;al respecto: “Claramente hay algunas cosas geniales para la realidad virtual, pero en mi opinión no es profunda. profundo.”&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de una historia más larga que AR o MR, la realidad virtual parece tener un problema de audiencia, principalmente por el alto costo de adopción de un auricular VR decente, la incomodidad física con el uso prolongado y la falta de casos concretos de uso de la tecnología.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“¿Cómo funciona la realidad virtual?” es una pregunta que a menudo escuchamos en línea, así como en eventos de realidad virtual. No obstante, muchos sectores podrían usar la tecnología para crear nuevas oportunidades. Por ejemplo,&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/virtual-reality/virtual-reality-in-the-automotive-industry&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;realidad virtual en la industria automotriz&lt;/a&gt;&amp;nbsp;muestra algunas posibilidades interesantes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por último, la realidad mixta es la combinación perfecta de realidad real, aumentada y virtual. “Las aplicaciones son infinitas”, dice&amp;nbsp;&lt;a href=&quot;https://www.avegant.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Avegant&lt;/a&gt;&amp;nbsp;CEO Joerg Tewes.&amp;nbsp;&lt;a href=&quot;https://medium.com/fast-company/is-mixed-reality-the-future-of-computing-82da13cfb93f&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Él reflexiona&lt;/a&gt;&amp;nbsp;sobre cómo&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/product-design&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores&lt;/a&gt;&amp;nbsp;e&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/software&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ingenieros&lt;/a&gt;&amp;nbsp;podrían manipular directamente modelos 3D con sus manos. “La realidad mixta permite a las personas interactuar directamente con sus ideas en lugar de pantallas o teclados”, agrega.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El mundo está a punto de ampliar sus fronteras con contenido inmersivo en 3D y el mundo digital como nunca antes. Es una oportunidad única para diseñadores, ingenieros y empresas para unirse a la revolución.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/designers/resume/tidjane-tall&quot;&gt;Tidjane Tall&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/designers/ui/realidad-aumentada-vs-realidad-virtual-vs-realidad-mixta-una-gu%C3%ADa-introductoria/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/916708437059001637/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2018/03/realidad-aumentada-vs-realidad-virtual-vs-realidad-mixta.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/916708437059001637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/916708437059001637'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2018/03/realidad-aumentada-vs-realidad-virtual-vs-realidad-mixta.html' title='Realidad Aumentada vs. Realidad Virtual vs. Realidad Mixta: Una Guía Introductoria'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-743681475218671204</id><published>2018-01-09T07:00:00.000-03:00</published><updated>2018-01-09T14:33:50.997-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Design"/><category scheme="http://www.blogger.com/atom/ns#" term="Hashtagthinking"/><category scheme="http://www.blogger.com/atom/ns#" term="Programación"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="UI"/><category scheme="http://www.blogger.com/atom/ns#" term="UserExperience"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><title type='text'>Conviértete en un Diseñador de Clase Mundial al Hacer del Mundo tu Oficina</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El gran diseño tiene la habilidad de guiarnos perfectamente a un resultado encantador. Abarca toda una experiencia cuando interactuamos con un producto o servicio. El gran diseño parece simple, pero es solo a través de una profunda comprensión de las personas y la decisión de desafiar la complejidad que se logra un gran diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;ser un diseñador de clase mundial&quot; src=&quot;https://uploads.toptal.io/blog/image/91112/toptal-blog-image-1431066992077-29e441d53c7628a1104ce9294b8fb39c.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los viajes nos ayudan a desentrañar esa complejidad al dar una nueva perspectiva a las ideas, así como a ayudarnos a experimentar problemas que afectan el mundo a escala global, o incluso esos pequeños detalles que podríamos perder mientras estamos sentados en una oficina normal. Un vuelo retrasado o cómo se rocía el chocolate en el café en esa nueva ciudad revela mucho acerca de la excelente experiencia del usuario y cómo diseñar la emoción. Los viajes ayudan a comprender ecosistemas completos y brindan una visión general completa de cómo estos toques a menudo pasados ​​por alto pueden cambiar por completo un estado de ánimo, crear una sonrisa y construir una marca. Las mejores marcas son las que tienen empatía y saben exactamente para quién existen y cómo ofrecer algo que a esas personas les importa.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Toma Airbnb, por ejemplo. Diseñaron un ecosistema de experiencia completo para satisfacer la alegría al comprender el recorrido del usuario desde todas las perspectivas, superando las expectativas desde el principio al agregar detalles como la fotografía profesional gratuita; y durante los primeros días, literalmente se sumergieron en la experiencia del usuario durmiendo en los pisos de sus primeros adoptantes para comprender el problema que les apasionaba resolver desde todos los ángulos. Los diseñadores deben experimentar los puntos débiles, así como el placer de la solución final para entregar realmente un trabajo de primer nivel, y eso es lo que el viaje hace por usted.&lt;/div&gt;
&lt;div&gt;
&lt;h2 id=&quot;experimentar-el-mundo-y-aplicar-nuevas-ideas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Experimentar el mundo y aplicar nuevas ideas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ver el mundo puede hacernos&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores&lt;/a&gt;&amp;nbsp;más productivos. Estar en el camino significa que no siempre podemos estar en línea. Esta desconexión periódica forzada ayuda a mantener el foco, porque simplemente no hay tiempo para las distracciones en línea cuando cada segundo cuenta. Recordando momentos en los que la productividad se intensificó, me llevo a los momentos intermedios cuando repentinamente me sentí entusiasmado por sacar mi portátil al aire, debido a la forma en que el sol golpeó el monitor frente a mí durante mi vuelo y me había recordado este optimismo futurista que se prestaba perfectamente al cambio de marca en el que estaba trabajando. Con productividad adicional, obtenemos soluciones más rápido y con menos estrés. Estamos haciendo nuestras propias mentes y los productos de nuestros clientes un favor. Además, se ha descubierto que viajar realmente puede hacernos&amp;nbsp;&lt;a href=&quot;http://www.marketwatch.com/story/travel-that-keeps-the-heart-and-brain-healthy-2014-01-15&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;más felices y más saludables&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las soluciones de diseño mejoran a medida que comprendemos más sobre las personas, el mundo y cómo interactuamos con la tecnología. A veces son las pequeñas cosas en las ciudades que nos dan grandes ideas y nuevos enfoques para la resolución de problemas. Por lo general, cuanto más oscuro es el desafío, más emocionante es el aprendizaje y la aplicación del insight. Estar en ciudades nuevas y ver cómo las personas usan la tecnología para facilitar sus vidas nos ayuda a diseñar soluciones de diseño cultural y contextualmente relevantes. Fue solo después de vivir en Berlín por un tiempo que nuestro equipo entendió cómo los locales usaban la tecnología, así como su actitud hacia ella. En ese momento, estábamos diseñando una alarma interactiva que lo despertaba con contenido de audio en vivo y reproducía su música favorita.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;soluciones de diseño global&quot; src=&quot;https://uploads.toptal.io/blog/image/91113/toptal-blog-image-1431067022896-dfefd0adbb8905c919db2fe3df5ec9da.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Después de extensas investigaciones y pruebas realizadas por los usuarios, descubrimos que las personas tendían a apagar sus teléfonos inteligentes y su wifi durante la noche, lo que obviamente significaba que nuestro enfoque del desafío había cambiado significativamente. Comenzamos a construir una experiencia que ya no dependía de una conexión a Internet para funcionar. En San Francisco, es fácil olvidar que no todos tienen el último teléfono inteligente en sus bolsillos y que&amp;nbsp;&lt;a href=&quot;http://www.internetworldstats.com/stats.htm&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;solo el 42.3%&lt;/a&gt;&amp;nbsp;del mundo está en línea. Pero también en San Francisco o Seúl podemos ver un futuro perfectamente conectado, donde el contenido es contextual y relevante e incluso desbloquear un&amp;nbsp;&lt;a href=&quot;http://breather.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;nuevo espacio de oficina apenas accesible&lt;/a&gt;. Es tan importante sumergirse en lo último en tendencias de diseño e interacción como experimentar sistemas completamente fuera de línea. Toma&amp;nbsp;&lt;a href=&quot;https://www.mpesa.in/portal/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;mPesa&lt;/a&gt;, lo cual permite a los africanos enviar y recibir dinero con solo un teléfono móvil básico. No se requiere una cuenta bancaria, conexión o transacciones en papel.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es una perspectiva global que nos da una visión local.&lt;/div&gt;
&lt;h2 id=&quot;mejorando-la-experiencia-global-del-usuario-con-su-perspectiva-personal&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mejorando la experiencia global del usuario con su perspectiva personal&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sentarse en el metro en Melbourne es toda una experiencia. Es lo opuesto al sistema de transporte altamente eficiente y compacto en Taipei, donde todo se sentía automatizado y puntual. En Melbourne, la infraestructura en expansión de la ciudad hace que los viajes sean largos, y además el estilo de vida relajado hace que el metro sea una experiencia social. No es raro entablar una conversación con la persona sentada a tu lado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En ciudades rápidas como Taipei, Londres y Nueva York, la socialización parece invasiva. Los viajeros se absorben en sus auriculares e interfaces y usan su tecnología para crear su propia barrera personal. Comprender las diferencias regionales mejora nuestro proceso de diseño ayudándonos a comprender qué tecnología utilizan las personas y nos hace conscientes de sus comportamientos existentes. Una aplicación que&amp;nbsp;&lt;a href=&quot;https://www.sprig.com/#/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;entrega alimentos a pedido&lt;/a&gt;&amp;nbsp;funcionaría perfectamente en un lugar donde la conveniencia, la salud y la eficiencia son importantes, como en Palo Alto o San Francisco. Sin embargo, puede ser un fracaso total en ciudades como Taipei, donde comer es una experiencia social y comunitaria, impulsada por streetfood y la disponibilidad local.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;experiencias sociales y comunitarias&quot; src=&quot;https://uploads.toptal.io/blog/image/91114/toptal-blog-image-1431067063407-c64cd065c816d9c5a9c6c69bcbf3923b.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.paulgraham.com/cities.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Paul Graham articula&lt;/a&gt;&amp;nbsp;la manera mágica en que las ciudades afectan nuestros cada momento:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“Una ciudad te habla principalmente por accidente, en cosas que ves a través de las ventanas, en las conversaciones que escuchas. No es algo que tienes que buscar, sino algo que no puedes apagar”.&lt;/em&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es la forma en que las nuevas experiencias dan forma a lo que somos como humanos y como diseñadores que viajan facilita. Los viajes ofrecen un rico intercambio cultural y contaminación cruzada de ideas para conectarnos con la diversidad. Estar en un lugar nuevo es como ser un lienzo en blanco para la experiencia, y tener una mente abierta generalmente conduce a generar las mejores ideas y ejecutar los diseños más frescos. Pensar en nuestros pies sacándonos de nuestras zonas de confort nos da nuevos conocimientos.&lt;/div&gt;
&lt;h2 id=&quot;un-diseador-puede-aprender-mucho-de-la-publicidad&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un diseñador puede aprender mucho de la publicidad&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez, se encontró una perspectiva completamente nueva, aparentemente de la nada. Me desperté especialmente temprano una mañana para tomar un vuelo de Santiago a Atlanta, y me había encontrado en el aeropuerto mucho antes de que partiera el vuelo. Con tiempo para matar, terminé hablando con una mujer amable que estaba en un viaje por el mundo. Ella me contó sobre su fascinación con la publicidad que estaba en los metros en cada ciudad que visitó. Ella había dicho que aprendió más sobre las ciudades a través de la forma en que se anunciaban los productos.&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“Hay mucho por descubrir sobre los roles de género, las aspiraciones y los sueños con solo mirar los anuncios en el metro. En Santiago, por ejemplo, hay anuncios de lencería de diosas latinas vestidas escasamente junto a avisos sobre dietas”.&lt;/em&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ella decía cómo estos afectan esa voz de las ciudades que pareciera gritar de forma silenciosa y nos ayudan a entender qué motiva a las personas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
De hecho, la publicidad puede proporcionar pistas culturales que ayuden a&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/brand&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;los diseñadores&lt;/a&gt;&amp;nbsp;a mantenerse al día con las últimas tendencias, así como a proporcionar información sobre lo que motiva a una ciudad. Me senté en la parte posterior de un Uber y conté las vallas publicitarias que se alzaban orgullosas y altas a lo largo de la desolada autopista durante el viaje de El Valle a San Francisco. Visualmente escaso, noté una campaña publicitaria que tenía una sola línea: “pregúntale a su desarrollador”, con un pequeño logotipo rojo Twillio en la parte inferior. La implicación fue clara. Los no desarrolladores tendrían que pedirle a alguien más “conocedor” que ellos que entienda la cartelera.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;publicidad y pistas culturales&quot; src=&quot;https://uploads.toptal.io/blog/image/91115/toptal-blog-image-1431067093390-10555f43215090c997d810360538572d.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este es solo un ejemplo de lo que revela una campaña sobre lo que impulsa a San Francisco.&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/freelance&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los desarrolladores&lt;/a&gt;&amp;nbsp;son claramente respetados y están en una posición de influencia, y la ubicación y el contenido de la cartelera muestran que hay un claro grupo demográfico que habita la ciudad, que consiste en negocios y tecnología. Ciertamente, nunca había visto una valla publicitaria que anunciara algo nuevo o relacionado con la tecnología en Santiago, donde el contenido estaba impulsado por aspiraciones bastante diferentes. A menudo veía anuncios de Becks o Corona que representaban hombres jóvenes y atados con una botella en la mano y algunas mujeres hermosas de fondo disfrutando de una cerveza en la “Playa”. Fue la actitud despreocupada que reveló mucho sobre las aspiraciones de estilo de vida de la cultura, haciendo hincapié en la amistad, la belleza y la calidad de vida. La dirección artística del anuncio mostraba un destello de lente soleado, una tendencia actualmente evidente en la publicidad y el cine.&lt;/div&gt;
&lt;h2 id=&quot;mantenindose-al-tanto-de-las-tendencias-de-diseo-fresco&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Manteniéndose al tanto de las tendencias de diseño fresco&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El diseño plano ha sido otra tendencia de larga data en&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/gui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseño de interfaz&lt;/a&gt;, superando el eskeumorfismo (popularizado por Apple), y lentamente se ha estado infiltrando en la publicidad clásica de maneras interesantes . Especialmente en ciudades como Londres, París y Nueva York, donde las estrategias de campaña integradas&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/digital&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;digitales&lt;/a&gt;&amp;nbsp;son primordiales para el éxito de una campaña.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
De hecho,&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=OFu4cN7Df-8&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;esta campaña&lt;/a&gt;&amp;nbsp;para McDonalds muestra tanto el diseño plano como los efectos de destello de la lente. Un simple anuncio impreso ya no lo corta, y la ideación de una campaña creativa ahora se denomina con ternura como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“#hashtagthinking”&lt;/em&gt;, donde se deben tener en cuenta las estrategias completas en y fuera de línea. Son estas ciudades donde a menudo se establecen tendencias creativas, inspirándose en el arte, la moda y la cultura. Una vez que las tendencias creativas alcanzan la popularidad de la corriente principal, generalmente provocada por su ingreso al hogar gracias a las industrias de publicidad y cinematografía, cuentan una historia visual de lo que es importante para una cultura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mantenernos en contacto con las tendencias publicitarias nos convierte en mejores diseñadores porque:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Somos capaces de identificar tendencias en diseños y productos&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Podemos entender mejor lo que motiva una cultura&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Podemos aprender de la claridad de la voz en campañas efectivas&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Somos capaces de entender estrategias claras en la comunicación&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estéticamente hablando, hay un montón de valor que los viajes pueden agregar a su trabajo de diseño simplemente experimentando nuevos lugares. Creo que estar en una nueva ubicación puede ayudar a terminar con el estancamiento que incluso los mejores diseñadores enfrentan ocasionalmente. Al intercambiar lo familiar con nuevas imágenes, sonidos, sabores y olores, nos volvemos más receptivos al mundo que nos rodea, encendemos y percibimos las cosas con ojos y mentes nuevos. Al usar nuevas partes de nuestros cerebros y el hecho de que estamos a la expectativa, también es más probable que abordemos los problemas de forma diferente o que lleguemos a conclusiones alternativas simplemente porque estamos más conectados con el mundo en ese momento. A veces está en los detalles de nuestro nuevo entorno: la forma en que la arquitectura en Melbourne te hace soñar con la geometría y te anima a reconsiderar la cuadrícula del último diseño del sitio web, o la forma en que el cabello negro de esa chica brilló al sol con tonos azulados recordándole agregar profundidad a su trabajo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La exploración es una gran parte del diseño y nos ayuda a obtener resultados innovadores y breves. Del mismo modo,&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/remote/software-development-anywhere-my-distributed-remote-workplace&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;explorar el mundo&lt;/a&gt;&amp;nbsp;significa que, al comprender los problemas mundiales, las culturas y sentirse inspirado por las nuevas ubicaciones, podemos traducir efectivamente esas nuevas ideas en diseños que deleiten a los clientes y a las personas que utilizan su solución.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/resume/danielle-reid&quot;&gt;Danielle Reid&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Artículo vía: &lt;a href=&quot;https://www.toptal.com/designers/ux/convi%C3%A9rtete-en-un-dise%C3%B1ador-de-clase-mundial-al-hacer-del-mundo-tu-oficina/es&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/743681475218671204/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2018/01/conviertete-en-un-disenador-de-clase-mundial-al-hacer-del-mundo-tu-oficina.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/743681475218671204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/743681475218671204'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2018/01/conviertete-en-un-disenador-de-clase-mundial-al-hacer-del-mundo-tu-oficina.html' title='Conviértete en un Diseñador de Clase Mundial al Hacer del Mundo tu Oficina'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-3390370804417429013</id><published>2017-12-21T07:30:00.000-03:00</published><updated>2017-12-21T12:19:45.806-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BadPractices"/><category scheme="http://www.blogger.com/atom/ns#" term="Database"/><category scheme="http://www.blogger.com/atom/ns#" term="Programación"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Malas Prácticas en el Diseño de la Base de Datos: ¿Estás Cometiendo estos Errores?</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cada vez que como desarrollador, se te asigna una tarea basada en el código existente, debes enfrentar muchos desafíos. Uno de esos desafíos—la mayoría de las veces el más exigente, implica la comprensión del modelo de datos de una aplicación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Normalmente te enfrentas a tablas, vistas, columnas, valores, procedimientos almacenados, funciones, restricciones y desencadenantes confusos que tardan mucho tiempo en tener sentido para ti. Y una vez que lo tienen, comienzas a notar muchas maneras de mejorar y aprovechar la información almacenada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si eres un desarrollador experimentado, es probable que también notes cosas que podrían haberse hecho mejor al principio, es decir, defectos de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Malas Prácticas de Diseño de Bases de Datos&quot; src=&quot;https://uploads.toptal.io/blog/image/124459/toptal-blog-image-1508498303776-01cdb3cd55e7d3bb2c8b1f7308bf4f95.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo aprenderás sobre algunas de las malas prácticas de diseño de bases de datos comunes, por qué son malas y cómo puedes evitarlas.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-1-ignorar-el-propsito-de-la-data&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 1: Ignorar el Propósito de la Data&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los datos se almacenan para ser consumidos más tarde y el objetivo siempre es almacenarlos y recuperarlos de la manera más eficiente. Para lograr esto, el diseñador de la base de datos debe saber de antemano qué representarán los datos, cómo se va a adquirir y a qué velocidad, cuál será su volumen operativo (es decir, cuántos datos se esperan) y, finalmente, cómo se usará.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, un sistema de información industrial donde los datos se recopilan manualmente todos los días no tendrá el mismo modelo de datos que un sistema industrial, donde la información se genera en tiempo real. ¿Por qué? Porque es muy diferente manejar cientos o miles de registros por mes en comparación con&amp;nbsp;&lt;a href=&quot;http://use-the-index-luke.com/sql/dml/insert&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;gestionar millones de ellos&lt;/a&gt;&amp;nbsp;en el mismo período. Los diseñadores deben tener consideraciones especiales para mantener la eficiencia y la usabilidad de la base de datos si los volúmenes de datos van a ser grandes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pero, por supuesto, el volumen de datos no es el único aspecto a considerar ya que el propósito de los datos también afecta el nivel de normalización, la estructura de datos, el tamaño del registro y la implementación general de todo el sistema.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por lo tanto, conocer a fondo el propósito del sistema de datos que creará conduce a consideraciones sobre la elección del motor de la base de datos, las entidades a diseñar, el tamaño y formato del registro y las políticas de administración del motor de la base de datos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ignorar estos objetivos conducirá a diseños defectuosos en sus aspectos básicos, aunque sean correctos estructural y matemáticamente.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-2-mala-normalizacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 2: Mala Normalización&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñar una base de datos no es una tarea determinista; dos diseñadores de bases de datos pueden seguir todas las reglas y principios de normalización para un problema determinado y, en la mayoría de los casos generarán diferentes diseños de datos. Esto es inherente a la naturaleza creativa de la ingeniería de software. Sin embargo, hay algunas técnicas de análisis que tienen sentido en cada instancia y seguirlas es la mejor manera de acceder a una base de datos que rinde al máximo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen de un conjunto de datos que conduce a dos diseños diferentes&quot; src=&quot;https://uploads.toptal.io/blog/image/124457/toptal-blog-image-1508475829692-78571fd2e7ba0371bf918ee138a19bfb.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de esto, a menudo nos enfrentamos con bases de datos que fueron diseñadas sobre la marcha, sin seguir las reglas más básicas de normalización. Tenemos que tenerlo claro: cada base de datos debe, al menos, normalizarse a la tercera forma normal ya que es el diseño que mejor representará a sus entidades y cuyo rendimiento se equilibrará mejor entre consultas e inserción-actualización-eliminación de registros.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si te encuentras con tablas que no cumplen con&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Third_normal_form&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;3NF&lt;/a&gt;, 2NF, o hasta 1NF, considera rediseñar estas tablas. El esfuerzo que inviertas para hacerlo valdrá la pena en muy corto plazo.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-3-redundancia&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 3: Redundancia&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Muy relacionado con el punto anterior ya que uno de los&amp;nbsp;&lt;a href=&quot;http://www.studytonight.com/dbms/database-normalization.php&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;objetivos de normalización&lt;/a&gt;&amp;nbsp;es reducirlo, la redundancia es otra mala práctica que aparece muy a menudo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los campos y tablas redundantes son una pesadilla para los desarrolladores ya que requieren lógica de negocios para mantener actualizada gran parte de la misma información. Esto es una sobrecarga que puede evitarse si las reglas de normalización se siguen al pie de la letra. Aunque a veces puede parecer necesaria la redundancia, debe utilizarse sólo en casos muy específicos y debe estar claramente documentada para poder tenerse en cuenta en futuros desarrollos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los efectos negativos típicos de la redundancia son un aumento innecesario del tamaño de la base de datos, los datos son propensos a la inconsistencia y disminuye la eficiencia de la base de datos pero—más importante—podría llevar a una corrupción en la data.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-no-4-integridad-referencial-mala-restricciones&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica No. 4: Integridad Referencial Mala (Restricciones)&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La integridad referencial es una de las herramientas más valiosas que proporcionan los motores de base de datos para mantener la calidad de los datos en su mejor forma. Si no se implementan restricciones o muy pocas restricciones desde la etapa de diseño, la integridad de los datos tendrá que depender totalmente de la lógica de negocios, lo que la hace susceptible a errores humanos.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-5-no-aprovechar-las-caractersticas-del-motor-de-base-de-datos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 5: No Aprovechar las Características del Motor de Base de Datos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando estás usando un&amp;nbsp;&lt;a href=&quot;https://dba.stackexchange.com/questions/4603/what-exactly-is-a-database-engine&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;motor de base de datos&lt;/a&gt;, tienes una poderosa pieza de software para tus tareas de manejo de datos que simplificará el desarrollo del software y garantizará que la información sea siempre correcta, segura y utilizable. Un Motor de Base de Datos proporciona servicios como:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Vistas que proporcionan una manera rápida y eficiente de ver tus datos, por lo general desincronizándolos para fines de consulta sin perder la corrección de los datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Índices que ayudan a acelerar las consultas en las tablas.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Funciones agregadas que ayudan a analizar información sin programación.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Transacciones o bloques de oraciones que alteran los datos que se ejecutan y comprometen o cancelan (retrotraen) si ocurre algo inesperado, manteniendo así la información en un estado permanentemente correcto.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Bloqueos que mantienen los datos seguros y correctos mientras se ejecutan las transacciones.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Procedimientos almacenados que proporcionan funciones de programación para permitir tareas complejas de administración de datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Funciones que permiten cálculos sofisticados y transformaciones de datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Restricciones que ayudan a garantizar la exactitud de los datos y evitar errores.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Disparadores que ayudan a automatizar las acciones cuando ocurren eventos en los datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comando optimizador (planificador de ejecución) que se ejecuta bajo el capó, asegurando que cada frase se ejecuta en su mejor momento y manteniendo los planes de ejecución para futuras ocasiones. Ésta es una de las mejores razones para usar vistas, procedimientos almacenados y funciones ya que sus planes de ejecución se mantienen permanentemente en el Motor de Base de Datos.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No conocer o ignorar estas capacidades llevará el desarrollo a un camino extremadamente incierto y seguramente a errores y problemas futuros.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-6-claves-primarias-compuestas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 6: Claves Primarias Compuestas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este es un punto de controversia ya que muchos diseñadores de bases de datos hablan hoy sobre el uso de un campo generado automáticamente como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ID&lt;/em&gt;&amp;nbsp;principal como la clave principal en lugar de un compuesto definido por la combinación de dos o más campos. Esto se define actualmente como la “mejor práctica” y, personalmente, tiendo a estar de acuerdo con ella.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen de una Clave Primaria Compuesta&quot; src=&quot;https://uploads.toptal.io/blog/image/124458/toptal-blog-image-1508475852961-b1abb93f955fd2cc8f5993dc1d95d97e.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, esto es solo una convención y por supuesto, el Motor de Base de Datos permite la definición de claves&amp;nbsp;&lt;a href=&quot;https://www.1keydata.com/blog/composite-key-in-sql.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;primarias compuestas&lt;/a&gt;, que muchos diseñadores piensan que son inevitables. Por lo tanto, al igual que con la redundancia, las claves primarias compuestas son una decisión de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, ten en cuenta que si esperas que tu tabla con una clave primaria compuesta tenga millones de filas, el índice que controla la clave compuesta puede crecer hasta un punto en el que el rendimiento de la operación&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CRUD&lt;/em&gt;&amp;nbsp;está muy degradado. En ese caso, es mucho mejor usar una clave primaria&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ID&lt;/em&gt;&amp;nbsp;simple que tenga un índice lo suficientemente compacto y establezca las restricciones de Motor de Bases de Datos necesarias para mantener la singularidad.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-7-mala-indexacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 7: Mala Indexación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A veces tendrás una tabla que necesitas consultar por muchas columnas. A medida que la mesa crezca, notarás que los SELECT en estas columnas se ralentizan. Si la tabla es lo suficientemente grande, pensarás lógicamente, en crear un índice en cada columna que uses para acceder a esta tabla pero notarás casi de inmediato que el rendimiento de los SELECT mejora, pero INSERT, UPDATE y DELETE caen. Esto por supuesto se debe al hecho de que los índices deben mantenerse sincronizados con la tabla, lo que significa una sobrecarga masiva para el Motor de Base de Datos. Este es un caso típico de indexación excesiva que puedes resolver de muchas maneras; por ejemplo, tener solo un índice en todas las columnas diferentes a la clave principal que utilizas para consultar la tabla, ordenar estas columnas de las más utilizadas a las menos puede ofrecer un mejor rendimiento en todas las operaciones de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CRUD&lt;/em&gt;&amp;nbsp;que un índice por columna.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por otro lado, tener una tabla sin índice en las columnas que se utilizan para consultarlo conducirá, como todos sabemos, a un bajo rendimiento en SELECTs.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, la eficiencia del índice depende a veces del tipo de columna; los índices en columnas INT muestran el mejor rendimiento posible pero los índices en VARCHAR, DATE o DECIMAL (si llega a tener sentido) no son tan eficientes. Esta consideración puede incluso llevar a rediseñar tablas a las que se debe acceder con la mejor eficiencia posible.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por lo tanto, la indexación es siempre una decisión delicada ya que demasiada indexación puede ser tan mala como muy poca y porque el tipo de datos de las columnas a indexar tiene una gran influencia en el resultado final.&lt;/div&gt;
&lt;h2 id=&quot;mala-prctica-n-8-convenciones-de-nomenclatura-deficiente&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mala Práctica N° 8: Convenciones de Nomenclatura Deficiente&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto es algo con lo que los programadores siempre luchan cuando se enfrentan a una base de datos existente: entendiendo qué información está almacenada en ella por los nombres de tablas y columnas porque a menudo no hay otra manera.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El nombre de la tabla debe describir qué entidad contiene y cada nombre de columna debe describir qué parte de la información representa. Esto es fácil, pero comienza a ser complicado cuando las tablas tienen que relacionarse entre sí. Los nombres comienzan a ensuciarse y, lo que es peor, si hay convenciones de nombres confusas con normas ilógicas (como, por ejemplo, “el nombre de la columna debe tener 8 caracteres o menos”). La consecuencia final es que la base de datos se vuelve ilegible.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por lo tanto, una&amp;nbsp;&lt;a href=&quot;https://www.codeproject.com/articles/196035/database-naming-conventions&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;convención de nomenclatura&lt;/a&gt;&amp;nbsp;siempre es necesaria si se espera que la base de datos perdure y evolucione con la aplicación que apoya y aquí hay algunas pautas para establecer una versión concisa, simple y legible:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin limitaciones en el tamaño del nombre de tabla o columna. Es mejor tener un nombre descriptivo que un acrónimo que nadie recuerde o entienda.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los nombres que son iguales tienen el mismo significado. Evita tener campos que tengan el mismo nombre pero con diferentes tipos o significados; esto será confuso tarde o temprano.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A menos que sea necesario, no seas redundante. Por ejemplo, en la tabla “Artículo”, no es necesario tener columnas como “Nombre del elemento”, “Precio del artículo” o nombres similares; “Nombre” y “Precio” son suficientes.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ten cuidado con las palabras reservadas para el Motor de Base de Datos. Si una columna debe llamarse “Índice”, que es una palabra reservada de SQL, intenta utilizar una diferente como “NúmeroÍndice.”&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si se apega a la regla de la clave primaria simple (autogenerado único entero), asígnale el nombre “Id” en cada tabla.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si se une a otra tabla, define la clave foránea necesaria como un entero, llamado “Id” seguido del nombre de la tabla unida (ej., IdItem).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si se nombran restricciones, usa un prefijo que describa la restricción (por ejemplo, “PK” o “FK”), seguido del nombre de la tabla o tablas involucradas. Por supuesto, el uso de guiones bajos (“_”) con moderación ayuda a que las cosas sean más legibles.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para nombrar índices, usa el prefijo “IDX” seguido del nombre de la tabla y la columna o columnas del índice. Además, usa “ÚNICO” como prefijo o sufijo si el índice es único y subraya cuando sea necesario.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay muchas pautas de nombres de bases de datos en Internet que arrojarán más luz sobre este aspecto tan importante del diseño de la base de datos pero con estos pasos básicos, al menos puedes acceder a una base de datos legible. ¡Lo importante aquí no es el tamaño o la complejidad de las pautas de nomenclatura sino su coherencia al seguirlas!&lt;/div&gt;
&lt;h2 id=&quot;algunas-observaciones-finales&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunas Observaciones Finales&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El diseño de la base de datos es una combinación de conocimiento y experiencia; la industria del software ha evolucionado mucho desde sus inicios. Afortunadamente, hay suficiente conocimiento disponible para ayudar&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/database&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a los diseñadores de bases de datos&lt;/a&gt;&amp;nbsp;a lograr los mejores resultados.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay buenas&amp;nbsp;&lt;a href=&quot;https://www.codeproject.com/Articles/359654/important-database-designing-rules-which-I-fo&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;directrices&lt;/a&gt;&amp;nbsp;en el diseño de base de datos en todo el internet, así como&amp;nbsp;&lt;a href=&quot;https://www.quora.com/What-are-the-common-mistakes-of-database-design-to-avoid&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;malas prácticas&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;https://seniordba.wordpress.com/2015/07/11/common-database-design-mistakes/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;cosas que evitar&lt;/a&gt;&amp;nbsp;en el diseño de la base de datos. Solo elije y mantenlo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Y no lo olvides, es sólo a través de la experimentación, los errores y los éxitos que se aprende así que adelante y comienza ahora.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/resume/fernando-martinez&quot;&gt;Fernando Martinez&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: x-small; letter-spacing: 0.14px;&quot;&gt;Artículo vía: &lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/database/malas-pr%C3%A1cticas-en-el-dise%C3%B1o-de-la-base-de-datos-est%C3%A1s-cometiendo-estos-errores-/es&quot; style=&quot;font-size: small; letter-spacing: 0.14px;&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/3390370804417429013/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/12/malas-practicas-en-el-diseno-de-la-base-de-datos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/3390370804417429013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/3390370804417429013'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/12/malas-practicas-en-el-diseno-de-la-base-de-datos.html' title='Malas Prácticas en el Diseño de la Base de Datos: ¿Estás Cometiendo estos Errores?'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-4400138249651899593</id><published>2017-11-30T07:30:00.000-03:00</published><updated>2017-12-05T14:59:32.434-03:00</updated><title type='text'>Piensa S.M.A.R.T. Para Definir Objetivos Comerciales Para Tu Próximo Proyecto De UX</title><content type='html'>&lt;h3 id=&quot;objetivos-de-negocio-claros-significan-una-ejecucin-precisa-y-eficiente-el-inteligente-el-marco-especfico-medible-procesable-realista-y-basado-en-el-tiempo-puede-ser-una-clave-para-el-xito-de-tu-diseo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Objetivos de negocio claros significan una ejecución precisa y eficiente. El inteligente. El marco (específico, medible, procesable, realista y basado en el tiempo) puede ser una clave para el éxito de tu diseño.&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Muchos diseñadores de UX piensan que su objetivo principal es crear una experiencia de usuario deliciosa o un diseño elegante, pero ese no debería ser el enfoque principal. Los diseñadores necesitan pensar más allá de los simples píxeles. Deben adoptar una perspectiva comercial, pensar estratégicamente, considerar los objetivos principales y diseñar tanto para los usuarios como para los objetivos comerciales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al leer el brief del cliente, a menudo encontramos que los objetivos del negocio y los requisitos no están claramente formulados. O bien obtenemos cosas salidas de&amp;nbsp;&lt;a href=&quot;https://clientsfromhell.net/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Clients from Hell&lt;/a&gt;, sufrimos falta de comunicación o enfrentamos expectativas poco realistas y poco claras. Escuchamos solicitudes vagas, como, “Queremos que un nuevo sitio web atraiga más visitantes” o “Necesitamos una aplicación muy atractiva”. Como resultado, nos cuesta mucho identificar los objetivos primarios del diseño. Es un deber profesional&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/digital&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;del diseñador&lt;/a&gt;&amp;nbsp;evaluar y planificar todas las necesidades del proyecto, así como los resultados esperados.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un gran diseñador de UX es un pensador avanzado que no solo se conforma con ejecutar el diseño, sino que se esfuerza por obtener resultados óptimos. Un gran proyecto de diseño siempre debe comenzar analizando el informe del cliente para encontrar puntos de dolor que potencialmente podrían llevar a todo el proyecto en la dirección equivocada. Y finalmente, ambas partes deben acordar los&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux/10-common-ux-deliverables&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;entregables clave&lt;/a&gt;&amp;nbsp;a lo largo de todo el compromiso.&lt;/div&gt;
&lt;h2 id=&quot;por-qu-el-pensamiento-y-la-planificacin-siempre-deben-venir-antes-del-diseo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Por Qué El Pensamiento Y La Planificación Siempre Deben Venir Antes Del Diseño?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como aprenderemos en este artículo, el framework S.M.A.R.T. evita el desperdicio y maximiza la eficiencia. Los buenos&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores&lt;/a&gt;&amp;nbsp;siempre están orientados a los resultados; aclaran los requisitos y las metas, manejan las expectativas y trazan un plan claro antes de comenzar a diseñar. Es la mejor manera de optimizar sus esfuerzos y asegurarse de que el proyecto se mantenga en buen camino.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hacer preguntas vitales desde el principio y hacer una investigación preliminar son pasos clave en el camino. Por ejemplo, ¿necesitamos&amp;nbsp;&lt;a href=&quot;https://crew.co/how-to-build-an-online-business/website-vs-app/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñar un sitio web o una aplicación móvil?&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es importante pensar de manera proactiva y separar lo bueno de lo imprescindible. Un cliente puede pensar que necesita una aplicación móvil repleta de características complicadas, pero un análisis diligente de los objetivos de negocio podría demostrar que un sitio web simple y receptivo sería suficiente.&lt;/div&gt;
&lt;h2 id=&quot;cmo-pensar-smart-durante-un-proceso-de-diseo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cómo Pensar S.M.A.R.T. Durante un Proceso de Diseño&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En su libro&amp;nbsp;&lt;a href=&quot;https://www.principles.com/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Principios&lt;/a&gt;, Ray Dalio, uno de los inversores y emprendedores más exitosos del mundo, define los principios como “formas de lidiar exitosamente con la realidad para obtener lo que quiero salir de la vida “. Él enfatiza la idea de un enfoque sistemático y medible para casi todo lo que una empresa, equipo o persona aborda en la vida y el trabajo. Los sentimientos intestinales por sí solos pueden obstaculizar una comunicación buena, clara y saludable; por eso los sistemas y los marcos son tan valiosos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para un proyecto de diseño exitoso, sugerimos framework S.M.A.R.T. de referencia. Fue desarrollado por el consultor de negocios&amp;nbsp;&lt;a href=&quot;https://www.projectsmart.co.uk/brief-history-of-smart-goals.php&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;George Doran&lt;/a&gt;&amp;nbsp;en 1981. Pensó que enfocando la atención en lo específico, mensurable, alcanzable, objetivos realistas y oportunos proporciona la disciplina que ayudará a las personas y equipos a mejorar sus posibilidades de éxito.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El inteligente. acrónimo significa: específico, medible, procesable, realista y basado en el tiempo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Exploremos cada aspecto de este marco, y cómo se aplica a los proyectos de diseño.&lt;/div&gt;
&lt;h3 id=&quot;s---specific-especfico&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
S - Specific (Específico)&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hombre que sostiene un arco con el objetivo de un objetivo específico&quot; src=&quot;https://uploads.toptal.io/blog/image/124389/toptal-blog-image-1507780897487-1d45538894739582e370c3603c8f7767.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cada objetivo debe estar claramente definido. Se específico y no dejes espacio para la interpretación engañosa.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos más visitantes” podría significar demasiadas cosas:&lt;/div&gt;
&lt;ol style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El cliente estaría satisfecho con 2,000 visitantes / mes.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El cliente espera más de 30,000 visitantes.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El cliente estaría contento con un aumento del 20%.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No deberíamos tener que jugar un juego de adivinanzas basado en solicitudes vagas. Un objetivo no específico puede llevarnos a un agujero de conejo y causar mucha frustración. Para evitar eso, debemos hacer tantas preguntas como sea necesario hasta que tengamos claridad sobre qué es exactamente lo que se requiere.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por el contrario, “Necesitamos un aumento del 20% en nuestros visitantes mensuales del sitio web” es específico y no deja espacio para la interpretación.&lt;/div&gt;
&lt;h3 id=&quot;m---mensurable-mesurable&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
M - Mensurable (Mesurable)&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Datos web y móviles en un tablero que muestra el número promedio de espectadores diarios&quot; src=&quot;https://uploads.toptal.io/blog/image/124390/toptal-blog-image-1507780917298-a7a9aa61bc20fa8d9577f3608a4aa078.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“Sin datos, eres solo otra persona con una opinión”.&lt;/em&gt;&amp;nbsp;- W. Edwards Deming&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;El diseño no es arte. Las ideas clave deberían informar la información de entrada, y la salida debería ser medible.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos que nuestros usuarios se sientan más felices” es un objetivo hermoso y noble, pero la felicidad es un valor subjetivo que es difícil de medir.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos que nuestros usuarios aumenten sus donaciones en un 30%” es mensurable, porque el cliente puede verificar los montos de donación en un sitio web.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En caso de duda,&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;los diseñadores&lt;/a&gt;&amp;nbsp;deben hacer algunas&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/usability&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;pruebas A/B&lt;/a&gt;&amp;nbsp;para comparar diseños alternativos. soluciones y optimizar el resultado final.&lt;/div&gt;
&lt;h3 id=&quot;a---actionable-accionable&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A - Actionable (Accionable)&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Toro en acción con el objetivo de un hombre&quot; src=&quot;https://uploads.toptal.io/blog/image/124391/toptal-blog-image-1507780926287-7b57ec4aabe066ec77a7239223cde560.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez que tenemos un objetivo claro y mensurable, necesitamos los medios para ejecutarlo correctamente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos que nuestra audiencia lea los artículos de nuestro blog por completo” no es muy procesable, al menos desde una perspectiva de diseño de UX. Podríamos rastrear las páginas vistas y el tiempo invertido en una página determinada, pero no podemos obligar a los usuarios a leer cada palabra. En este caso, sería mejor sugerir contenido y optimización SEO antes de discutir una solución de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos aumentar la participación del usuario en los artículos del blog” es más procesable. Podemos diseñar soluciones para cumplir con ese objetivo: botones para votar el artículo o el autor, formularios para dejar comentarios, una nueva sección de comentarios, etc.&lt;/div&gt;
&lt;h3 id=&quot;r---realistic-realista&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
R - Realistic (Realista)&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hombre que sostiene una luna no realista&quot; src=&quot;https://uploads.toptal.io/blog/image/124392/toptal-blog-image-1507780937583-a7072559d8c042746d360da10e7b66ad.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un objetivo realista debe estar a su alcance, sin apuntar a la luna.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos que cada visitante en nuestro sitio se registre” es un objetivo muy ambicioso. Lo mismo aplica para “Queremos que diseñe un sitio web para que nuestra startup convierta 100.000 visitantes por día”. ¿Tienen una sólida estrategia de marketing? ¿Contrataron a un hacker de crecimiento para ayudarlos a alcanzar una expectativa tan alta?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.toptal.com/designers/ui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los diseñadores&lt;/a&gt;&amp;nbsp;deben tener en cuenta los números y las métricas que esperan los clientes. Por ejemplo, si bien, “esperamos que una tasa de conversión del 10% para este nuevo sitio de comercio electrónico” parezca alcanzable, si tenemos en cuenta que la tasa de conversión promedio para el comercio electrónico es de&amp;nbsp;&lt;a href=&quot;https://www.invespcro.com/blog/the-average-website-conversion-rate-by-industry/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2.95%&lt;/a&gt;, en realidad es bastante ambicioso.&lt;/div&gt;
&lt;h3 id=&quot;t---time-based-basado-en-tiempo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
T - Time-based (Basado en Tiempo)&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Parpadeo del sistema de reloj analógico&quot; src=&quot;https://uploads.toptal.io/blog/image/124393/toptal-blog-image-1507780950384-84c5f8013b7afc0ea08c04c1987e4be8.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El tiempo lo es todo. Vincula todos los objetivos a una unidad de tiempo específica.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos aumentar el tráfico del sitio en un 10%” no tiene un límite de tiempo. Necesitamos saber cuánto tiempo tenemos para lograr ese objetivo. Los números y las proyecciones importan — evaluarlos por adelantado es esencial para manejar las expectativas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Queremos adquirir 1,000 usuarios mensualmente durante los próximos seis meses” es&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;muy específico&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mensurable&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;procesable&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;realista&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;oportuno&lt;/span&gt;. Además, saber cuánto tiempo tenemos que hacer el trabajo que conduce al resultado deseado es esencial. Nos permite ser conscientes de los recursos y las prioridades para mantenernos eficientes a medida que se desarrolla el proyecto.&lt;/div&gt;
&lt;h2 id=&quot;usando-smart-con-clientes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando S.M.A.R.T. con Clientes&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Cliente y diseñador colaborando en un proyecto de diseño&quot; src=&quot;https://uploads.toptal.io/blog/image/124394/toptal-blog-image-1507780958765-4c7080f8d0b347f8e67baa17e5342911.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los diseñadores deben analizar cada informe con sus clientes y conducirlos a una conversación en profundidad sobre cómo traducir las expectativas en objetivos alcanzables. Este es un proceso continuo para construir un fuerte marco de comunicación y confianza en ambos lados.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El enfoque&amp;nbsp;&lt;a href=&quot;https://www.ideou.com/pages/design-thinking&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Pensamiento de diseño de IDEO&lt;/a&gt;&amp;nbsp;explica cómo “pensar como un&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/product-design&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñador&lt;/a&gt;&amp;nbsp;puede transformar la forma en que las organizaciones desarrollan productos, servicios, procesos y estrategias”. Es por eso que la comunicación clara y la empatía son clave para aplicar el framework S.M.A.R.T. junto con el cliente y todos los interesados.&lt;/div&gt;
&lt;h2 id=&quot;usando-smart-con-tu-equipo-de-diseo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando S.M.A.R.T. con tu Equipo de Diseño&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Los diseñadores colaboran en equipo en el tablero de ideas&quot; src=&quot;https://uploads.toptal.io/blog/image/124395/toptal-blog-image-1507780966640-e07f66f8660616d15b0d866f7036058d.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El framework S.M.A.R.T. es para los diseñadores lo que es un plano para los arquitectos. Estos últimos no comienzan a construir una casa sin una evaluación clara del campo y consideraciones de diseño. Para alcanzar los objetivos comerciales clave, los equipos de diseño deberían alinearse detrás de los objetivos y los medios comunes -más allá de su próxima oportunidad de Dribbble- donde el diseño resuelve el problema tangible tanto para el cliente como para el usuario final.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En la práctica, los objetivos de SMART se pueden enmarcar como&amp;nbsp;&lt;a href=&quot;https://www.mountaingoatsoftware.com/agile/user-stories&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;historias de usuario&lt;/a&gt;&amp;nbsp;o ser incluso más específicos con&amp;nbsp;&lt;a href=&quot;https://blog.intercom.com/using-job-stories-design-features-ui-ux/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;historias de trabajo&lt;/a&gt;&amp;nbsp;como explica Alan Klement. “Como usuario, quiero ser feliz” no es así S.M.A.R.T. Por el contrario, “como usuario, quiero buscar el contenido de un libro y filtrar mis resultados a través de categorías y etiquetas” es muy específico y procesable, y es un gran ejemplo de S.M.A.R.T. objetivo.&lt;/div&gt;
&lt;h2 id=&quot;ms-all-de-smart&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Más allá de S.M.A.R.T.&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El&amp;nbsp;&lt;a href=&quot;http://www.gv.com/sprint/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Google Design Sprint&lt;/a&gt;&amp;nbsp;es una gran demostración de lo valioso que es usar un “proceso de prueba de batalla” cuando se diseña en un equipo “para responder preguntas comerciales críticas a través de diseñar, crear prototipos y probar ideas con los clientes “.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si el proyecto incluye el enfoque y el desarrollo de productos digitales, te sugerimos que eches un vistazo a esta&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/agile/ultimate-introduction-to-agile-project-management&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;introducción a la gestión de proyectos Agile&lt;/a&gt;&amp;nbsp;desde Paul Barnes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por: &lt;a href=&quot;https://www.toptal.com/designers/resume/matteo-di-pascale&quot;&gt;Mateo Di Pascale&lt;/a&gt;&lt;br /&gt;
Artículo vía: &lt;a href=&quot;https://www.toptal.com/designers/ux/piensa-s-m-a-r-t-para-definir-objetivos-comerciales-para-tu-pr%C3%B3ximo-proyecto-de-ux/es&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/4400138249651899593/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/piensa-smart-para-definir-objetivos-comerciales-para-tu-proximo-proyecto-de-ux.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4400138249651899593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4400138249651899593'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/piensa-smart-para-definir-objetivos-comerciales-para-tu-proximo-proyecto-de-ux.html' title='Piensa S.M.A.R.T. Para Definir Objetivos Comerciales Para Tu Próximo Proyecto De UX'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-48672814226034365</id><published>2017-11-23T07:30:00.000-03:00</published><updated>2017-11-23T13:14:03.660-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BugBounty"/><category scheme="http://www.blogger.com/atom/ns#" term="Business"/><category scheme="http://www.blogger.com/atom/ns#" term="CyberCrime"/><category scheme="http://www.blogger.com/atom/ns#" term="CyberInsurance"/><category scheme="http://www.blogger.com/atom/ns#" term="CyberSecurity"/><category scheme="http://www.blogger.com/atom/ns#" term="Hacked"/><title type='text'>Ciberseguridad: Lo que Todo CEO y CFO Debe Saber</title><content type='html'>&lt;h2 id=&quot;resumen-ejecutivo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Resumen Ejecutivo&lt;/h2&gt;
&lt;div&gt;
&lt;b style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Costos de Ciberseguridad&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;ul&gt;&lt;span style=&quot;background-color: white; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;
&lt;li&gt;En 2017, el costo promedio de una violación de datos es de 7.35 millones de dólares. Los costos incluyen desde detección, contención y recuperación hasta interrupción del negocio, pérdida de ingresos y daños al equipo. Una infracción cibernética también puede arruinar la reputación de una empresa o la buena voluntad de los clientes.&lt;/li&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: white; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Las empresas con los más altos niveles de innovación empresarial tienen ataques más costosos . La adquisición o desinversión de una empresa puede aumentar el costo del delito cibernético en un 20% mientras que el lanzamiento de una nueva aplicación significativa aumentó el costo en un 18%.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;24% de las infracciones afectó organizaciones financieras, seguidas de la salud y el sector público.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;El costo para las empresas financieras es el más alto de todas las industrias, perdiendo un promedio de 16.5 millones de dólares en 2013.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Las pequeñas empresas están conscientes, pero no están listas&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;En el último año, los piratas informáticos han incumplido la mitad de todas las pequeñas empresas de Estados Unidos. En la encuesta de 2013 del Ponemon Institute, el 75% de los encuestados no tenía un plan formal de respuesta a incidentes de ciberseguridad. El 66% de los encuestados no confiaban en la capacidad de su organización para recuperarse de un ataque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Una encuesta de 2017 de la empresa de ciberseguridad Manta indicó que una de cada tres pequeñas empresas no tiene las herramientas para protegerse.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;En 2013, el 88% de los ataques iniciados contra las compañías de FS tienen éxito en menos de un día. Sin embargo, solo el 21% de estos se descubren en un día y en el período posterior al descubrimiento, solo el 40% de ellos se restauran en un plazo de un día.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Ataques de Alto Perfil en Empresas Financieras&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Ataque Contra Seis Bancos Estadounidenses (2012):Banco de América, JPMorgan Chase, Citigroup, el Banco de EE.UU., Wells Fargo y PNC fueron objetivos en una ola de ataques computarizados por un grupo que decía tener ataduras del Medio Oriente. Estos eran ataques DDoS, donde los hackers sobrecargaron tanto las páginas web de los bancos hasta hacer que éstas dejaran de funcionar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;JPMorgan (2014): Alrededor de 83 millones de cuentas se vieron bajo peligro por los hackers. Irónicamente, JPMorgan gasta 250 millones de dólares en seguridad de computadoras al año. La fuente de la brecha fue que basic: El banco no empleó una autenticación de doble factor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;SWIFT (2016): La Sociedad para las Telecomunicaciones Financieras Interbancarias Mundiales (*SWIFT*), un consorcio internacional de más de 11,000 bancos que facilitan las transferencias transfronterizas, fue hackeada. El Bangladesh Bank, uno de los usuarios de la red *SWIFT*, fue hackeado por la cantidad de 81 millones de dólares.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;Prevención y Soluciones de Ciberseguridad&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Inteligencia en Tiempo Real. Cuanto más tiempo lleve identificar un truco, mucho más será el costo de sus consecuencias. Con solo 60 segundos de notificación de un compromiso, los costos resultantes podrían ser reducidos al 40%.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Ciberseguro. Las aseguradoras generalmente limitan su capacidad a 5 y 100 millones por cliente. Para Octubre de 2016, sólo el 29% de los negocios de Estados Unidos había comprado un ciberseguro. Sin embargo, se estima que el mercado general de ciberseguros será de 20 billones de dólares para el 2025, subiendo de 3.25 billones de dólares hoy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Programas de recompensas *Bug Bounty*. Las organizaciones pagan a personas ajenas (&quot; hackers amistosos&quot;) para notificarles sobre fallas de seguridad. Las compañías que van desde Google y Dropbox hasta AT&amp;amp;T y LinkedIn ya han adoptado esta práctica.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;intro&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Intro&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“Piensa en la [ciberseguridad] más como seguridad y protección en carreteras y automóviles. El automóvil no ha cambiado realmente en los últimos 30 años, pero tiene mucha seguridad incorporada y no es nada atractivo hasta el momento en que te salva la vida. Tienes partes ocultas – bolsas de aire – y pedacitos que están ahí para recordarte que estés a salvo como cinturones de seguridad… Parte de esto se trata de buen comportamiento y buena actitud, parte de la seguridad física para recordarte que existe un riesgo y parte de ella se prepara para salvarte.”&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
– Sian John, Estratega Senior de Ciberseguridad en Symantec&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo admitiremos. La ciberseguridad no es sexy. Sin embargo, en la era digital de la actualidad, la ciberseguridad se ha vuelto cada vez más crítica para las grandes corporaciones y las pequeñas empresas emergentes por igual. Hoy, lo que está en juego es más alto que nunca, como “&lt;a href=&quot;http://fortune.com/2017/06/22/cybersecurity-business-fights-back/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;cada compañía se ha convertido en una compañía de tecnología&lt;/a&gt;.” La tecnología se ha convertido en algo más que un complemento de las operaciones de una empresa, y en muchos casos, los activos que viven en su red&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;son&lt;/em&gt;&amp;nbsp;sus operaciones principales. Esto se ve agravado por el hecho de que los&amp;nbsp;&lt;a href=&quot;http://fortune.com/2017/06/22/cybersecurity-business-fights-back/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;hacks se están volviendo comunes&lt;/a&gt;&amp;nbsp;debido al aumento en el uso de dispositivos móviles e internet de las cosas, así como al creciente ecosistema de ciberdelincuentes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este artículo describe los tipos de ciberdelincuentes, tácticas de cibercrimen y factores contribuyentes. La pieza también incluye soluciones tangibles que las empresas pueden usar para protegerse. Las soluciones incluyen protecciones tecnológicas y componentes humanos. Por ejemplo, el liderazgo debe reconocer la ciberseguridad como un problema comercial estratégico y no solo como un “problema de TI”. Además, algunas de las soluciones más efectivas son bastante básicas, como la educación de los empleados o la autenticación de doble factor para los usuarios.&lt;/div&gt;
&lt;h2 id=&quot;qu-es-un-cibercrimen&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es un cibercrimen?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En pocas palabras, un&amp;nbsp;&lt;a href=&quot;https://us.norton.com/cybercrime-definition&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;cibercrimen&lt;/a&gt;&amp;nbsp;es un crimen con algún tipo de aspecto informático o cibernético. Puede tomar forma en una variedad de formatos y de&amp;nbsp;&lt;a href=&quot;http://www.telegraph.co.uk/news/2017/04/04/six-types-cybercriminals-identified-bae/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;individuos o grupos&lt;/a&gt;&amp;nbsp;con diferentes factores de motivación. Las amenazas cibernéticas son fundamentalmente&amp;nbsp;&lt;a href=&quot;https://www2.deloitte.com/content/dam/Deloitte/za/Documents/risk/ZA_Transforming_Cybersecurity_05122014.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;riesgos asimétricos&lt;/a&gt;&amp;nbsp;donde pequeños grupos de individuos pueden causar cantidades, desproporcionadamente, grandes de daño.&lt;/div&gt;
&lt;h3 id=&quot;categoras-de-ciberdelincuentes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Categorías de Ciberdelincuentes&lt;/h3&gt;
&lt;ol style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Grupos del crimen organizado con motivación financiera:&lt;/span&gt;&amp;nbsp;La mayoría de estos grupos se encuentran en Europa del Este&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los actores del estado nacional:&lt;/span&gt;&amp;nbsp;Personas que trabajan directa o indirectamente para que su gobierno robe información delicada e interrumpa las capacidades de los enemigos. En general, son los atacantes cibernéticos más sofisticados, con&amp;nbsp;&lt;a href=&quot;http://www.wallstreetandtech.com/infrastructure/cybercrime-on-wall-street/d/d-id/1268273&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;30% viniendo de China&lt;/a&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Grupos de activistas o “hacktivistas”:&lt;/span&gt;&amp;nbsp;No suelen robar el dinero. Están promocionando su religión, política o causa; quieren impactar reputaciones o impactar clientes.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Persona con información privilegiada:&lt;/span&gt;&amp;nbsp;Estos son los empleados “&lt;a href=&quot;http://www.telegraph.co.uk/news/2017/04/04/six-types-cybercriminals-identified-bae/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;desilusionados, chantajeados o incluso demasiado serviciales&lt;/a&gt;” que operan desde dentro de una compañía. Sin embargo, no pueden involucrarse en actividades cibercriminales intencionalmente; algunos simplemente pueden tomar una lista de contactos o un documento de diseño sin darse cuenta del daño que podría causar.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La&amp;nbsp;&lt;a href=&quot;http://deloitte.wsj.com/cio/2015/05/12/security-expert-marc-goodman-on-cyber-crime/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;edad promedio&lt;/a&gt;&amp;nbsp;de un cibercriminal es 35 años y el 80% de los piratas informáticos criminales están afiliados con el crimen organizado. En resumen, las personas eligen esto como una profesión.&lt;/div&gt;
&lt;h3 id=&quot;tcticas-cibercriminales&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tácticas Cibercriminales&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los cibercriminales utilizan métodos estáticos y dinámicos para cometer sus crímenes. Vamos a profundizar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica1: Tácticas Utilizadas en Incumplimientos de Data, 2016&quot; src=&quot;https://uploads.toptal.io/blog/image/124149/toptal-blog-image-1504779859662-27c6d2fa34f6c62192352fcffd12f643.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 860px;&quot; /&gt;&lt;/div&gt;
&lt;h4 id=&quot;denegacin-de-servicio-distribuido-ddos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Denegación de Servicio Distribuido (&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DDoS&lt;/em&gt;)&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;Un ataque&amp;nbsp;&lt;/span&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DDoS&lt;/em&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;intenta interrumpir el servicio de una red. Los atacantes envían grandes volúmenes de datos o tráfico a través de la red hasta que se sobrecarga y deja de funcionar. El tráfico entrante que inunda a la víctima proviene de muchas fuentes diferentes, posiblemente cientos de miles. Esto&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.webopedia.com/TERM/D/DDoS_attack.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;hace posible&lt;/a&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;detener el ataque al bloquear una sola dirección IP y hace que sea difícil distinguir el tráfico legítimo del tráfico de ataque.&lt;/span&gt;&lt;/div&gt;
&lt;h4 id=&quot;suplantacin-de-identidad&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Suplantación de Identidad&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A menudo se presenta como una solicitud de datos de un tercero confiable,&amp;nbsp;&lt;a href=&quot;http://www.webopedia.com/TERM/P/phishing.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ataques de suplantación de identidad&lt;/a&gt;se envían por correo electrónico y piden a los usuarios que hagan clic en un enlace e ingresen sus datos personales. A menudo&amp;nbsp;&lt;a href=&quot;https://digitalguardian.com/blog/social-engineering-attacks-common-techniques-how-prevent-attack&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;involucra&lt;/a&gt;&amp;nbsp;manipulación psicológica, invocando la urgencia o el miedo, engañando a personas desprevenidas para que entreguen información confidencial.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay un par de factores relacionados. En primer lugar, los correos electrónicos de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;phishing&lt;/em&gt;&amp;nbsp;se han vuelto sofisticados y con frecuencia se parecen a solicitudes legítimas de información. En segundo lugar, la tecnología de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;phishing&lt;/em&gt;&amp;nbsp;ahora le está dando&amp;nbsp;&lt;a href=&quot;https://www.phoenixs.co.uk/wp-content/uploads/2017/07/Sophos-White-Paper-Dont-take-the-bait-July-17.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;licencia&lt;/a&gt;&amp;nbsp;a los ciberdelincuentes, incluidos los servicios de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;phishing&lt;/em&gt;&amp;nbsp;bajo demanda y kits de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;phishing&lt;/em&gt;&amp;nbsp;listos para usar. Quizás lo más preocupante es el hecho de que los servicios web oscuros han permitido a los cibercriminales refinar sus campañas y habilidades. De hecho, los correos electrónicos de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;phishing&lt;/em&gt;&amp;nbsp;tienen seis veces más probabilidades de ser cliqueados que los correos electrónicos de marketing de consumo habitual.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 2: Cliqueo de Correo Electrónico *Phishing* a través de Tasas&quot; src=&quot;https://uploads.toptal.io/blog/image/124150/toptal-blog-image-1504779871755-ef4a0b82113dab222cd0b3776b6cda0b.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;h4 id=&quot;malware&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Malware&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Malware, abreviación de “&lt;a href=&quot;https://us.norton.com/internetsecurity-malware.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;software maligno&lt;/a&gt;,” está diseñado para obtener acceso o dañar una computadora. El malware es un término general para una serie de ciberamenazas que incluye&amp;nbsp;&lt;a href=&quot;https://prezi.com/pwo-dolg1amd/types-of-attacks/?webgl=0&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Trojanos, virus, y gusanos&lt;/a&gt;. A menudo se introduce en un sistema a través de archivos adjuntos de correo electrónico, descargas de software o vulnerabilidades del sistema operativo.&lt;/div&gt;
&lt;h4 id=&quot;mal-uso-del-privilegio-interno&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mal uso del Privilegio Interno&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras que los infiltrados maliciosos que filtran información a WikiLeaks reciben toda la prensa y la gloria, un&amp;nbsp;&lt;a href=&quot;http://www.verizonenterprise.com/verizon-insights-lab/dbir/2017/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;escenario más común&lt;/a&gt;&amp;nbsp;es que un empleado promedio u oportunista o un consumidor secretamente toma datos confidenciales con la esperanza de cobrar en algún momento (60% de las veces). A veces, los empleados se ponen un poco curiosos y hacen algo de fisgoneo (17%). La información personal y los registros médicos (71%) están destinados a delitos financieros, como el robo de identidad o el fraude en la devolución de impuestos, pero a veces es simplemente por chismes.&lt;/div&gt;
&lt;h4 id=&quot;revisores-de-tarjetas-fsicas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Revisores de Tarjetas Físicas&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estos ataques incluyen&amp;nbsp;&lt;a href=&quot;http://www.verizonenterprise.com/verizon-insights-lab/dbir/2017/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;implantar fisicamente&lt;/a&gt;&amp;nbsp;en un activo que lee los datos de banda magnética de una tarjeta de pago (por ejemplo, cajeros automáticos, bombas de gasolina, terminales TPV). Es relativamente rápido y fácil llevar a cabo un ataque como este, con el potencial de un rendimiento relativamente alto—y también es un tipo de acción popular (8%).&lt;/div&gt;
&lt;h2 id=&quot;consecuencias-y-costos-de-la-ciberseguridad&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Consecuencias y Costos de la Ciberseguridad&lt;/h2&gt;
&lt;h3 id=&quot;costos-a-la-empresa&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Costos a la Empresa&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hace tres años, el Wall Street Journal&amp;nbsp;&lt;a href=&quot;http://www.wsj.com/articles/SB10001424127887324328904578621880966242990&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;estimaba&lt;/a&gt;&amp;nbsp;que el costo del cibercrimen en los Estados Unidos era de 100 billones de dólares. Otros informes estimaron que la cifra era tanto como&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/stevemorgan/2016/01/17/cyber-crime-costs-projected-to-reach-2-trillion-by-2019/#19e6ee6f3a91&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;diez veces más alto&lt;/a&gt;&amp;nbsp;que esto. En 2017, el costo promedio de una violación de datos es de 7.35 millones de dólares, en comparación con 5.85 millones en 2014. Los costos&amp;nbsp;&lt;a href=&quot;https://www.ponemon.org/local/upload/file/2016%20HPE%20CCC%20GLOBAL%20REPORT%20FINAL%203.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;incluyen todo desde&lt;/a&gt;&amp;nbsp;detección, contención y recuperación ante la interrupción del negocio, la pérdida de ingresos y el daño al equipo. Más allá de las preocupaciones monetarias, una brecha cibernética también puede arruinar elementos intangibles, como la reputación de una empresa o la buena voluntad de los clientes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Curiosamente, las empresas con los niveles más altos de innovación empresarial a menudo tienen&amp;nbsp;&lt;a href=&quot;https://www.ibm.com/security/data-breach/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ataques más costosos&lt;/a&gt;. Una “innovación empresarial” podría ser cualquier cosa, desde una adquisición o desinversión hasta la entrada en un nuevo mercado geográfico. Se demostró que una adquisición o desinversión de una empresa aumenta el costo del delito cibernético un&amp;nbsp;&lt;a href=&quot;https://www.ponemon.org/local/upload/file/2016%20HPE%20CCC%20GLOBAL%20REPORT%20FINAL%203.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;20%&lt;/a&gt;&amp;nbsp;mientras que el lanzamiento de una nueva aplicación significativa aumentó el costo un&amp;nbsp;&lt;a href=&quot;https://www.ponemon.org/local/upload/file/2016%20HPE%20CCC%20GLOBAL%20REPORT%20FINAL%203.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;18%&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 3: Costo Promedio por Incumplimiento de Datos, global&quot; src=&quot;https://uploads.toptal.io/blog/image/124151/toptal-blog-image-1504779895942-51dedc80bb37565d31f5a57bc110a9c0.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para las empresas de servicios financieros, los costos posteriores a una violación de la seguridad se pueden atribuir a la interrupción del negocio, la pérdida de información, la pérdida de ingresos y otros costos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 4: Porcentaje del Costo de las Consecuencias Externas&quot; src=&quot;https://uploads.toptal.io/blog/image/124152/toptal-blog-image-1504779906068-d863d4ab3f11679d976d1e4a5e8aa362.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;la-ciberseguridad-se-pronuncia-para-la-industria-de-servicios-financieros&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Ciberseguridad se Pronuncia para la Industria de Servicios Financieros&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La desafortunada verdad es que, aunque ninguna industria es inmune, los problemas de ciberseguridad son particularmente pronunciados para los servicios financieros. De acuerdo con el&amp;nbsp;&lt;a href=&quot;http://www.verizonenterprise.com/verizon-insights-lab/dbir/2017/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Informe de Investigaciones de Violación de Datos de Verizon 2017&lt;/a&gt;, el 24% de las infracciones afectaron a las organizaciones financieras (la industria más importante), seguidas por la atención médica y el sector público. En comparación, en 2012, la industria ocupó el tercer lugar después de las industrias de defensa y servicios públicos y energía. Más allá de la frecuencia, el costo para las empresas financieras es el más alto de todas las industrias, perdiendo un promedio de 16.5 millones en 2013.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 5: Costo Promedio Anualizado por Sector Industrial&quot; src=&quot;https://uploads.toptal.io/blog/image/124153/toptal-blog-image-1504779915360-177ea1454e58ca745058f86a692e1699.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En servicios financieros, el tipo más común de violación cibernética involucró ataques&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DDoS&lt;/em&gt;. Y, como para todos los ataques&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DDoS&lt;/em&gt;, la industria financiera fue golpeada con más fuerza.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 6: Ataques de *DDoS* por Industria&quot; src=&quot;https://uploads.toptal.io/blog/image/124154/toptal-blog-image-1504779924641-3a9a4024258c94950809c3a9bb0ca25b.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;falsos-hackings-de-servicios-financieros&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Falsos Hackings de Servicios Financieros&lt;/h3&gt;
&lt;h4 id=&quot;ataque-contra-seis-bancos-estadounidenses-2012&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ataque Contra Seis Bancos Estadounidenses (2012)&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En 2012, seis importantes bancos estadounidenses (Banco de América, JPMorgan Chase, Citigroup, Banco de Estados Unidos, Wells Fargo y PNC) fueron&amp;nbsp;&lt;a href=&quot;http://www.nytimes.com/2012/10/01/business/cyberattacks-on-6-american-banks-frustrate-customers.html?mcubz=0&amp;amp;auth=login-smartlock&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;objetivos principales en una ola de ataques informáticos&lt;/a&gt;&amp;nbsp;por un grupo que reclama vínculos en Medio Oriente. Los ataques causaron apagones y demoras en Internet en la banca en línea, lo que resultó en clientes frustrados que no podían acceder a sus cuentas o pagar facturas en línea.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estos fueron ataques&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DDoS&lt;/em&gt;, donde los hackers abrumaron los sitios web de los bancos hasta el punto de cierre. Los ataques también utilizaron&amp;nbsp;&lt;a href=&quot;https://us.norton.com/botnet/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;botnets&lt;/em&gt;&lt;/a&gt;, redes de computadoras infectadas que hacen la licitación de criminales. A veces, las&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;botnets&lt;/em&gt;&amp;nbsp;se conocen como “computadoras zombies” que obedecen los comandos de una “&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;botnet principal&lt;/em&gt;”. Desafortunadamente, estos pueden ser&amp;nbsp;&lt;a href=&quot;https://www.symantec.com/connect/blogs/renting-zombie-farm-botnets-and-hacker-economy&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;alquilados&lt;/a&gt;&amp;nbsp;a través de mercados negros o prestados por delincuentes o gobiernos.&lt;/div&gt;
&lt;h4 id=&quot;jpmorgan-2014&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
JPMorgan (2014)&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En el verano de 2014, en la mayor brecha de seguridad de un banco estadounidense hasta la fecha, los nombres, direcciones, números de teléfono y direcciones de correo electrónico de alrededor de&amp;nbsp;&lt;a href=&quot;http://www.reuters.com/article/us-jpmorgan-cybersecurity-idUSKBN0K105R20141223&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;83 millones de cuentas&lt;/a&gt;&amp;nbsp;fueron comprometidos por los piratas informáticos. Irónicamente, JPMorgan gasta alrededor de 250 millones de dólares en seguridad informática cada año. La violación de 2014 no fue el resultado de un esquema sofisticado. El ataque no usó un&amp;nbsp;&lt;a href=&quot;http://www.investopedia.com/terms/z/zero-day-attack.asp&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ataque de día cero&lt;/a&gt;, el nuevo error de software que se vende a millones en el mercado negro. Tampoco utilizó el malware que los piratas informáticos en Corea del Norte emplearon en su&amp;nbsp;&lt;a href=&quot;https://www.washingtonpost.com/world/national-security/hack-at-sony-pictures-appears-linked-to-north-korea/2014/12/03/6c3c7e3e-7b25-11e4-b821-503cc7efed9e_story.html?tid=a_inl&amp;amp;utm_term=.0b8f907f37a2&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ataque cibernético de Sony&lt;/a&gt;. Por el contrario, la fuente del problema era&amp;nbsp;&lt;a href=&quot;https://dealbook.nytimes.com/2014/12/22/entry-point-of-jpmorgan-data-breach-is-identified/?_r=0&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;básico&lt;/a&gt;: El banco no empleó una&amp;nbsp;&lt;a href=&quot;https://www.securenvoy.com/two-factor-authentication/what-is-2fa.shtm&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;autenticación de doble factor&lt;/a&gt;, que es una capa adicional de seguridad cuando los usuarios inician sesión para acceder a los datos o a una aplicación. El equipo de seguridad de JPMorgan se olvidó de actualizar uno de sus servidores de red con el doble sistema de contraseña—eso es todo lo necesario.&lt;/div&gt;
&lt;h4 id=&quot;sistema-de-pago-swift-2016&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sistema de Pago SWIFT (2016)&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En febrero de 2016, la Sociedad para las Telecomunicaciones Financieras Interbancarias Mundiales (SWIFT), un consorcio internacional de más de 11,000 bancos que facilita las transferencias transfronterizas, fue hackeada. El Bangladesh Bank, un usuario de la red SWIFT, fue hackeado por la cantidad de&amp;nbsp;&lt;a href=&quot;http://www.reuters.com/article/us-usa-cyber-swift-exclusive/exclusive-swift-confirms-new-cyber-thefts-hacking-tactics-idUSKBN1412NT&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;81 millones de dólares&lt;/a&gt;. Solo una pequeña porción se recuperó antes de que el Banco de la Reserva Federal de Nueva York bloqueara&amp;nbsp;&lt;a href=&quot;https://www.cnbc.com/2017/05/03/a-key-player-in-finance-is-trying-to-stop-another-80-million-cyber-attack-on-a-central-bank.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;30 transacciones más&lt;/a&gt;, eso podría haber transferido 850 millones de dólares adicionales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estos ataques muestran que&amp;nbsp;&lt;a href=&quot;https://www.ft.com/content/44340cda-4ff5-11e6-8172-e39ecd3b86fc&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;las redes de pago son tan confiables como su enlace más débil&lt;/a&gt;. Muchos en la industria no fueron sorprendidos por el ataque.&amp;nbsp;&lt;a href=&quot;https://www.ft.com/content/44340cda-4ff5-11e6-8172-e39ecd3b86fc&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;De acuerdo con Justin Clarke-Salt&lt;/a&gt;, cofundador de Gotham Digital Science, una compañía de ciberseguridad, los ataques explotaron una debilidad en el sistema: que no todas las instituciones protegen el acceso a SWIFT de la misma manera. Después de todo, “los atacantes a menudo atacan a personas que son más fáciles de atacar… Tan lejos de lo que sabemos que se ha informado públicamente, se han dirigido en gran medida a instituciones financieras más pequeñas. Esto es probablemente porque tienen controles menos sofisticados”.&lt;/div&gt;
&lt;h3 id=&quot;son-pequeas-o-grandes-las-empresas-ms-vulnerables&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Son Pequeñas o Grandes las Empresas más Vulnerables?&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque las noticias a menudo cubren los ataques a las corporaciones más grandes (&lt;a href=&quot;http://www.foxbusiness.com/markets/2017/05/24/target-to-pay-18-5m-to-settle-hacking-probe.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Target&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.nytimes.com/2017/03/15/technology/yahoo-hack-indictment.html?mcubz=0&amp;amp;_r=0&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Yahoo&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.wsj.com/articles/home-depot-hackers-used-password-stolen-from-vendor-1415309282&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Home Depot&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://fortune.com/sony-hack-part-1/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Sony&lt;/a&gt;), las pequeñas empresas no_son_inmunes. En los últimos 12 meses, los piratas informáticos han violado la mitad de todas las pequeñas empresas en los Estados Unidos, de acuerdo con el&amp;nbsp;&lt;a href=&quot;https://signup.keepersecurity.com/state-of-smb-cybersecurity-report/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Informe sobre Ciberseguridad del Estado de SMB 2016&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por un lado, algunos argumentan que las empresas más pequeñas pueden no ser capaces de recuperarse de un ciberataque**. **&lt;a href=&quot;https://www.theguardian.com/technology/2014/may/07/cybersecurity-business-pwc-symantec-interbrand&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Según Sian John&lt;/a&gt;, estratega senior de seguridad cibernética en Symantec, las empresas golpearon con una experiencia de seguridad un “golpe masivo de reputación y financiero” para las empresas en el año posterior, antes de volver a la normalidad. Ella cuestionó: “Si eres una empresa más pequeña, ¿puedes sobrevivir a ese chapuzón?”&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por otro lado, otros argumentan que las pequeñas empresas tienen una ventaja: “Una gran empresa es más vulnerable que una pequeña empresa: tienen grandes conjuntos de datos y cientos de personas tienen que tener acceso … si estás en el extremo más pequeño de la escala, ser inteligente con respecto a los procesos de negocio y comprender dónde podrían explotarse esos procesos comerciales es más fácil que para una gran organización,”&amp;nbsp;&lt;a href=&quot;https://www.theguardian.com/technology/2014/may/07/cybersecurity-business-pwc-symantec-interbrand&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;declaró Richard Horne&lt;/a&gt;, socio en PricewaterhouseCoopers.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 id=&quot;desafos-de-ciberseguridad&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desafíos de Ciberseguridad&lt;/h2&gt;
&lt;h3 id=&quot;factores-que-contribuyen-al-aumento-en-el-cibercrimen&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Factores que Contribuyen al Aumento en el Cibercrimen&lt;/h3&gt;
&lt;h4 id=&quot;ha-surgido-una-camada-corporativa-de-ciberdelincuentes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ha Surgido una Camada “Corporativa” de Ciberdelincuentes&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los ciberdelincuentes están adoptando las mejores prácticas corporativas para aumentar la eficacia de sus ataques. Algunos de los delincuentes más emprendedores están vendiendo o licenciando herramientas de piratería para delincuentes menos sofisticados. Por ejemplo, los delincuentes profesionales han estado&amp;nbsp;&lt;a href=&quot;https://www.scmagazineuk.com/cyber-criminals-becoming-increasingly-professional/article/531709/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;vendiendo tecnología de día cero&lt;/a&gt;&amp;nbsp;a los delincuentes en el mercado abierto, donde rápidamente se convierten en productos básicos. Las pandillas también ofrecen&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/forbes/welcome/?toURL=https://www.forbes.com/sites/forbestechcouncil/2017/03/17/ransomware-as-a-service-the-next-great-cyber-threat/&amp;amp;refURL=https://www.google.com/&amp;amp;referrer=https://www.google.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ransomware&lt;/em&gt;&amp;nbsp;como servicio&lt;/a&gt;, el cual congela los archivos de la computadora hasta que la víctima cumple con las demandas monetarias, y luego&amp;nbsp;&lt;a href=&quot;https://www.symantec.com/content/dam/symantec/docs/reports/istr-21-2016-en.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;toma una parte&lt;/a&gt;&amp;nbsp;del dinero por proporcionar la licencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora hay un ecosistema completo de recursos para que los ciberdelincuentes aprovechen. “Los grupos avanzados de ataque criminal ahora se hacen eco de los conjuntos de habilidades de los atacantes del estado-nación. Tienen amplios recursos y un personal técnico altamente capacitado que opera con tal eficiencia que mantienen un horario comercial normal e incluso toman los fines de semana y las vacaciones… incluso están viendo atacantes criminales de bajo nivel crear operaciones de call center para aumentar el impacto de sus estafas,”&amp;nbsp;&lt;a href=&quot;https://www.scmagazineuk.com/cyber-criminals-becoming-increasingly-professional/article/531709/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;dijo Kevin Haley&lt;/a&gt;, director de Symantec.&lt;/div&gt;
&lt;h4 id=&quot;seguridad-de-los-proveedores-de-terceros&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Seguridad de los Proveedores de Terceros&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si un tercero es pirateado, su empresa corre el riesgo de&amp;nbsp;&lt;a href=&quot;http://www.securitymagazine.com/articles/87025-steps-to-mitigating-third-party-vendor-cybersecurity-threats&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;perder datos de negocios&lt;/a&gt;&amp;nbsp;o comprometer la información del empleado. Por ejemplo, la brecha de datos de Target en 2013 que comprometió&amp;nbsp;&lt;a href=&quot;http://www.securitymagazine.com/articles/85181-target-traces-security-breach-to-stolen-vendor-credentials&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;40 millones&lt;/a&gt;&amp;nbsp;de cuentas de los clientes, fueron el resultado del robo de las credenciales de la red de un proveedor externo de calefacción y aire acondicionado. Un&amp;nbsp;&lt;a href=&quot;http://www.computerweekly.com/news/2240178104/Bad-outsourcing-decisions-cause-63-of-data-breaches&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;estudio de 2013&lt;/a&gt;&amp;nbsp;indicó que el 63% de las investigaciones de violación de datos de ese año estaban vinculadas a un componente de terceros.&lt;/div&gt;
&lt;h4 id=&quot;mayor-uso-de-tecnologas-mviles-por-parte-de-los-clientes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mayor Uso de Tecnologías Móviles por Parte de los Clientes&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Debido a un número creciente de objetivos en línea, la piratería se ha vuelto más fácil que nunca. En la banca de consumo, el uso de dispositivos móviles y aplicaciones se ha disparado. De acuerdo a un&amp;nbsp;&lt;a href=&quot;http://www.bain.com/publications/articles/customer-loyalty-in-retail-banking-2014-global.aspx&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;estudio de 2014 de Bain &amp;amp; Company&lt;/a&gt;, el móvil es el canal bancario más utilizado en 13 de 22 países y comprende el 30% de todas las interacciones a nivel mundial. Además, los consumidores han adoptado&amp;nbsp;&lt;a href=&quot;https://www.pwc.com/gx/en/consulting-services/information-security-survey/assets/pwc-gsiss-2016-financial-services.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;sistemas de pago móvil&lt;/a&gt;. Para los bancos que compiten con nuevas empresas de Fintech, la conveniencia del cliente seguirá siendo importante. Puede que&amp;nbsp;&lt;a href=&quot;https://www.ft.com/content/44340cda-4ff5-11e6-8172-e39ecd3b86fc&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;tengan que analizar&lt;/a&gt;&amp;nbsp;las posibles pérdidas por fraude con pérdidas derivadas de una experiencia de usuario más inconveniente. Algunas instituciones están utilizando la autenticación avanzada para enfrentar estos riesgos de seguridad adicionales, lo que permite a los clientes acceder a sus cuentas a través de&amp;nbsp;&lt;a href=&quot;https://www.maparesearch.com/growing-demand-for-biometric-security-in-banking/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;voz y reconocimiento facial&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h4 id=&quot;proliferacin-de-internet-de-las-cosas-iot&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Proliferación de Internet de las Cosas (IoT)&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Internet de las Cosas (IoT) está dedicado a la idea de que una amplia gama de dispositivos, incluidos electrodomésticos, vehículos y edificios, se pueden interconectar. Por ejemplo, si tu alarma suena a las 7:00 a.m., podría&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/jacobmorgan/2014/05/13/simple-explanation-internet-things-that-anyone-can-understand/#70b87f001d09&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;notificar automáticamente a tu cafetera&lt;/a&gt;&amp;nbsp;para comenzar a preparar café para ti.&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;IoT&lt;/em&gt;&amp;nbsp;gira en torno a la comunicación máquina a máquina; es móvil, virtual y ofrece conexiones instantáneas. Actualmente hay más de mil millones de dispositivos de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;IoT&lt;/em&gt;&amp;nbsp;en uso, se espera que el número sea&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/christopherskroupa/2017/04/19/the-cost-of-cyber-breach-how-much-your-company-should-budget/#26f9154fce74&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;más de 50 billones&lt;/a&gt;&amp;nbsp;para el 2020. El problema es que muchos dispositivos inteligentes más baratos a menudo&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/haroldstark/2017/08/20/a-bipartisan-bill-to-strengthen-cybersecurity-for-the-internet-of-things/#25295b095a5f&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;carecen de la infraestructura de seguridad adecuada&lt;/a&gt;. Cuando cada tecnología tiene un alto riesgo, el riesgo crece exponencialmente cuando se combina.&lt;/div&gt;
&lt;h3 id=&quot;conciencia-de-ciberseguridad-vs-disposicin-para-dirigirse&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Conciencia de Ciberseguridad vs. Disposición para Dirigirse&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de los titulares sobre seguridad cibernética y sus amenazas, sigue habiendo una brecha entre la conciencia de las empresas y su disposición a abordarla. En el último año, los piratas informáticos han infringido&amp;nbsp;&lt;a href=&quot;https://signup.keepersecurity.com/state-of-smb-cybersecurity-report/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;la mitad de todas las pequeñas empresas de Estados Unidos&lt;/a&gt;. En la encuesta de 2013 del Ponemon Institute, el 75% de los encuestados indicaron que no tenían un plan formal de respuesta a incidentes de ciberseguridad.&amp;nbsp;&lt;a href=&quot;http://www.techrepublic.com/article/66-of-organizations-wont-recover-after-cyberattack-study-says/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;66% de los encuestados&lt;/a&gt;&amp;nbsp;no confiaban en la capacidad de su organización para recuperarse de un ataque. Aún más,&amp;nbsp;&lt;a href=&quot;http://www.manta.com/resources/small-business-trends/small-business-owners-protecting-cyber-attack/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;una encuesta de 2017&lt;/a&gt;&amp;nbsp;de la empresa de ciberseguridad Manta indicó que una de cada tres pequeñas empresas no tiene las herramientas para protegerse.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tácticamente hablando, las compañías de servicios financieros tienen mucho que mejorar en términos de detección y respuesta a los ataques. En 2013,&amp;nbsp;&lt;a href=&quot;https://www2.deloitte.com/content/dam/Deloitte/za/Documents/risk/ZA_Transforming_Cybersecurity_05122014.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;88% de los ataques&lt;/a&gt;&amp;nbsp;iniciado contra las compañías de FS tienen éxito en menos de un día. Sin embargo, solo el 21% de estos se descubren en un día y en el período posterior al descubrimiento, solo el 40% de ellos se restauran en un plazo de un día.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Figura 1: El Tiempo de Respuesta de las Empresas de Servicios Financieros Globales a los Ataques Indica Brechas Significativas en la Preparación&quot; src=&quot;https://uploads.toptal.io/blog/image/124155/toptal-blog-image-1504779947141-bf7623a1c05eeeae99bc969c47072a5c.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 860px;&quot; /&gt;&lt;/div&gt;
&lt;h2 id=&quot;las-soluciones-de-seguridad-ciberntica-requieren-un-enfoque-multifactico&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las Soluciones de Seguridad Cibernética Requieren un Enfoque Multifacético&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No existe una solución “única para todos” para la ciberseguridad. Sin embargo, en general las soluciones deben incluir tanto tecnología sofisticada como componentes más “humanos”, como la capacitación de los empleados y la priorización en la sala de juntas.&lt;/div&gt;
&lt;h3 id=&quot;inteligencia-accionable-contra-amenazas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Inteligencia Accionable Contra Amenazas&lt;/h3&gt;
&lt;h4 id=&quot;inteligencia-en-tiempo-real&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Inteligencia en Tiempo Real:&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La inteligencia en tiempo real es una poderosa herramienta para prevenir y contener ataques cibernéticos. Cuanto más tiempo lleve identificar un truco,&amp;nbsp;&lt;a href=&quot;https://ig.ft.com/sites/special-reports/cyber-attacks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;más costosas&lt;/a&gt;&amp;nbsp;sus consecuencias. Un&amp;nbsp;&lt;a href=&quot;http://www.ten-inc.com/presentations/Norse-Ponemon-Report.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;estudio de 2013&lt;/a&gt;&amp;nbsp;por el Ponemon Institute reveló que los ejecutivos de TI creen que con menos de 10 minutos de notificación previa de una violación de seguridad, es tiempo suficiente para desactivar la amenaza. Con solo 60 segundos de notificación de un compromiso, los costos resultantes podrían ser&amp;nbsp;&lt;a href=&quot;http://www.ten-inc.com/presentations/Norse-Ponemon-Report.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;reducidos al 40%&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://ig.ft.com/sites/special-reports/cyber-attacks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;De acuerdo con James Hatch&lt;/a&gt;, director de servicios cibernéticos en BAE Systems, “Detectar [un ataque cibernético] desde el principio es la clave… Podría ser la diferencia entre perder el 10% de sus [computadoras] y el 50%”. Lamentablemente, en realidad, en promedio se necesitan empresas&amp;nbsp;&lt;a href=&quot;https://ig.ft.com/sites/special-reports/cyber-attacks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;más de siete meses&lt;/a&gt;&amp;nbsp;para descubrir un ataque malicioso.&lt;/div&gt;
&lt;h4 id=&quot;acciones-complementarias&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Acciones Complementarias:&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las empresas pueden tomar varias medidas tácticas más pequeñas para protegerse. Éstas incluyen:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Promulgando una estrategia de defensa de varias capas.&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;https://ics-cert.us-cert.gov/sites/default/files/recommended_practices/NCCIC_ICS-CERT_Defense_in_Depth_2016_S508C.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Asegúrate de que cubra&lt;/a&gt;&amp;nbsp;toda tu empresa, todos los puntos finales, dispositivos móviles, aplicaciones y datos. Donde sea posible, utiliza el cifrado y la autenticación de dos o tres factores para el acceso a la red y a los datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Realizar una evaluación de proveedor de terceros o crear acuerdos de nivel de servicio con terceros:&lt;/span&gt;Implementa una política de “privilegios mínimos” con respecto a quién y a qué otros pueden acceder. Acostúmbrate a revisar el uso de credenciales con terceros. Incluso podrías dar un paso más con un acuerdo de nivel de servicio (SLA), que&amp;nbsp;&lt;a href=&quot;http://www.securitymagazine.com/articles/87025-steps-to-mitigating-third-party-vendor-cybersecurity-threats&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;contractualmente obliga a los terceros&lt;/a&gt;&amp;nbsp;a cumplir con las políticas de seguridad de tu empresa. Tu SLA debe otorgarle a tu empresa el derecho de auditar el cumplimiento por parte de un tercero.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Datos de Respaldo Continuos.&lt;/span&gt;&amp;nbsp;Esto puede ayudar a&amp;nbsp;&lt;a href=&quot;https://www.wired.com/2016/05/4-ways-protect-ransomware-youre-target/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;salvaguardar contra el ransomware&lt;/a&gt;, que congela los archivos de la computadora hasta que la víctima cumpla con las demandas monetarias. Una copia de seguridad de datos puede ser algo crítico si tus computadoras o servidores se bloquean porque no tendrías que pagar por el acceso a tus datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Parches con Frecuencia.&lt;/span&gt;&amp;nbsp;Un&amp;nbsp;&lt;a href=&quot;https://www.techopedia.com/definition/24537/patch&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;parche&lt;/a&gt;&amp;nbsp;de software es una actualización de código en el software existente. A menudo son soluciones temporales entre lanzamientos completos de software. Un parche puede corregir un error de software, abordar una nueva vulnerabilidad de seguridad, solucionar problemas de estabilidad del software o instalar nuevos controladores.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
** Aplicaciones de software de lista blanca.** La&amp;nbsp;&lt;a href=&quot;http://searchsecurity.techtarget.com/definition/application-whitelisting&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Aplicación lista blanca&lt;/a&gt;&amp;nbsp;evitaría que las computadoras instalen software no aprobado. Esto permite a los administradores tener mucho más control.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;seguro-anti-hacker&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Seguro Anti-hacker&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una tendencia emergente es el seguro anti-hacker, o&amp;nbsp;&lt;a href=&quot;https://www.cbsnews.com/news/wannacry-ransomware-hack-cyber-insurance/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ciberseguro&lt;/a&gt;. Su alcance varía según los proveedores, pero generalmente protege contra las brechas y pérdidas de seguridad. Las aseguradoras generalmente limitan su capacidad a entre&amp;nbsp;&lt;a href=&quot;https://www.google.com/search?q=The+scope+of+cyber+insurance+varies+from+one+provider+to+the+other.+Typically%2C+it+protects+against+data+and+network+security+breaches+and+associated+losses%2C+and+insurers+limit+their+capacity+to+between+%245&amp;amp;oq=The+scope+of+cyber+insurance+varies+from+one+provider+to+the+other.+Typically%2C+it+protects+against+data+and+network+security+breaches+and+associated+losses%2C+and+insurers+limit+their+capacity+to+between+%245&amp;amp;aqs=chrome..69i57.238j0j7&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;5 y 100 millones de dólares por cliente&lt;/a&gt;. A partir de octubre de 2016, sólo&amp;nbsp;&lt;a href=&quot;https://dupress.deloitte.com/dup-us-en/industry/financial-services/demystifying-cybersecurity-insurance.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;29%&lt;/a&gt;&amp;nbsp;de los negocios de Estados Unidos había comprado un ciberseguro. Sin embargo, se estima que el mercado general de ciberseguro será de&amp;nbsp;&lt;a href=&quot;https://www.cbsnews.com/news/wannacry-ransomware-hack-cyber-insurance/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;20 billones en 2025&lt;/a&gt;, de 3,25 billones de dólares en la actualidad. Las aseguradoras son&amp;nbsp;&lt;a href=&quot;https://dupress.deloitte.com/dup-us-en/industry/financial-services/demystifying-cybersecurity-insurance.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;optimistas&lt;/a&gt;, estimando que las primas se triplicarán en los próximos años.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para que una organización determine cuánto seguro cibernético necesita, debería&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/christopherskroupa/2017/04/19/the-cost-of-cyber-breach-how-much-your-company-should-budget/#315ebdb1ce74&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;medir su riesgo cibernético&lt;/a&gt;. Debe comprender cómo sus activos se ven afectados por un ciberataque y cómo priorizarlos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Gráfica 7: Crecimiento Estimado de las Primas Globales del Seguro Cibernético&quot; src=&quot;https://uploads.toptal.io/blog/image/124156/toptal-blog-image-1504779967594-d5046684a93d40fb0bc01f57f7640c79.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;programas-bug-bounty&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Programas&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Bug Bounty&lt;/em&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otra idea nueva en la industria es algo llamado&amp;nbsp;&lt;a href=&quot;https://ig.ft.com/sites/special-reports/cyber-attacks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;programa de bonificación de errores&lt;/a&gt;, donde una organización paga a los de afuera (“&lt;a href=&quot;https://internetbugbounty.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;hackers amistosos&lt;/a&gt;”) para notificarlo de fallas de seguridad.&amp;nbsp;&lt;a href=&quot;https://hackerone.com/bug-bounty-programs&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Empresas que van&lt;/a&gt;&amp;nbsp;de&amp;nbsp;&lt;a href=&quot;http://fortune.com/2017/06/23/google-project-zero-hacker-swat-team/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google&lt;/a&gt;&amp;nbsp;y Dropbox a AT&amp;amp;T y LinkedIn ya han adoptado esta práctica.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Figura 2: Lista de Precios: Bug Bounties&quot; src=&quot;https://uploads.toptal.io/blog/image/124157/toptal-blog-image-1504779977169-1784cdb9d5d9bff3bdcba75648147058.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 860px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;no-olvides-el-componente-humano&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No Olvides el Componente Humano&lt;/h3&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Un “problema IT” se convierte un problema de negocios estratégico.&lt;/span&gt;&amp;nbsp;Para muchos CEO y&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/finance/interim-cfos&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CFO&lt;/a&gt;, hackear puede ser frustrante porque no entienden al enemigo.&amp;nbsp;&lt;a href=&quot;https://www.theguardian.com/technology/2014/may/07/cybersecurity-business-pwc-symantec-interbrand&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;De acuerdo con Richard Anderson&lt;/a&gt;, presidente del Instituto de Administración de Riesgo, “Todavía hay mucha gente sentada a horcajadas sobre compañías más grandes que aún la consideran como algo que los geeks cuidan, en lugar de ser un asunto de negocios”. Sin embargo, como las estadísticas han demostrado que,&amp;nbsp;&lt;a href=&quot;https://www.bloomberg.com/news/articles/2017-05-09/cyber-crime-fears-drive-growing-demand-for-anti-hacker-insurance&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;esto no podría estar más alejado de la realidad&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un&amp;nbsp;&lt;a href=&quot;https://www2.deloitte.com/content/dam/Deloitte/za/Documents/risk/ZA_Transforming_Cybersecurity_05122014.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Papel blanco de Deloitte&lt;/a&gt;&amp;nbsp;sugiere crear un equipo dedicado de administración de amenazas cibernéticas y crear una “cultura consciente del riesgo cibernético”. También se recomienda que las organizaciones designen a un director de seguridad de la información (CISO). Por ejemplo,&amp;nbsp;&lt;a href=&quot;https://ig.ft.com/sites/special-reports/cyber-attacks/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ni JPMorgan ni Target&lt;/a&gt;&amp;nbsp;tenía CISO cuando fueron violadas en 2014 y 2013, respectivamente.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Volver a lo básico: capacitación de empleados.&lt;/span&gt;&amp;nbsp;Las infracciones de datos a menudo son el resultado de las debilidades psicológicas de los humanos. Por lo tanto, es fundamental&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/sites/franksorrentino/2015/10/26/cyber-attacks-5-ways-small-businesses-can-protect-themselves/#474268e83193&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;educar a tus empleados&lt;/a&gt;&amp;nbsp;sobre las señales de advertencia de violaciones de seguridad, prácticas seguras (tener cuidado al abrir archivos adjuntos de correo electrónico, dónde están navegando) y cómo responder a una posible adquisición.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ltimos-pensamientos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Últimos Pensamientos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una refutación común a la creciente atención a los peligros de la seguridad cibernética es:&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“¿Entonces qué?, ¿se supone que debemos dejar de innovar por temor a los ataques?”&lt;/em&gt;&amp;nbsp;La respuesta es, no exactamente. Sin embargo, podría ser útil para las empresas ver la ciberseguridad como&amp;nbsp;&lt;a href=&quot;http://www.sfchronicle.com/business/article/Companies-should-treat-cybersecurity-as-a-matter-12168332.php&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;una cuestión de ética&lt;/a&gt;. Es decir, la ciberseguridad no debería ser simplemente una cuestión de tecnología sino también de moralidad. Después de todo, ¿es ético crear y vender tecnología que deje a los consumidores vulnerables? Con Silicon Valley “una cultura de&amp;nbsp;&lt;a href=&quot;https://www.forbes.com/forbes/welcome/?toURL=https://www.forbes.com/sites/groupthink/2017/06/13/the-case-for-opting-out-of-silicon-valleys-growth-or-die-culture/&amp;amp;refURL=https://www.google.com/&amp;amp;referrer=https://www.google.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;crece o muere&lt;/a&gt;” y, a veces, una cultura miope, es probable que esta actitud sea impopular.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, hay un precedente en otros sectores. Por ejemplo, la American Medical Association y American Bar Association requieren que los profesionales sigan sus respectivos códigos éticos. Los médicos deben comprometerse al&amp;nbsp;&lt;a href=&quot;http://www.pbs.org/wgbh/nova/body/hippocratic-oath-today.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Juramento hipocrático&lt;/a&gt;, uno de los documentos vinculantes más antiguos de la historia, que ordena que los médicos prometan proteger a sus pacientes. Del mismo modo, los abogados siguen unas&amp;nbsp;&lt;a href=&quot;https://www.americanbar.org/groups/professional_responsibility/publications/model_rules_of_professional_conduct/model_rules_of_professional_conduct_table_of_contents.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Reglas Modelo de Conducta Profesional&lt;/a&gt;, donde juran proteger y respetar a sus clientes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todos haríamos bien en recordar que aunque la tecnología puede aparecer y desaparecer, lo correcto y lo incorrecto&amp;nbsp;&lt;a href=&quot;http://www.sfchronicle.com/business/article/Companies-should-treat-cybersecurity-as-a-matter-12168332.php&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;nunca cambia&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;post_key_learnings for-post&quot; style=&quot;background: rgb(245, 247, 250); border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: rgb(207, 217, 232); border-top-style: solid; border-width: 1px 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px -37px 45px; min-height: 0px; min-width: 0px; padding: 35px 37px 20px; vertical-align: baseline;&quot;&gt;
&lt;h2 class=&quot;post_key_learnings-heading&quot; data-disable_middle_content_placement=&quot;true&quot; style=&quot;border: 0px; box-sizing: border-box; line-height: 1.3em; margin: 0px 0px 25px; min-height: 0px; min-width: 0px; padding: 0px; text-transform: uppercase; vertical-align: baseline;&quot;&gt;
UNDERSTANDING THE BASICS&lt;/h2&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;expanded&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-expanded&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-expanded&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is cybersecurity all about?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
Put simply, a cybercrime is a crime with some kind of computer or cyber aspect to it. It can take shape in a variety of formats, and from individuals or groups with different motivating factors. Cyber threats are asymmetrical risks in that a few individuals can cause disproportionately large amounts of damage.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom: none; border-image: initial; border-left: 0px; border-right: 0px; border-top: 0px; box-sizing: border-box; margin: 0px -37px; min-height: 0px; min-width: 0px; padding: 0px 37px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-collapsed is-expanded&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What are the different types of cybercrime?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; height: auto; letter-spacing: 0.14px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
Cybercrime includes 1) DDoS attacks, where attackers overload a network until it&#39;s non-functional; 2) phishing, which are emails asking users to enter their personal data; 3) malware, a host of cyber threats designed to damage computers; and 4) physical card skimmers, which read magnetic stripe data from a card.&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; height: auto; letter-spacing: 0.14px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
Por: Melissa Lin&lt;br /&gt;
Artículo via: &lt;a href=&quot;https://www.toptal.com/finance/finance-directors/ciberseguridad-lo-que-todo-ceo-y-cfo-debe-saber/es&quot;&gt;Toptal&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/48672814226034365/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/ciberseguridad-lo-que-todo-ceo-y-cfo-debe-saber.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/48672814226034365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/48672814226034365'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/ciberseguridad-lo-que-todo-ceo-y-cfo-debe-saber.html' title='Ciberseguridad: Lo que Todo CEO y CFO Debe Saber'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-5614314522069879417</id><published>2017-11-03T07:54:00.000-03:00</published><updated>2017-11-03T14:50:56.214-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IOS"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="UI"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode"/><title type='text'>Cómo Implementar un Diseño de Interfaz de Usuario Perfecto para iOS</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Probablemente hayas escuchado la frase “diseño píxel-perfecto” innumerables veces, sin siquiera considerar lo que significa, o lo que debería significar. En los últimos meses, existe la posibilidad de que hayas oído hablar del declive del concepto de diseño perfecto para píxeles, pero hay un pequeño problema con esas afirmaciones, especialmente cuando se trata del diseño de la interfaz de usuario de iOS.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A saber, la definición de diseño perfecto para píxeles no está tallada en piedra como la mayoría de las pautas de UI de iOS. Las personas lo interpretan de diferentes maneras, de ahí el problema: la perfección del píxel puede parecer inaceptable para algunos, pero otros seguirán usando el principio en los próximos años, aunque con un nombre diferente. Es sobre todo un problema de nomenclatura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Ilustración de portada: Código y UI de iPhone&quot; src=&quot;https://uploads.toptal.io/blog/image/124312/toptal-blog-image-1506597541828-606c03955167a6e493afc0e9be3efcd2.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Qué es el diseño de UI píxel-perfecto?&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como no existe una definición clara de la perfección del píxel, mi comprensión del concepto de diseño perfecto en píxeles es que todo está hecho para maximizar la nitidez y la fidelidad. Una vez que se implementa el diseño, se ve idéntico en cualquier pantalla de iPhone sin artefactos o problemas de ningún tipo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La creación de una interfaz de usuario de aplicación de iOS perfecta para píxeles significa que está creando un diseño con píxeles en mente e implementando exactamente el mismo diseño en la pantalla, hasta cada píxel en el diseño al que se hace referencia, al tiempo que se asegura de que se adapte de forma receptiva a otros dispositivos.&lt;/div&gt;
&lt;h2 id=&quot;pero-por-qu-el-diseo-pxel-perfecto&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pero, ¿Por Qué El Diseño Píxel-Perfecto?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.toptal.com/designers/ui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los Diseñadores de UI&lt;/a&gt;&amp;nbsp;hacen todo lo posible para crear interfaces que sean fáciles de percibir e interactuar. El deber profesional del desarrollador es respetar el trabajo del diseñador e implementar la interfaz exactamente como se entregó.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con aplicaciones que no son perfectas para píxeles, es probable que los usuarios no experimenten ningún problema importante que les impida usar y disfrutar la aplicación, pero las aplicaciones perfectas para píxel definitivamente se ven más nítidas, más limpias y más consistentes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Debido a la naturaleza altamente competitiva de la App Store de Apple, todos los detalles que mejoran la apariencia general y la experiencia del usuario son bienvenidos. Puede ayudar a diferenciar tu aplicación y hacerla más visible, y por lo tanto más rentable.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta guía de diseño de UI de iOS rápida te guiará en el proceso desde la etapa de diseño básico hasta la implementación, desde la perspectiva del diseñador y del desarrollador.&lt;/div&gt;
&lt;h2 id=&quot;creando-un-diseo-de-ui-para-ios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Creando un Diseño de UI para iOS&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Empecemos. Las aplicaciones de píxeles perfectos, obviamente, comienzan como diseños perfectos para píxeles, y todos sabemos de dónde provienen estos días.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Ilustración de portada: herramientas de diseño de UI de iOS&quot; src=&quot;https://uploads.toptal.io/blog/image/124313/toptal-blog-image-1506597608584-fd59723d69dffa0c34af195214379c42.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;herramientas-esenciales-de-diseo-de-ios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Herramientas Esenciales de Diseño de iOS&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Creo que soy acertado al decir que&amp;nbsp;&lt;a href=&quot;https://www.sketchapp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Sketch&lt;/a&gt;&amp;nbsp;se ha convertido en el estándar de facto para los diseñadores de UI/UX móviles y web. Si bien&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux/adobe-xd-vs-sketch-which-tool&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Adobe XD es una alternativa prometedora&lt;/a&gt;, se queda atrás de Sketch en términos de popularidad.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación, elegiremos el tamaño de mesa de trabajo. Hoy en día, tenemos dispositivos iOS con&amp;nbsp;&lt;a href=&quot;https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;diferentes tamaños de pantalla y proporciones&lt;/a&gt;&amp;nbsp;y tenemos que elegir un tamaño para crear nuestro diseño. Gracias a Auto Layout, se adaptará sin problemas a otros tamaños de pantalla. Si es necesario, puedes crear diferentes variaciones de diseño para diferentes&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Clases de Tamaño&lt;/em&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La única pregunta real aquí es:&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Cómo debe el diseñador compartir información sobre la adaptación de diseños para diferentes pantallas con el desarrollador?&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Afortunadamente, no hay necesidad de anotar las especificaciones para cada uno, ya que el&amp;nbsp;&lt;a href=&quot;https://animaapp.github.io/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Complemento de diseño automático para Sketch&lt;/a&gt;&amp;nbsp;se encargará de eso. El diseñador simplemente necesita establecer el diseño automático deseado, exportar a diferentes tamaños de pantalla con un clic, y el desarrollador entenderá cómo colocar restricciones de diseño y asegurarse de que todo se ve bien, ya sea en un iPhone X o en el viejo iPhone 5.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Nota:&lt;/span&gt;&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Desde la versión 44, el equipo de Sketch ha mejorado drásticamente los controles de cambio de tamaño, brindando a los usuarios más poder y control sobre cómo deberían comportarse las capas cuando se cambia el tamaño de sus padres.&lt;/em&gt;&lt;/div&gt;
&lt;h3 id=&quot;configurando-tu-diseo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Configurando tu Diseño&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Eso suena genial, pero todavía no hemos elegido el tamaño que usaremos para crear nuestro diseño. Según&amp;nbsp;&lt;a href=&quot;https://david-smith.org/iosversionstats/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;las estadísticas de iOS de David Smith&lt;/a&gt;, el 57% de todos los usuarios de iPhone dependen de pantallas de 4.7 pulgadas, introducidas en el iPhone 6/6s y posteriormente utilizadas en el iPhone 7 e incluso el iPhone 8 recientemente lanzado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estoy seguro de que ya está familiarizado con las pantallas de 4.7 pulgadas de Apple, pero en caso de que no sea una persona de números, estamos hablando de pantallas de 750x1334 píxeles con 326 píxeles por pulgada (PPI). Esta es la pantalla Retina estándar y en el código tendremos la mitad de la resolución. Por lo tanto, le sugiero que comience con&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;375x667&lt;/span&gt;&amp;nbsp;píxeles.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación, debemos asegurarnos de que nuestro diseño de UI de iOS maximice la nitidez. Para alcanzar este objetivo, debes activar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;pixel fitting&lt;/em&gt;:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Tutorial de diseño de la UI de iOS: Ilustración de ajuste de píxeles&quot; src=&quot;https://uploads.toptal.io/blog/image/124289/toptal-blog-image-1506583995479-88a8cb0b675d2c311d8c4f6b6bed6ffe.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 602px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí hay un ejemplo de un rectángulo simple con y sin ajuste de píxeles:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;iOS UI design tutorial: Pixel fitting on/off example&quot; src=&quot;https://uploads.toptal.io/blog/image/124290/toptal-blog-image-1506584005793-7058868270a89937d85740c9e1b170b1.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 900px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usa&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Round: Full Pixels&lt;/em&gt;&amp;nbsp;cuando edites objetos vectoriales:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Tutorial de diseño de la UI de iOS: edición de objetos vectoriales&quot; src=&quot;https://uploads.toptal.io/blog/image/124291/toptal-blog-image-1506584017314-4ec81472890c48e04e7f5be2fb6555cf.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 587px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Obviamente, estos son solo los conceptos básicos, y para ver de cerca los elementos de UI de iOS con píxeles perfectos en Sketch, debe&amp;nbsp;&lt;a href=&quot;https://www.sketchapp.com/learn/documentation/other/pixel-%20precisi%C3%B3n/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;consulta el tutorial oficial&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Siéntete libre de usar animaciones vectoriales complejas, porque un desarrollador puede jugar fácilmente usando la&amp;nbsp;&lt;a href=&quot;https://github.com/airbnb/lottie-ios&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;biblioteca Lottie&lt;/a&gt;. Puedes reproducir animaciones Adobe After Effects en un dispositivo móvil sin sufrir ningún artefacto de escala. Simplemente proporcione el archivo JSON al desarrollador y listo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usa el perfil de color sRGB tanto como sea posible. Si sRGB no es suficiente en pantallas de gama amplia, deberás proporcionar colores o elementos gráficos (uno sRGB y otro con perfil de color incrustado). La información detallada sobre los perfiles de color está disponible en&amp;nbsp;&lt;a href=&quot;https://developer.apple.com/ios/human-interface-guidelines/visual-design/color/#color-management&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;las pautas de HID de Apple&lt;/a&gt;&amp;nbsp;si lo necesitas.&lt;/div&gt;
&lt;h2 id=&quot;cdigo-personalizado-para-resultados-perfectos-para-pxeles&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Código Personalizado para Resultados Perfectos para Píxeles&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¡Estupendo! Ahora sabemos lo suficiente como para crear un diseño perfecto para píxeles. ¿Cómo lo compartimos con el desarrollador? Obviamente necesitamos llegar a nuestra caja de herramientas.&lt;/div&gt;
&lt;h3 id=&quot;elegir-las-herramientas-correctas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Elegir las Herramientas Correctas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay herramientas increíblemente útiles para compartir el trabajo del diseñador con los desarrolladores:&amp;nbsp;&lt;a href=&quot;https://zeplin.io/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Zeplin&lt;/a&gt;. Simplemente utilízalo y el desarrollador tendrá casi toda la información necesaria para garantizar que tu diseño de interfaz de usuario funcione: recursos gráficos, fuentes y colores utilizados en el diseño, el texto y mucho más. Casi lo único que el diseñador puede necesitar proporcionar en este momento son los archivos de fuentes, en caso de que usen fuentes que no están incluidas en iOS.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otra herramienta genial es&amp;nbsp;&lt;a href=&quot;https://www.paintcodeapp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;PaintCode&lt;/a&gt;, que puede generar código a partir de imágenes vectoriales. PaintCode usa tus rutas SVG y datos de color para generar clases Swift u ObjC. Con PaintCode, puedes usar expresiones, variables, etc. para crear estados pasivos/activos de sus botones, estados arriba/abajo, texto dinámico, animación de variables y mucho más.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Obviamente tendrás que confiar en Xcode y en algunas herramientas de desarrollo de iOS estándar, pero lo veremos más adelante.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es extremadamente útil si tienes que actualizar dinámicamente solo una parte específica de un elemento de diseño, por ejemplo, cambiar el color base de un fondo degradado en el icono de chat. Y, como una ventaja adicional, tu aplicación perderá peso.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ok, el desarrollador finalmente tiene todo lo que necesitan, entonces, ¿cómo implementamos perfectamente el diseño de píxel perfecto (perdón por el juego de palabras)?&lt;/div&gt;
&lt;h3 id=&quot;configuracin-y-sincronizacin-de-tus-herramientas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Configuración y Sincronización de tus Herramientas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con Zeplin, debería obtener casi todo lo que necesitas, siempre que el diseñador lo configure todo correctamente. Si algo se pasa por alto o no está claro, Zeplin ofrece una función de comentarios efectiva, que permite al diseñador y al desarrollador identificar y resolver problemas potenciales rápidamente. Incluso si todo se hace correctamente, los comentarios se pueden utilizar para comentarios y pequeñas mejoras.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, como todos sabemos, las cosas no siempre salen según lo planeado, por lo que a veces el desarrollador tendrá que elegir un color, incluso si el diseñador proporcionó la paleta de colores utilizada en la aplicación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para hacer esto correctamente, necesitas sincronizar sus herramientas:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Establece su perfil de color de pantalla en sRGB: ve a&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Preferencias de sistema - Pantallas - Color&lt;/em&gt;&amp;nbsp;y elija&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;sRGB IEC61966-2.1&lt;/em&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Digital Color Meter&lt;/em&gt;, o cualquier otra herramienta de selección de color, elija mostrar en&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;sRGB&lt;/em&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Verifique que el perfil de color en la paleta de colores Xcode esté configurado en&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Device RGB.&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Tutorial de diseño de UI de iOS: elegir la paleta correcta y el perfil de color&quot; src=&quot;https://uploads.toptal.io/blog/image/124292/toptal-blog-image-1506584034031-6e47fc0e514ecf4ef4926419a34f8e11.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Nota:&lt;/span&gt;&amp;nbsp;_Las imágenes pueden tener un perfil de color incrustado. Si este es el caso, deberás adaptar sus herramientas a este perfil si deseas obtener el color correcto de esta imagen. Afortunadamente, esto debería ser una excepción, y no debería experimentar tales casos con demasiada frecuencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En Xcode 9, recuerde&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Preserve Vector Data&lt;/em&gt;&amp;nbsp;cuando sea necesario. Si bien aumentará el tamaño de la aplicación, esto también te permitirá usar su imagen para cualquier tamaño de pantalla. Sin embargo, en iOS 10 y versiones anteriores del sistema operativo móvil de Apple, las imágenes _ no se ampliarán_ utilizando los datos vectoriales adicionales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En cambio, las versiones anteriores del sistema operativo usarán mecanismos de escalado heredados y le dejarán con una imagen borrosa cuando se escala más allá del tamaño original. Puedes consultar la documentación oficial de Apple para obtener información adicional sobre&amp;nbsp;&lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2017/201/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;este tema en particular&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Tutorial de diseño de la UI de iOS: Ejemplo de escala vectorial&quot; src=&quot;https://uploads.toptal.io/blog/image/124293/toptal-blog-image-1506584059603-4d711a1e7078ea5eb6a52cc9ac5ad330.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 1111px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Finalmente, el desarrollador deberá asegurarse de que los tamaños y distancias coincidan con el diseño original lo más fielmente posible. Si hay información cuestionable en Zeplin, puede medir las distancias entre los diferentes componentes de la UI de iOS con variaciones en las reglas de la pantalla. Uno de ellos es&amp;nbsp;&lt;a href=&quot;http://xscopeapp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;xScope&lt;/a&gt;, una regla en pantalla con muchas características prácticas.&lt;/div&gt;
&lt;h3 id=&quot;traer-tu-diseo-de-ui-de-ios-a-la-vida&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Traer tu diseño de UI de iOS a la vida&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando se trata de implementar el diseño de UI de iOS, hay algunos enfoques para elegir:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/ios/ios-user-interfaces-storyboards-vs-%20nibs-vs-custom-code&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Guión gráfico, XIB y código personalizado&lt;/a&gt;.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Storyboard&lt;/span&gt;&amp;nbsp;- Visualiza las pantallas y la navegación entre ellos, pero no hay opciones para heredar un diseño de un controlador en otro.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;XIBs&lt;/span&gt;&amp;nbsp;- Visualiza una pantalla o su parte, fácil de heredar. Antes de Xcode 9, no había opción de usar guías de diseño superior / inferior, mientras que en Xcode 9 podemos usar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Safe Area&lt;/em&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Código&lt;/span&gt;&amp;nbsp;- Por mucho, la opción más flexible, pero no proporciona visualización inmediata.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para los guiones gráficos, deberás dividir el diseño en flujos, por ejemplo, LoginFlow.storyboard, SettingsFlow.storyboard o NewsFeedFlow.storyboard. De esa forma, mantendrás tus storyboards ligeros.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Agrupa elementos de UI en bloques. Esto simplifica el soporte para todas las restricciones. No seas perezoso y coloca vistas con nombre en orden, ya que aparecen en la pantalla de arriba hacia abajo. Ten en cuenta que la parte inferior se mostrará sobre la superior. Esto te ayudará a encontrar diferentes vistas más rápido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Consulta el siguiente ejemplo para elementos agrupados y no agrupados:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Diseño de UI de iOS: ejemplo de elementos de UI de iOS no agrupados&quot; src=&quot;https://uploads.toptal.io/blog/image/124294/toptal-blog-image-1506584079706-f0273afb0084860f9146b8016c9a5d15.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640.5px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Diseño de UI de iOS: Ejemplo de elementos de UI de iOS agrupados&quot; src=&quot;https://uploads.toptal.io/blog/image/124295/toptal-blog-image-1506584092678-b41281556aaa028b3eb9e068606cc2f0.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640.5px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si tienes varios objetos alineados a la izquierda/derecha, no los alinees con el borde con desplazamiento. El mejor enfoque es alinearse con el elemento anterior o implementar una vista especial&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ffset&lt;/em&gt;&amp;nbsp;con una restricción de ancho. Si necesitas cambiar el desplazamiento en algún momento en el futuro, esto lo hará algo más fácil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para usar colores en IB, puedes preparar una paleta en la parte inferior de Xcode Color Picker.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Diseño de la interfaz de usuario de iOS: cómo preparar manualmente una paleta&quot; src=&quot;https://uploads.toptal.io/blog/image/124296/toptal-blog-image-1506584102792-4be4f4b9c01859181bc1ee07953179a5.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Nota:&lt;/span&gt;&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Si la versión mínima de iOS de su aplicación es 11, puede usar la opción “Colores nombrados” en el Catálogo de elementos.&lt;/em&gt;&lt;/div&gt;
&lt;h2 id=&quot;para-terminar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para terminar&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Eso es. Ahora solo tenemos que enviar el resultado al equipo de control de calidad, verificar que todo esté en orden y ¡voilà! Nuestra aplicación perfecta para píxeles está lista.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El objetivo de este artículo fue proporcionar un ejemplo lineal y simple de diseño de UI de iOS perfecto para píxeles, obteniendo los mejores resultados en el menor tiempo posible. La colaboración entre los diseñadores y desarrolladores de UI no siempre es así de simple y sin fricciones, pero ese es un problema para otro artículo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;blog_author_big_banner is-active&quot; data-ga-action=&quot;ClickedOnHireTheAuthor_bottom&quot; data-ga-label=&quot;pixel-perfect-ios-ui-design&quot; data-view=&quot;content#bottom_banner&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;post_key_learnings for-post&quot; style=&quot;-webkit-text-stroke-width: 0px; background: rgb(245, 247, 250); border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: rgb(207, 217, 232); border-top-style: solid; border-width: 1px 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: 0.14px; margin: 0px -37px 45px; min-height: 0px; min-width: 0px; orphans: 2; padding: 35px 37px 20px; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;h2 class=&quot;post_key_learnings-heading&quot; data-disable_middle_content_placement=&quot;true&quot; style=&quot;border: 0px; box-sizing: border-box; color: #303030; font-size: 1.5em; font-weight: 600; line-height: 1.3em; margin: 0px 0px 25px; min-height: 0px; min-width: 0px; padding: 0px; text-transform: uppercase; vertical-align: baseline;&quot;&gt;
UNDERSTANDING THE BASICS&lt;/h2&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;expanded&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-expanded&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-expanded&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; font-weight: 600; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is &quot;pixel perfect&quot;?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin: 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
Pixel perfect means that a design maximizes sharpness and is implemented to deliver maximum fidelity in the actual product. Creating pixel-perfect apps means you are creating designs that are implemented to look identical on different devices, down to the last pixel.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; font-weight: 600; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
How did the pixel perfect concept emerge?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; margin: 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; font-weight: 600; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Wait, this is 2017, don’t we have tools that take care of this?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; margin: 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom: none; border-image: initial; border-left: 0px; border-right: 0px; border-top: 0px; box-sizing: border-box; margin: 0px -37px; min-height: 0px; min-width: 0px; padding: 0px 37px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_middle_content_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; font-weight: 600; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Is the pixel-perfect approach suitable for all projects?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; margin: 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/resume/roman-stetsenko&quot;&gt;Roman Stetsenko&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Artículo vía:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/mobile/c%C3%B3mo-implementar-un-dise%C3%B1o-de-interfaz-de-usuario-perfecto-para-ios/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/5614314522069879417/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/como-implementar-un-diseno-de-interfaz.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/5614314522069879417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/5614314522069879417'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/11/como-implementar-un-diseno-de-interfaz.html' title='Cómo Implementar un Diseño de Interfaz de Usuario Perfecto para iOS'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-5925922900382579881</id><published>2017-10-24T23:38:00.000-03:00</published><updated>2017-10-24T23:38:00.690-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DesignTrends"/><category scheme="http://www.blogger.com/atom/ns#" term="Future"/><category scheme="http://www.blogger.com/atom/ns#" term="ProductDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="UI"/><category scheme="http://www.blogger.com/atom/ns#" term="UIDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><title type='text'>El Futuro del Diseño UI Sin Botones</title><content type='html'>&lt;h2 id=&quot;qu-son-los-botones-y-realmente-los-necesitamos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué son los Botones y Realmente los Necesitamos?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde el inicio de las&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://en.wikipedia.org/wiki/History_of_the_graphical_user_interface&amp;amp;sa=D&amp;amp;ust=1506490899377000&amp;amp;usg=AFQjCNGf4CgBjvd3DOgYLfj-RF51xLBWjQ&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;interfaces de usuario gráficas&lt;/a&gt;, hemos usado botones. Considera que el GUI original del Xerox PARC tiene 44 años, y aún así nuestras interfaces aún se ven bastante parecidas a eso.Recientemente trace la historia de los estilos de botones creando&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://www.toptal.com/designers/ui/button-design-dribbble-timeline&amp;amp;sa=D&amp;amp;ust=1506490899378000&amp;amp;usg=AFQjCNEusrjkMGrnFadRj6hAZ-tVAMXcGA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;la líneas de tiempo de Dribbble&lt;/a&gt;. Aunque los botones evolucionaron en sintonía con las tendencias actuales y junto con la tecnología, su origen se inspira sin duda en objetos reales del pasado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen escaneada de Sears First Electric Buzzer 1897 Catálogo de otoño&quot; src=&quot;https://uploads.toptal.io/blog/image/124269/toptal-blog-image-1506492522701-5af9724e1a38461d89ea93ff7198db90.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Esquina inferior derecha –&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=http://www.electrachime.net/exhibits-landing-page/sears-doorbell-history/early-doorbells/&amp;amp;sa=D&amp;amp;ust=1506490899379000&amp;amp;usg=AFQjCNFGUHzDqnMJBcOJhIxwNPnR7FYGVA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Sears First Electric Buzzer 1897 Catálogo de Otoño&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Durante más de una década, hemos estado creando dispositivos sin una interfaz física que no dependen del toque humano, pero que pueden ser activados por voz o gesto. ¿Por qué persistimos en la creación de formas con las que interactuar que se basan en los objetos familiares que nos rodean? ¡La forma de un botón digital sigue siendo modelada en las herramientas y los mecanismos que desarrollamos en el siglo XIX!&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hemos creado dispositivos electrónicos completamente nuevos, inteligentes — podemos manejarlos en casi cualquier forma que elijamos, pero por pereza o fuerza de hábito, seguimos obligando a nuestros usuarios a hacer clic en una pequeña área complicada sólo unos pocos píxeles de ancho .&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Es hora de hacer algo al respecto — es hora de pensar sin botones.&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;ui-sin-botones--donde-todo-interacta&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
UI Sin Botones – Donde Todo Interactúa&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una “utopía sin botones”, es un concepto en el que cualquier intento de aferrarse a más de 130 años de la forma en que las cosas siempre se han hecho está completamente destrozado. El futuro es ahora - debemos seguir adelante y despojarnos de las soluciones anticuadas de nuestros predecesores.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Es posible imaginarnos una interfaz completamente libre de botones? ¿Algo tan intuitivo, que sólo con mirarlo, sabrá cómo actuar? Ya no necesita ser sólo en nuestra imaginación — estas interfaces ya existen.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;La app de Microsoft HoloTour en AR&quot; src=&quot;https://uploads.toptal.io/blog/image/124270/toptal-blog-image-1506492937879-71e7b3b7448cc62e8ba1685fd1cec9f6.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 615px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://www.youtube.com/watch?v%3DpLd9WPlaMpY&amp;amp;sa=D&amp;amp;ust=1506490899380000&amp;amp;usg=AFQjCNHEhpIiOZeRK3YN2jKooeZ_rn7yrA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Microsoft HoloLens: HoloTour&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Podemos, de una vez por todas, eliminar el venerado botón? Micrófonos, cámaras, pantallas táctiles, vibraciones, acelerómetros, giroscopios, GPS, realidad ampliada, realidad virtual — la lista continúa — y todo esto manejado desde tu smartphone o PC. Ya no hay ninguna razón para seguir forzando a sus usuarios a presionar ese pequeño rectángulo.&lt;/div&gt;
&lt;h2 id=&quot;eliminemos-los-botones-en-las-uis&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Eliminemos los Botones en las UIs&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Has leído&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://www.toptal.com/designers/ui/type-design&amp;amp;sa=D&amp;amp;ust=1506490899381000&amp;amp;usg=AFQjCNFOPSI1SKCw7tUXoj2kWhepWmWG-Q&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Type Design?&lt;/a&gt;— el diseñador de Toptal&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://www.toptal.com/designers/resume/michael-abehsera&amp;amp;sa=D&amp;amp;ust=1506490899381000&amp;amp;usg=AFQjCNHdRpt5cO5Z6vWm1Saf7GAMTVxEdA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Michael Abehsera&lt;/a&gt;&amp;nbsp;hace las preguntas: ¿dónde están las interfaces desprovistas de cualquier elemento gráfico? ¿Por qué lo único que importa es el contenido? Muchos de ustedes preguntaron: “¿Qué pasa con los botones?” Ya no los necesitamos, vamos a eliminarlos completamente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Aquí hay un par de ideas interesantes:&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Facebook acaba de preguntar, “¿Cuál es tu estado de ánimo?” No hay necesidad de ** presionar un botón ** para contestar — utilizar su voz — sólo decirle que se sienta bien y la cabeza para la playa. A continuación, arrastre el texto que Facebook reconoce de su respuesta a donde desea que aparezca.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Animación de la interfaz de voz&quot; src=&quot;https://uploads.toptal.io/blog/image/124271/toptal-blog-image-1506493027509-8fe9b51fcdc995ca4cc4ebdd70d5bdc8.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Buscar por voz&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/nr9992&amp;amp;sa=D&amp;amp;ust=1506490899382000&amp;amp;usg=AFQjCNEG3BKB7RV41IW6uZryvQzRHnKaJw&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Neel Raj&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Le has puesto ‘me gusta’ un artículo de Medium? Hace un tiempo en&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://medium.com/&amp;amp;sa=D&amp;amp;ust=1506490899382000&amp;amp;usg=AFQjCNGLk_AfSBoprF2Y1LnvsZ5PRLJchQ&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Medium&lt;/a&gt;&amp;nbsp;podrías simplemente “recomendar” un artículo. Hoy hacemos clic en “aplausos”. Sólo “aplaudir”. ¿Qué pasa si no hay necesidad de hacer clic en este pequeño botón extraño, y sólo&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;literalmente aplaudimos&lt;/span&gt;?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hombre aplaudiendo al artículo sobre Medio&quot; src=&quot;https://uploads.toptal.io/blog/image/124272/toptal-blog-image-1506493042234-65ac0481d4db46a7196a8fa865b62920.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Concepto sin botones por&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://www.toptal.com/designers/resume/wojciech-dobry&amp;amp;sa=D&amp;amp;ust=1506490899383000&amp;amp;usg=AFQjCNHKEOclbj0U32rGF_78eKzNOM_Z9Q&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Wojciech Dobry&lt;/a&gt;&amp;nbsp;(...No lo tomes demasiado en serio.)&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué pasa con algunas acciones más complejas? Tal como un pago en una tienda en línea. Arrastrar y soltar un elemento en el carrito de la compra, deslizar para proceder a la comprobación y, a continuación, confirmar con su huella digital. Pan comido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Animación UI&quot; src=&quot;https://uploads.toptal.io/blog/image/124273/toptal-blog-image-1506493082150-6a44294373124fba44cb046806329ac7.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
ASOS - Animacón de añadir al carrito por&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/ZacharyZhao&amp;amp;sa=D&amp;amp;ust=1506490899383000&amp;amp;usg=AFQjCNEAC5zT0EZy8XBAnXkkRqe5Jt0NuA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Zachary Zhao&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;piensa-en-contenido-y-en-toda-la-pantalla&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Piensa en Contenido y en Toda la Pantalla&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comencemos con las superficies que actualmente toca para realizar una acción. Dado que la gran mayoría de las&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://www.toptal.com/designers/ui&amp;amp;sa=D&amp;amp;ust=1506490899384000&amp;amp;usg=AFQjCNG4KU0u_bBgkOcVGH1No1D9fZH1zw&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;interfaces gráficas de usuario modernas&lt;/a&gt;&amp;nbsp;son pantallas de pantalla táctil — a menudo manejado con nuestros pulgares — es lógico que tales interfaces estarán con nosotros durante mucho tiempo. Y definitivamente tendremos esa necesidad irresistible de tocar — el tacto es nuestra sensación más importante después de todo. Tocar la superficie nos da una sensación de acción real, de control. ¿Cómo sería, que en vez de hacer clic en un punto en particular, le enseñáramos a nuestros usuarios a interactuar con la superficie&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;en su totalidad?&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Veamos cómo lo hace Instagram:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Navegación de una Historia de Instagram Instagram Story&quot; src=&quot;https://uploads.toptal.io/blog/image/124274/toptal-blog-image-1506493097753-5d1d3a5b15f2cae6d223306bbaa7dc99.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://www.youtube.com/watch?v%3DoG8P5MZ9_cI&amp;amp;sa=D&amp;amp;ust=1506490899384000&amp;amp;usg=AFQjCNFt6ordekhTziA3hpBQIVkfGE_S_w&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Navegación de una Historia de Instagram&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Alguna vez has visto un botón que te permite navegar por una historia de Instagram y volver a la historia anterior? Probablemente no, porque todo lo que necesita hacer es tocar el borde izquierdo de la pantalla para que esto suceda.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los usuarios han llegado a esperar nuevas formas de interactuar con nuestros productos digitales, ya menudo no implica un botón. Las tarjetas responden en todas sus superficies; haciendo clic en cualquier palabra, esperamos encontrar su definición; al tocar imágenes, esperamos alguna acción. Los usuarios ya están acostumbrados al hecho de que áreas enteras responden al tacto.&lt;/div&gt;
&lt;h3 id=&quot;reconocimiento-de-gestos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Reconocimiento de Gestos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Entendemos muy bien los gestos porque son naturales para nosotros y reflejados en nuestras acciones físicas. En la actualidad, casi todas las aplicaciones las utilizan para acelerar la navegación; podemos doblar una foto en lugar de presionarla como un botón; podemos deslizar para navegar por la galería, o pellizcar para ampliar cualquier contenido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Animación de la interfaz de usuario de dibujo de corazón en la pantalla táctil&quot; src=&quot;https://uploads.toptal.io/blog/image/124275/toptal-blog-image-1506493153970-f73650870b04060b9baaf9b5a0b999c0.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/virgilpana&amp;amp;sa=D&amp;amp;ust=1506490899385000&amp;amp;usg=AFQjCNHDabMCW_RWulb6gnX0KI85T7EnCQ&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Virgil Pana&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;photopair&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Interfaz UI&quot; src=&quot;https://uploads.toptal.io/blog/image/124276/toptal-blog-image-1506493175649-bfff1a88c66a4ef50f3cf1aac5f16f2d.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;img alt=&quot;Interfaz UI&quot; src=&quot;https://uploads.toptal.io/blog/image/124277/toptal-blog-image-1506493201817-2cc7edb49d5147901323b58ca3731a3b.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Interfaces de Usuario por&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/Ramotion&amp;amp;sa=D&amp;amp;ust=1506490899386000&amp;amp;usg=AFQjCNFiO-cP2fST57m6HSiAp2aQ8XkBsA&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ramotion&lt;/a&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/jarekberecki&amp;amp;sa=D&amp;amp;ust=1506490899386000&amp;amp;usg=AFQjCNH_6hAownLQa9Wu81hIxq1zG-JPXg&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Jarek Berecki&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hacemos gestos no sólo en pantallas táctiles planas — los gestos también se realizan en los espacios AR y VR, donde podemos navegar con todo nuestro cuerpo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hombre usando gestos en realidad aumentada&quot; src=&quot;https://uploads.toptal.io/blog/image/124288/toptal-blog-image-1506494182651-094757d049772a9c15315f51d843f996.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://www.youtube.com/watch?v%3DihKUoZxNClA&amp;amp;sa=D&amp;amp;ust=1506490899387000&amp;amp;usg=AFQjCNGlmGoaZ1Hws3OdR8g-TOzqBFz3_A&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Gestures on HoloLens by Microsoft&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;photopair&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Hombre usando el reconocimiento de gestos para controlar IoT&quot; src=&quot;https://uploads.toptal.io/blog/image/124278/toptal-blog-image-1506493266103-fffe29b7796a6ea614b23bc930a461cd.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;img alt=&quot;Hombre usando el reconocimiento de gestos para controlar IoT&quot; src=&quot;https://uploads.toptal.io/blog/image/124279/toptal-blog-image-1506493308580-5167309ed888c5d069d3bc5a18e7f0c1.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://www.youtube.com/watch?v%3DNqdsk4_COdU&amp;amp;sa=D&amp;amp;ust=1506490899387000&amp;amp;usg=AFQjCNGq2yRK1T3A29HTK_Q4WDF0q9uXKw&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Clay VR Gesture Reconocimiento en iPhone&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;interfaces-de-voz&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Interfaces de Voz&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Siri, Cortana, Alexa y Google Assistant están en funcionamiento. Muchos argumentan que las interfaces de voz son el futuro — es difícil no estar de acuerdo como sus usos potenciales son más allá del número. Podemos controlar vehículos, edificios inteligentes y máquinas simplemente hablando con ellos, tal como hablamos con una persona real. Con la inteligencia artificial y la máquina de aprendizaje, las máquinas son ahora capaces de entender nuestro lenguaje con más precisión. Ya no nos limitamos a pronunciar cuidadosamente “hechizos mágicos”; podemos hablar en frases completas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Anuncio de OK Google&quot; src=&quot;https://uploads.toptal.io/blog/image/124280/toptal-blog-image-1506493357383-eaabac6a5476d2799a8c733609da7ec3.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
&lt;a href=&quot;https://www.google.com/url?q=https://www.youtube.com/watch?v%3Dp5DVeDWtA5U&amp;amp;sa=D&amp;amp;ust=1506490899388000&amp;amp;usg=AFQjCNERQ5sDiVTVHaeuJ3cQIDoJkSumog&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ok, Google...&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando el habla, podemos moverse libremente en el mundo de las transferencias de dinero. Actualmente, Siri te permite transferir dinero a través de PayPal a otra persona usando sólo una solicitud rápida: “Siri, envía $ 200 a XYZ mediante PayPal”. No hay botones — la única confirmación y chequeo de seguridad requerido es Touch ID.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Siri utilizado para la transferencia de PayPal en el iPhone&quot; src=&quot;https://uploads.toptal.io/blog/image/124281/toptal-blog-image-1506493378762-dc4b401a1005c4e654aa8864464b2790.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;acciones-fsicas-dispositivos-conectados-y-reconocimiento-de-vdeo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Acciones Físicas, Dispositivos Conectados y Reconocimiento de Vídeo&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Sonríe para pagar? ¡Claro que sí! Alibaba y KFC lanzaron conjuntamente un sistema que le permite pagar simplemente sonriendo a la cámara — sin botones para presionar. El sistema funciona en el reconocimiento facial y ahora está disponible en China.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;El sistema de KFC y Alibaba al sonreír para pagar&quot; src=&quot;https://uploads.toptal.io/blog/image/124282/toptal-blog-image-1506493407393-0ee9ca299c45fb4eeb8b763810e6f973.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
This is just one of the potential uses. Our devices are already equipped with a whole host of sensors, and can monitor your entire body. Nothing is preventing you from using one finger to perform any action on your smartphone.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;iWatch utilizado para desbloquear MacBook Pro&quot; src=&quot;https://uploads.toptal.io/blog/image/124283/toptal-blog-image-1506493476847-b7291f60fd039f00331cfe572f57c694.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 864px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro ejemplo de una acción física que acelerará la desaparición de los botones es simplemente estar cerca del dispositivo. Echemos un vistazo al iWatch, por ejemplo — sólo es necesario conectarlo con tu computadora portátil y esperar para desbloquear tu MacBook. Los dispositivos usables se pueden utilizar para confirmar nuestra identidad, así como predecir inteligentemente nuestras necesidades en función de la ubicación y los datos del sensor. Gracias a ellos, ya podemos evitar el uso de botones en muchas interfaces.&lt;/div&gt;
&lt;div class=&quot;photopair&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Giroscopio utilizado para controlar el dispositivo&quot; src=&quot;https://uploads.toptal.io/blog/image/124284/toptal-blog-image-1506493503037-40d9a16f47f8ee81b9a92cd8625db0cc.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;img alt=&quot;Giroscopio utilizado para controlar el dispositivo&quot; src=&quot;https://uploads.toptal.io/blog/image/124285/toptal-blog-image-1506493535247-14e6d3ca613f73438587e0b09506a6d4.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No olvidemos las tecnologías que han estado ampliamente disponibles durante varios años. Uno es el giroscopio — disponible en casi todos los teléfonos inteligentes, pero rara vez se utiliza en las interfaces. Arriba, puede ver interfaces experimentales creadas por&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/patrykadas&amp;amp;sa=D&amp;amp;ust=1506490899389000&amp;amp;usg=AFQjCNHOYLbZ00enE6JVY_46ukqH5gpw0Q&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Patryk Adaś&lt;/a&gt;.&lt;/div&gt;
&lt;h3 id=&quot;el-futuro-del-diseo-ui&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Futuro del Diseño UI&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con tantas opciones disponibles, ahora es posible olvidarse del uso de botones rectangulares típicos para que los usuarios interactúen. Con la tecnología actual, tenemos la capacidad de crear interfaces completamente nuevas que pueden:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahorre tiempo a los usuarios&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Prevenir errores, resbalones y errores, y&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Compensar cualquier acción accidental&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;photopair&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Conceptos UI&quot; src=&quot;https://uploads.toptal.io/blog/image/124286/toptal-blog-image-1506493564530-6a7a5731118e7a0a144e0ebe5b5ecf63.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;img alt=&quot;Conceptos UI&quot; src=&quot;https://uploads.toptal.io/blog/image/124287/toptal-blog-image-1506493608675-0f3bd1ba5e232e75a617c1f6f04e1915.gif&quot; style=&quot;border: 0px; box-sizing: border-box; display: inline; margin: 0px auto 7px; max-width: 50%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 432px;&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Interfaces conceptuales por&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/Radium&amp;amp;sa=D&amp;amp;ust=1506490899390000&amp;amp;usg=AFQjCNFL8gFImZUC193SDP4wa-SJwtuLZg&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Cosmin Capitan&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?q=https://dribbble.com/Ramotion&amp;amp;sa=D&amp;amp;ust=1506490899390000&amp;amp;usg=AFQjCNF-ryc4a69QD70Ct8v7wccC9EmyYQ&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ramotion&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Ha llegado el momento — la tecnología nos lo está adelantando. Nosotros los diseñadores DEBEMOS perseguirlo… ¡y asegurarnos de ponernos al día!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/resume/wojciech-dobry&quot;&gt;Wojciech Dobry, Poland&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Artículo vía:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ui/el-futuro-del-dise%C3%B1o-ui-sin-botones/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/5925922900382579881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/el-futuro-del-diseno-ui-sin-botones.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/5925922900382579881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/5925922900382579881'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/el-futuro-del-diseno-ui-sin-botones.html' title='El Futuro del Diseño UI Sin Botones'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-1262769866440311835</id><published>2017-10-13T06:37:00.000-03:00</published><updated>2017-10-13T12:32:31.467-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="Bipartite"/><category scheme="http://www.blogger.com/atom/ns#" term="Graph"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Flujo Máximo y el Problema de Asignación Lineal</title><content type='html'>&lt;body&gt;
Aquí hay un problema: Tu empresa asigna a los contratistas para cumplir los contratos. Miras tus listas y decides qué contratistas están disponibles para un contrato de un mes y revisas tus contratos disponibles para ver cuáles son para tareas de un mes de duración. Dado que sabes con qué eficacia cada contratista puede cumplir cada contrato, ¿cómo asignar a los contratistas para maximizar la eficacia general para ese mes?&lt;/body&gt;

&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Este es un ejemplo del problema de asignación, y el problema se puede resolver con el clásico &lt;a href=&quot;https://en.wikipedia.org/wiki/Hungarian_algorithm&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;algoritmo húngaro&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Coincidencia Bipartita&quot; src=&quot;https://uploads.toptal.io/blog/image/124063/toptal-blog-image-1503923204162-cd586549bd0d05652100301c68643b1e.jpg&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El algoritmo húngaro (también conocido como el algoritmo de Kuhn-Munkres) es un algoritmo de tiempo polinomico, el cual maximiza la ponderación de peso en un gráfico bipartito ponderado. Aquí, los contratistas y los contratos pueden ser modelados como un gráfico bipartito, con su efectividad como el peso de los bordes entre el contratista y los nodos de contrato.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En este artículo, aprenderás sobre una implementación del algoritmo húngaro que utiliza el &lt;a href=&quot;https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;algoritmo Edmonds-Karp&lt;/a&gt; para resolver el problema de asignación lineal. También aprenderás cómo el algoritmo de Edmonds-Karp es una ligera modificación del &lt;a href=&quot;https://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Ford-Fulkerson&lt;/a&gt; y la importancia de esta modificación.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;el-problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;el-problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El Problema de Flujo Máximo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El problema de flujo máximo en sí mismo se puede describir informalmente como el problema de mover algo de fluido o gas, a través de una red de tuberías desde una única fuente hasta un único terminal. Esto se hace con la suposición de que la presión en la red es suficiente para asegurar que el fluido o gas no pueda permanecer en cualquier longitud de tubería o instalación de tuberías (los lugares donde se reúnen diferentes longitudes de tubería).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Al realizar ciertos cambios en el gráfico, el problema de asignación puede convertirse en un problema de flujo máximo.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;preliminares&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;preliminares&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Preliminares&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Las ideas necesarias para resolver estos problemas surgen en muchas disciplinas matemáticas y de ingeniería, a menudo conceptos similares son conocidos por diferentes nombres y expresados ​​de diferentes maneras (por ejemplo, matrices de adyacencia y listas de adyacencia). Dado que estas ideas son bastante esotéricas, se hacen elecciones sobre la forma en que estos conceptos se definirán generalmente para cualquier entorno determinado.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Este artículo no asumirá ningún conocimiento previo más allá de una pequeña teoría introductoria de conjuntos.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Las implementaciones en este post representan los problemas como grafos dirigidos (dígrafo).&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;digrafo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;digrafo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Digrafo&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Un &lt;strong&gt;digrafo&lt;/strong&gt; tiene dos &lt;a href=&quot;https://en.wikipedia.org/wiki/Attribute_(computing)&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;atributos&lt;/a&gt;, &lt;strong&gt;setOfNodes&lt;/strong&gt;  y &lt;strong&gt;setOfArcs&lt;/strong&gt;. Ambos de estos atributos son &lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#sets&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;conjuntos&lt;/a&gt; (colecciones desordenadas). En los bloques de código en este post, estoy usando Python &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#frozenset&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;frozenset&lt;/a&gt;, pero ese detalle no es particularmente importante.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;DiGraph = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;DiGraph&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;setOfNodes&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;setOfArcs&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;(Nota: Este y todos los demás códigos de este artículo están escritos en Python 3.6.)&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;nodos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;nodos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Nodos&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Un &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; está compuesto de dos atributos:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;n.uid&lt;/code&gt;: Un &lt;a href=&quot;https://en.wikipedia.org/wiki/Unique_identifier&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;identificador único&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;


    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto significa eso para cualquier de los dos nodos &lt;code&gt;x&lt;/code&gt; y &lt;code&gt;y&lt;/code&gt;,&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;x.uid != y.uid
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;n.datum&lt;/code&gt;: Esto representa cualquier objeto de datos.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Node = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Node&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;uid&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;datum&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;arco&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;arco&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Arco&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; está compuesto de tres atributos:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;a.fromNode&lt;/code&gt;: Éste es un &lt;strong&gt;nodo&lt;/strong&gt;, como lo definimos arriba.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;a.toNode&lt;/code&gt;: Éste es un &lt;strong&gt;nodo&lt;/strong&gt;, como lo definimos arriba.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;a.datum&lt;/code&gt;: Este representa cualquier objeto de data.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Arc = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Arc&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;fromNode&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;toNode&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;datum&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El set de &lt;strong&gt;arcos&lt;/strong&gt; en el &lt;strong&gt;dígrafo&lt;/strong&gt; representa una relación binaria en los &lt;strong&gt;nodos&lt;/strong&gt; en el &lt;strong&gt;dígrafo&lt;/strong&gt;. La existencia del &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; implica que existe una relación entre &lt;code&gt;a.fromNode&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En un gráfico dirigido (en oposición a un gráfico no dirigido), la existencia de una relación entre &lt;code&gt;a.fromNode&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; &lt;strong&gt;no&lt;/strong&gt; implican que una relación similar entre &lt;code&gt;a.toNode&lt;/code&gt; y &lt;code&gt;a.fromNode&lt;/code&gt; existe.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto se debe a que en un gráfico no dirigido, la relación que se expresa no es necesariamente simétrica.&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;dgrafos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;dgrafos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;DíGrafos&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Nodos&lt;/strong&gt; y &lt;strong&gt;arcos&lt;/strong&gt; pueden usarse para definir un &lt;strong&gt;dígrafo&lt;/strong&gt;, pero por conveniencia, en los algoritmos siguientes, se representará un &lt;strong&gt;dígrafo&lt;/strong&gt; usando como un &lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#dictionaries&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;diccionario&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Aquí hay un método que puede convertir la representación gráfica anterior en una representación de diccionario similar a &lt;a href=&quot;https://www.python.org/doc/essays/graphs/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;ésta&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;digraph_to_dict&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   G_as_dict = dict([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.fromNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           pdg(G)
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.toNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           pdg(G)
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       G_as_dict[a.fromNode] = (G_as_dict[a.fromNode].union(frozenset([a]))) &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict) &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; frozenset([a])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.fromNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict:
           G_as_dict[a.toNode] = frozenset([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; G_as_dict
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Y aquí hay otro que lo convierte en un diccionario de diccionarios, otra operación que será útil:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;digraph_to_double_dict&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   G_as_dict = dict([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.fromNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.toNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict):
            G_as_dict[a.fromNode] = dict({a.toNode : frozenset([a])})
       &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict[a.fromNode]):
               G_as_dict[a.fromNode][a.toNode] = frozenset([a])
           &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
               G_as_dict[a.fromNode][a.toNode] = G_as_dict[a.fromNode][a.toNode].union(frozenset([a]))

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.fromNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict:
           G_as_dict[a.toNode] = dict({})
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; G_as_dict
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cuando el artículo habla de un &lt;strong&gt;dígrafo&lt;/strong&gt; como lo representa el diccionario, mencionará  &lt;code&gt;G_as_dict&lt;/code&gt; para hacerle referencia.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;A veces es de ayuda tomar un &lt;strong&gt;nodo&lt;/strong&gt; de un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; hasta su &lt;code&gt;uid&lt;/code&gt; (identificador único):&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;find_node_by_uid&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(find_uid, G)&lt;/span&gt;:&lt;/span&gt;
   nodes = {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; n.uid == find_uid}
   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(len(nodes) != &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;):
       err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;Node with uid {find_uid!s} is not unique.&#39;&lt;/span&gt;.format(**locals())
       &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; nodes.pop()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Al identificar gráficos, a veces las personas usan los términos &lt;strong&gt;nodo&lt;/strong&gt; y vértice para referirse al mismo concepto; esto mismo se dice de los términos &lt;strong&gt;arco&lt;/strong&gt; y borde.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Hay dos representaciones gráficas in Python, &lt;a href=&quot;https://www.python.org/doc/essays/graphs/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;ésta&lt;/a&gt; la cual usa diccionarios y &lt;a href=&quot;https://triangleinequality.wordpress.com/2013/08/21/graphs-as-objects-in-python/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;otra&lt;/a&gt; la cual usa objetos para representar gráficos. La representación en este post se encuentra entre estas dos representaciones comunes.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esta es mi representación de un &lt;strong&gt;dígrafo&lt;/strong&gt;. Hay muchas como ésta, pero ésta es la mía.&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;caminos-y-vas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;caminos-y-vas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Caminos y Vías&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;S_Arcs&lt;/code&gt; sea una &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;secuencia&lt;/a&gt; definitiva (colección ordenada) de &lt;strong&gt;arcos&lt;/strong&gt; en un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; tanto que si &lt;code&gt;a&lt;/code&gt; es cualquier &lt;strong&gt;arco&lt;/strong&gt; en &lt;code&gt;S_Arcs&lt;/code&gt; excepto por el último, y &lt;code&gt;b&lt;/code&gt; sigue a &lt;code&gt;a&lt;/code&gt; en la secuencia, entonces debe haber un &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n = a.fromNode&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; como &lt;code&gt;a.toNode = b.fromNode&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Comenzando desde el primer &lt;strong&gt;arco&lt;/strong&gt; en &lt;code&gt;S_Arcs&lt;/code&gt;, y continuando hasta el último &lt;strong&gt;arco&lt;/strong&gt; en &lt;code&gt;S_Arcs&lt;/code&gt;, recolecta (en el orden encontrado) todos los &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; como los definimos arriba entre cada dos &lt;strong&gt;arcos&lt;/strong&gt; consecutivos en &lt;code&gt;S_Arcs&lt;/code&gt;. Marca la colección ordenada de &lt;strong&gt;nodos&lt;/strong&gt; coleccionados durante esta operación &lt;code&gt;S_{Nodes}&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;path_arcs_to_nodes&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(s_arcs)&lt;/span&gt;:&lt;/span&gt;
   s_nodes = list([])
   arc_it = iter(s_arcs)
   step_count = &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
   last = &lt;span class=&quot;hljs-keyword&quot;&gt;None&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
       at_end = &lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;
       last = a1 = next(arc_it)
       &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; at_end):
           s_nodes += [a1.fromNode]
           last = a2 = next(arc_it)
           step_count += &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a1.toNode != a2.fromNode):
               err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&quot;Error at index {step_count!s} of Arc sequence.&quot;&lt;/span&gt;.format(**locals())
               &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; ValueError(err_msg)
           a1 = a2
   &lt;span class=&quot;hljs-keyword&quot;&gt;except&lt;/span&gt; StopIteration &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; e:
       at_end = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;

   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(last &lt;span class=&quot;hljs-keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;None&lt;/span&gt;):
       s_nodes += [last.toNode]

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; s_nodes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si cualquier &lt;strong&gt;nodo&lt;/strong&gt; aparece más de una vez en la secuencia &lt;code&gt;S_Nodes&lt;/code&gt; entonces llama a &lt;code&gt;S_Arcs&lt;/code&gt; un &lt;a href=&quot;https://en.wikipedia.org/wiki/Glossary_of_graph_theory_terms#walk&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Camino&lt;/a&gt; por &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;De otro modo, llama &lt;code&gt;S_Arcs&lt;/code&gt; una &lt;a href=&quot;https://en.wikipedia.org/wiki/Glossary_of_graph_theory_terms#path&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;vía&lt;/a&gt; de &lt;code&gt;list(S_Nodes)[0]&lt;/code&gt; a &lt;code&gt;list(S_Nodes)[-1]&lt;/code&gt; en el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;nodo-fuente&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;nodo-fuente&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Nodo Fuente&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Llama al &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; un &lt;strong&gt;nodo fuente&lt;/strong&gt; en &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; si &lt;code&gt;s&lt;/code&gt; está en &lt;code&gt;G.setOfNodes&lt;/code&gt; y &lt;code&gt;G.setOfArcs&lt;/code&gt; no contiene &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; como &lt;code&gt;a.toNode = s&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;source_nodes&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   to_nodes = frozenset({a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs})
   sources = G.setOfNodes.difference(to_nodes)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; sources
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;nodo-terminal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;nodo-terminal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Nodo Terminal&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Llama al &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt; un &lt;strong&gt;nodo terminal&lt;/strong&gt; en el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; si &lt;code&gt;t&lt;/code&gt; está en &lt;code&gt;G.setOfNodes&lt;/code&gt; y &lt;code&gt;G.setOfArcs&lt;/code&gt; no contiene &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; como &lt;code&gt;a.fromNode = t&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;terminal_nodes&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   from_nodes = frozenset({a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs})
   terminals = G.setOfNodes.difference(from_nodes)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; terminals
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cortes-y-cortes-s-t&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;cortes-y-cortes-s-t&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cortes y Cortes s-t&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Un &lt;a href=&quot;https://en.wikipedia.org/wiki/Cut_(graph_theory)&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;corte&lt;/a&gt; &lt;code&gt;cut&lt;/code&gt; de un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Connectivity_(graph_theory)#Connected_graph&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;conectado&lt;/a&gt; es un &lt;a href=&quot;https://www.toptal.com/algorithms/flujo-m%C3%A1ximo-y-el-problema-de-asignaci%C3%B3n-lineal/%20//en.wikipedia.org/wiki/Subset&quot;&gt;subset&lt;/a&gt; de &lt;strong&gt;arcos&lt;/strong&gt; desde &lt;code&gt;G.setOfArcs&lt;/code&gt; el cual &lt;a href=&quot;https://en.wikipedia.org/wiki/Partition_of_a_set&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;parte&lt;/a&gt; el set de &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;G.setOfNodes&lt;/code&gt; en &lt;code&gt;G&lt;/code&gt;. &lt;code&gt;G&lt;/code&gt; está conectado si cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; tiene al menos un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; como &lt;code&gt;n = a.fromNode&lt;/code&gt; o &lt;code&gt;n = a.toNode&lt;/code&gt;, pero no &lt;code&gt;a.fromNode != a.toNode&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cut = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Cut&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;setOfCutArcs&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La definición de arriba se refiere al subset de &lt;strong&gt;arcos&lt;/strong&gt;, pero también puede definir una partición de los &lt;strong&gt;nodos&lt;/strong&gt; de &lt;code&gt;G.setOfNodes&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para las funciones &lt;code&gt;predecessors_of&lt;/code&gt; y &lt;code&gt;successors_of&lt;/code&gt;, &lt;code&gt;n&lt;/code&gt; es un &lt;strong&gt;nodo&lt;/strong&gt; en el set &lt;strong&gt;G.setOfNodes&lt;/strong&gt; de &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;, y &lt;code&gt;cut&lt;/code&gt; es un &lt;strong&gt;corte&lt;/strong&gt; de &lt;code&gt;G&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;cut_predecessors_of&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(n, cut, G)&lt;/span&gt;:&lt;/span&gt;
   allowed_arcs   = G.setOfArcs.difference(frozenset(cut.setOfCutArcs))
   predecessors   = frozenset({})
   previous_count = len(predecessors)
   reach_fringe   = frozenset({n})
   keep_going     = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;( keep_going ):
       reachable_from = frozenset({a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; allowed_arcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; reach_fringe)})
       reach_fringe   = reachable_from
       predecessors   = predecessors.union(reach_fringe)
       current_count  = len(predecessors)
       keep_going     = current_count -  previous_count &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
       previous_count = current_count
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; predecessors

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;cut_successors_of&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(n, cut, G)&lt;/span&gt;:&lt;/span&gt;
   allowed_arcs   = G.setOfArcs.difference(frozenset(cut.setOfCutArcs))
   successors     = frozenset({})
   previous_count = len(successors)
   reach_fringe   = frozenset({n})
   keep_going     = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;( keep_going ):
       reachable_from = frozenset({a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; allowed_arcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; reach_fringe)})
       reach_fringe   = reachable_from
       successors     = successors.union(reach_fringe)
       current_count  = len(successors)
       keep_going     = current_count -  previous_count &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
       previous_count = current_count
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; successors
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;cut&lt;/code&gt; sea un &lt;strong&gt;corte&lt;/strong&gt; del &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_first_part&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(cut, G)&lt;/span&gt;:&lt;/span&gt;
   firstPartFringe = frozenset({a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; cut.setOfCutArcs})
   firstPart = firstPartFringe
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; firstPart:
       preds = cut_predecessors_of(n,cut,G)
       firstPart = firstPart.union(preds)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; firstPart

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_second_part&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(cut, G)&lt;/span&gt;:&lt;/span&gt;
   secondPartFringe = frozenset({a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; cut.setOfCutArcs})
   secondPart = secondPartFringe
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; secondPart:
       succs= cut_successors_of(n,cut,G)
       secondPart = secondPart.union(succs)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; secondPart
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;cut&lt;/code&gt; es un &lt;strong&gt;corte&lt;/strong&gt; del &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; si: &lt;code&gt;(get_first_part(cut, G).union(get_second_part(cut, G)) == G.setOfNodes) y (len(get_first_part(cut, G).intersect(get_second_part(cut, G))) == 0)&lt;/code&gt; &lt;code&gt;cut&lt;/code&gt; es llamado un &lt;strong&gt;corte x-y&lt;/strong&gt; si &lt;code&gt;(x in get_first_part(cut, G)) y (y in get_second_part(cut, G) ) y (x != y)&lt;/code&gt;. Cuando el &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;x&lt;/code&gt; en un &lt;strong&gt;corte x-y&lt;/strong&gt; &lt;code&gt;cut&lt;/code&gt; es un &lt;strong&gt;nodo fuente&lt;/strong&gt; y el &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;y&lt;/code&gt; en el &lt;strong&gt;corte x-y&lt;/strong&gt; es un &lt;strong&gt;nodo terminal&lt;/strong&gt;, luego este &lt;strong&gt;corte&lt;/strong&gt; es llamado un &lt;strong&gt;corte s-t&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;STCut = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;STCut&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;s&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;t&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;cut&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;redes-de-flujo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;redes-de-flujo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Redes de Flujo&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Puedes usar un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; para representar una red de flujo.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Asigna cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt;, donde &lt;code&gt;n&lt;/code&gt; está en &lt;code&gt;G.setOfNodes&lt;/code&gt; un &lt;code&gt;n.datum&lt;/code&gt; que es un &lt;code&gt;FlowNodeDatum&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;FlowNodeDatum = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;FlowNodeDatum&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;flowIn&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;flowOut&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Asigna cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt;, donde &lt;code&gt;a&lt;/code&gt; es un &lt;code&gt;G.setOfArcs&lt;/code&gt; y &lt;code&gt;a.datum&lt;/code&gt; que es un &lt;code&gt;FlowArcDatum&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;FlowArcDatum = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;FlowArcDatum&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;capacity&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;flow&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;flowNodeDatum.flowIn&lt;/code&gt; y &lt;code&gt;flowNodeDatum.flowOut&lt;/code&gt; son &lt;a href=&quot;https://en.wikipedia.org/wiki/Real_number&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;números reales&lt;/a&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Sign_(mathematics)&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;positivos&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;flowArcDatum.capacity&lt;/code&gt; y &lt;code&gt;flowArcDatum.flow&lt;/code&gt; también son números reales positivos.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por cada nodo &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;n.datum.flowIn = sum({a.datum.flow &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.Arcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.toNode == n})
n.datum.flowOut = sum({a.datum.flow &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.Arcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.fromNode == n})
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;Dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; ahora representa a la &lt;strong&gt;red de flujo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;flujo&lt;/strong&gt; de &lt;code&gt;G&lt;/code&gt; se refiere al flujo &lt;code&gt;a.flow&lt;/code&gt; para todos los &lt;strong&gt;arcos&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;flujos-factibles&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 id=&quot;flujos-factibles&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Flujos Factibles&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; represente una &lt;strong&gt;red de flujo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La &lt;strong&gt;red de flujo&lt;/strong&gt; representada por &lt;code&gt;G&lt;/code&gt; tiene &lt;strong&gt;flujos factibles&lt;/strong&gt; si:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; excepto por &lt;strong&gt;nodos fuentes&lt;/strong&gt; y &lt;strong&gt;nodos terminal&lt;/strong&gt;: &lt;code&gt;n.datum.flowIn = n.datum.flowOut&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; in &lt;code&gt;G.setOfNodes&lt;/code&gt;: &lt;code&gt;a.datum.capacity &amp;lt;= a.datum.flow&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La Condición 1 es llamada &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow_network#Flows&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;contención de conservación&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La Condición 2 es llamada &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow_network#Flows&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;contención de capacidad&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;capacidad-de-corte&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;capacidad-de-corte&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Capacidad de Corte&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La &lt;strong&gt;capacidad de corte&lt;/strong&gt; de un &lt;strong&gt;corte s-t&lt;/strong&gt; &lt;code&gt;stCut&lt;/code&gt; con un &lt;strong&gt;nodo fuente&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; y un &lt;strong&gt;nodo terminal&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt; de una &lt;strong&gt;red de flujo&lt;/strong&gt; representada por un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; es:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;cut_capacity&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(stCut, G)&lt;/span&gt;:&lt;/span&gt;
   part_1 = get_first_part(stCut.cut,G)
   part_2 = get_second_part(stCut.cut,G)
   s_part = part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; stCut.s &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; part_2
   t_part = part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; stCut.t &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; part_2
   cut_capacity = sum({a.datum.capacity &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; stCut.cut.setOfCutArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; s_part) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; t_part) )})
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; cut_capacity
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;corte-de-capacidad-mnima&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;corte-de-capacidad-mnima&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Corte de Capacidad Mínima&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;stCut = stCut(s,t,cut) &lt;/code&gt; sea un &lt;strong&gt;corte s-t&lt;/strong&gt; de una &lt;strong&gt;red de flujo&lt;/strong&gt; representada por un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;stCut&lt;/code&gt; es el &lt;strong&gt;corte de capacidad mínima&lt;/strong&gt; de la &lt;strong&gt;red de flujo&lt;/strong&gt; representada por &lt;code&gt;G&lt;/code&gt; si no hay otro &lt;strong&gt;corte s-t&lt;/strong&gt; &lt;code&gt;stCutCompetitor&lt;/code&gt; en esta &lt;strong&gt;red de flujo&lt;/strong&gt; como:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;   cut_capacity(stCut, G) &amp;lt; cut_capacity(stCutCompetitor, G)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;despojando-los-flujos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;despojando-los-flujos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Despojando los Flujos&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Me gustaría referirme al &lt;strong&gt;dígrafo&lt;/strong&gt; que sería el resultado de tomar un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; y borrar todos los datos de flujo de todos los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; y también todos los &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;strip_flows&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   new_nodes= frozenset( (Node(n.uid, FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes) )
   new_arcs = frozenset([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       new_fromNode = Node(a.fromNode.uid, FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;))
       new_toNode     = Node(a.toNode.uid, FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;))
       new_arc            = Arc(new_fromNode, new_toNode, FlowArcDatum(a.datum.capacity, &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;))
       new_arcs          = new_arcs.union(frozenset([new_arc]))
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; DiGraph(new_nodes, new_arcs)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Problema de Flujo Máximo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una &lt;strong&gt;red de flujo&lt;/strong&gt; representada como un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;, un &lt;strong&gt;nodo fuente&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; y un &lt;strong&gt;nodo terminal&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt; puede representar un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; si:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;(len(list(source_nodes(G))) == &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (next(iter(source_nodes(G))) == s) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (len(list(terminal_nodes(G))) == &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (next(iter(terminal_nodes(G))) == t)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Marca esta representación:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;MaxFlowProblemState = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;MaxFlowProblemState&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;G&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;sourceNodeUid&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;terminalNodeUid&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;maxFlowProblemStateUid&#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Donde &lt;code&gt;sourceNodeUid = s.uid&lt;/code&gt;, &lt;code&gt;terminalNodeUid = t.uid&lt;/code&gt;, y &lt;code&gt;maxFlowProblemStateUid&lt;/code&gt; es un identificador para la instancia del problema.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;solucin-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;solucin-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Solución de Flujo Máximo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;maxFlowProblem&lt;/code&gt; represente un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt;. La solución al problema &lt;code&gt;maxFlowProblem&lt;/code&gt; puede ser representado por una &lt;strong&gt;red de flujo&lt;/strong&gt; representada como un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;Dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; es una solución &lt;strong&gt;factible&lt;/strong&gt; para el &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; en la entrada &lt;code&gt;python maxFlowProblem&lt;/code&gt; si:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;strip_flows(maxFlowProblem.G) == strip_flows(H)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;H&lt;/code&gt; es una &lt;strong&gt;red de flujo&lt;/strong&gt; y tiene &lt;strong&gt;flujos factibles&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si en adición a 1 y 2:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;No puede haber otra &lt;strong&gt;red de flujo&lt;/strong&gt; representada por el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;K&lt;/code&gt; como &lt;code&gt;strip_flows(G) == strip_flows(K)&lt;/code&gt; y &lt;code&gt;find_node_by_uid(t.uid,G).flowIn &amp;lt; find_node_by_uid(t.uid,K).flowIn&lt;/code&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Entonces &lt;code&gt;H&lt;/code&gt; también es una solución &lt;strong&gt;óptima&lt;/strong&gt; para &lt;code&gt;maxFlowProblem&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En otras palabras, una &lt;strong&gt;solución de flujo máximo factible&lt;/strong&gt; puede representarse con un &lt;strong&gt;dígrafo&lt;/strong&gt;, que:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Es idéntico al &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; del correspondiente &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; con la excepción del flujo &lt;code&gt;n.datum.flowIn&lt;/code&gt;, &lt;code&gt;n.datum.flowOut&lt;/code&gt; y el flujo &lt;code&gt;a.datum.flow&lt;/code&gt; de cualquiera de los &lt;strong&gt;nodos&lt;/strong&gt; y &lt;strong&gt;arcos&lt;/strong&gt; pueden ser diferentes.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Representa una &lt;strong&gt;red de flujo&lt;/strong&gt; que tiene &lt;strong&gt;flujos factibles&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Y, puede representar una &lt;strong&gt;solución óptima de flujo máximo&lt;/strong&gt; si adicionalmente:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;code&gt;flowIn&lt;/code&gt; para el &lt;strong&gt;nodo&lt;/strong&gt; que corresponde al &lt;strong&gt;nodo terminal&lt;/strong&gt; en el &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; es lo más grande posible (cuando las condiciones 1 y 2 siguen estando satisfechas).&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; representa una &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; : &lt;code&gt;find_node_by_uid(s.uid,H).flowOut = find_node_by_uid(t.uid,H).flowIn&lt;/code&gt; this follows from the &lt;strong&gt;flujo máximo, teorema del corte mínimo&lt;/strong&gt; (tratado abajo). Informalmente, dado que se supone que &lt;code&gt;H&lt;/code&gt; tiene &lt;strong&gt;flujos viables&lt;/strong&gt; esto significa que el &lt;strong&gt;flujo&lt;/strong&gt; no puede ser ‘creado’ (con excepción del &lt;strong&gt;nodo fuente&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt;) nor ‘destruído’ (con la excepción del &lt;strong&gt;nodo terminal&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt;) al cruzarse con cualquier (otro) &lt;strong&gt;nodo&lt;/strong&gt;  (&lt;strong&gt;constricciones de conservación&lt;/strong&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Dado que un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; &lt;strong&gt;contiene sólo un nodo fuente&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; y un único &lt;strong&gt;nodo terminal&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt;, todo flujo ‘creado’ en &lt;code&gt;s&lt;/code&gt; debe ser ‘destruido’ en &lt;code&gt;t&lt;/code&gt; o la &lt;strong&gt;red de flujo&lt;/strong&gt; &lt;strong&gt;no&lt;/strong&gt; tiene &lt;strong&gt;flujos factibles&lt;/strong&gt; (la &lt;strong&gt;constricción de conservación&lt;/strong&gt; hubiese sido violada).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; represente una &lt;strong&gt;solución de flujo máximo factible&lt;/strong&gt;; el valor anterior se llama &lt;strong&gt;Valor de Flujo s-t&lt;/strong&gt; de &lt;code&gt;H&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Permite:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;mfps=MaxFlowProblemState(H, maxFlowProblem.sourceNodeUid, maxFlowProblem.terminalNodeUid, maxFlowProblem.maxFlowProblemStateUid)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto significa que &lt;code&gt;mfps&lt;/code&gt; es un &lt;strong&gt;estado sucesor&lt;/strong&gt; de&lt;code&gt; maxFlowProblem&lt;/code&gt;, lo que significa que &lt;code&gt;mfps&lt;/code&gt; es exactamente como &lt;code&gt;maxFlowProblem&lt;/code&gt; con la excepción de que los valores de &lt;code&gt;a.flow&lt;/code&gt; para los arcos &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;maxFlowProblem.setOfArcs&lt;/code&gt; puede ser diferente de &lt;code&gt;a.flow&lt;/code&gt; para los arcos &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;mfps.setOfArcs&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_mfps_flow&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(mfps)&lt;/span&gt;:&lt;/span&gt;
   flow_from_s = find_node_by_uid(mfps.sourceNodeUid,mfps.G).datum.flowOut
   flow_to_t      = find_node_by_uid(mfps.terminalNodeUid,mfps.G).datum.flowIn

   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( (flow_to_t - flow_from_s) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;):
       &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; Exception(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Infeasible s-t flow&#39;&lt;/span&gt;)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; flow_to_t
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esta es una visualización de un &lt;code&gt;mfps&lt;/code&gt; junto con su &lt;code&gt;maxFlowProb&lt;/code&gt; asociado. Cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en la imagen tiene una etiqueta, estas etiquetas son &lt;code&gt;a.datum.flowFrom/a.datum.flowTo&lt;/code&gt;, cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en la imagen tiene una etiqueta y estas etiquetas son &lt;code&gt;n.uid {n.datum.flowIn / a.datum.flowOut}&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización de Flujo Máximo&quot; height=&quot;133&quot; src=&quot;https://uploads.toptal.io/blog/image/124066/toptal-blog-image-1503924859200-b718ce8f34344ffda27ceb8d9c4c1c44.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;h2 id=&quot;flujo-de-corte&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;flujo-de-corte&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Flujo de Corte&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;mfps&lt;/code&gt; represente un estado de problema &lt;code&gt;MaxFlowProblemState&lt;/code&gt; y deja que &lt;code&gt;stCut&lt;/code&gt; represente un &lt;strong&gt;corte&lt;/strong&gt; de &lt;code&gt;mfps.G&lt;/code&gt;. El &lt;strong&gt;flujo de corte&lt;/strong&gt; &lt;code&gt;stCut&lt;/code&gt; está definido así:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_stcut_flow&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(stCut,mfps)&lt;/span&gt;:&lt;/span&gt;
   s = find_node_by_uid(mfps.sourceNodeUid, mfps.G)
   t = find_node_by_uid(mfps.terminalNodeUid, mfps.G)
   part_1 = get_first_part(stCut.cut,mfps.G)
   part_2 = get_second_part(stCut.cut,mfps.G)
   s_part = part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; s &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; part_2
   t_part = part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; t &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; part_1 &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; part_2
   s_t_sum = sum(a.datum.flow &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; mfps.G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; stCut.cut.setOfCutArcs) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; s_part) )
   t_s_sum = sum(a.datum.flow &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; mfps.G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; stCut.cut.setOfCutArcs) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; t_part) )
   cut_flow = s_t_sum - t_s_sum
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; cut_flow
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;corte de flujo s-t&lt;/strong&gt; es la suma de los flujos de la partición que contiene el &lt;strong&gt;nodo fuente&lt;/strong&gt; para la partición que contiene el &lt;strong&gt;nodo terminal&lt;/strong&gt; menos la suma de los flujos de la partición que contiene el &lt;strong&gt;nodo terminal&lt;/strong&gt; para la partición que contiene el &lt;strong&gt;nodo fuente&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;flujo-mximo-corte-mnimo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;flujo-mximo-corte-mnimo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Flujo Máximo, Corte Mínimo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Que &lt;code&gt;maxFlowProblem&lt;/code&gt; represente un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; y que la solución a &lt;code&gt;maxFlowProblem&lt;/code&gt; sea representada por una &lt;strong&gt;red de flujo&lt;/strong&gt; representada como &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Sea &lt;code&gt;minStCut&lt;/code&gt; el &lt;strong&gt;corte de capacidad mínimo&lt;/strong&gt; de la &lt;strong&gt;red de flujo&lt;/strong&gt; representado por &lt;code&gt;maxFlowProblem.G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Debido a que en el flujo de &lt;strong&gt;flujo máximo&lt;/strong&gt; el flujo se origina en un solo &lt;strong&gt;nodo fuente&lt;/strong&gt; y termina en un único nodo &lt;strong&gt;terminal&lt;/strong&gt; y, debido a las &lt;strong&gt;restricciones de capacidad&lt;/strong&gt; y las &lt;strong&gt;restricciones de conservación&lt;/strong&gt;, sabemos que todo el flujo que entra a &lt;code&gt;maxFlowProblem.terminalNodeUid&lt;/code&gt; debe cruzar cualquier &lt;strong&gt;corte s-t&lt;/strong&gt;, en particular debe cruzar &lt;code&gt;minStCut&lt;/code&gt;. Esto significa:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;get_flow_value(H, maxFlowProblem) &amp;lt;= cut_capacity(minStCut, maxFlowProblem.G)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;solucin-del-problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;solucin-del-problema-de-flujo-mximo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Solución del Problema de Flujo Máximo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La idea básica para resolver un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; &lt;code&gt;maxFlowProblem&lt;/code&gt; es comenzar con una &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; representada por &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;. Tal punto de partida puede ser &lt;code&gt;H = strip_flows(maxFlowProblem.G)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;The task is then to use &lt;code&gt;H&lt;/code&gt; and by some &lt;a href=&quot;https://en.wikipedia.org/wiki/Greedy_coloring&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;greedy&lt;/a&gt;la modificación de los valores &lt;code&gt;a.datum.flow&lt;/code&gt;  de algunos &lt;strong&gt;arcos&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt; para producir otra &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; representada por &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;K&lt;/code&gt; de modo que &lt;code&gt;K&lt;/code&gt; no puede todavía representar una &lt;strong&gt;red de flujo&lt;/strong&gt; con &lt;strong&gt;flujos viables&lt;/strong&gt; y &lt;code&gt;get_flow_value(H, maxFlowProblem) &amp;lt; get_flow_value(K, maxFlowProblem)&lt;/code&gt;. Mientras este proceso continúe, la calidad (&lt;code&gt;get_flow_value(K, maxFlowProblem)&lt;/code&gt;) de la &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; (&lt;code&gt;K&lt;/code&gt;) encontrada, recientemente, es mejor que cualquier otra &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; que se haya encontrado. Si el proceso llega a un punto en el que sabe que ninguna otra mejora es posible, el proceso puede terminar y devolverá la &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Optimization_problem#Combinatorial_optimization_problem&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;óptimo&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La descripción anterior es general y omite muchas pruebas tales como, si tal proceso es posible o cuánto tiempo puede tomar, voy a dar algunos detalles más y el algoritmo.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;el-teorema-de-flujo-mximo-corte-mnimo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;el-teorema-de-flujo-mximo-corte-mnimo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El Teorema de Flujo Máximo, Corte Mínimo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Del libro &lt;a href=&quot;http://press.princeton.edu/titles/9233.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Flows in Networks de Ford y Fulkerson&lt;/a&gt;, la declaración del &lt;strong&gt;Teorema de Flujo Máximo, Corte Mínimo&lt;/strong&gt; (Theorem 5.1) es:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para cualquier red, el valor de flujo máximo de &lt;code&gt;s&lt;/code&gt; a &lt;code&gt;t&lt;/code&gt; es igual a la capacidad de corte mínima de todos los cortes que separan &lt;code&gt;s&lt;/code&gt; y &lt;code&gt;t&lt;/code&gt;.&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Utilizando las definiciones en este post, que se traduce en:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La solución a un &lt;code&gt;maxFlowProblem&lt;/code&gt; representado por una &lt;strong&gt;red de flujo&lt;/strong&gt; representada como &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; es &lt;a href=&quot;https://en.wikipedia.org/wiki/Optimization_problem#Combinatorial_optimization_problem&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;óptima&lt;/a&gt; si:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;get_flow_value(H, maxFlowProblem) == cut_capacity(minStCut, maxFlowProblem.G)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/NetFlow/max-flow-min-cut.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Me gusta esta prueba&lt;/a&gt; del teorema y Wikipedia tiene &lt;a href=&quot;https://en.wikipedia.org/wiki/Max-flow_min-cut_theorem#Proof&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;otro&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;el teorema de flujo máximo, corte mínimo&lt;/strong&gt; se utiliza para demostrar la corrección y la integridad del &lt;strong&gt;método de Ford-Fulkerson&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;También daré una prueba del teorema en la sección después de &lt;strong&gt;vías de aumento&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;el-mtodo-de-ford-fulkerson-y-el-algoritmo-de-edmonds-karp&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;el-mtodo-de-ford-fulkerson-y-el-algoritmo-de-edmonds-karp&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El Método de Ford-Fulkerson y el Algoritmo de Edmonds-Karp&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Introduction_to_Algorithms&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;CLRS&lt;/a&gt; define el método Ford-Fulkerson (sección 26.2) así:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;FORD-FULKERSON-METHOD(G, s, t):
initialize flow f to 0
while there exists an augmenting path p in the residual graph G_f augment flow f along
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;grfico-residual&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;grfico-residual&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Gráfico Residual&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;a href=&quot;https://en.wikipedia.org/wiki/Maximum_flow_problem#Solutions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Gráfico Residual&lt;/a&gt; 
de una &lt;strong&gt;red de flujo&lt;/strong&gt; representada como el &lt;strong&gt;dígrafo&lt;/strong&gt; “G” puede representarse como un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G_f&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;ResidualDatum = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;ResidualDatum&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;residualCapacity&#39;&lt;/span&gt;,&lt;span class=&quot;hljs-string&quot;&gt;&#39;action&#39;&lt;/span&gt;])

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;agg_n_to_u_cap&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(n,u,G_as_dict)&lt;/span&gt;:&lt;/span&gt;
   arcs_out = G_as_dict[n]
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; sum([a.datum.capacity &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; arcs_out &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( (a.fromNode == n) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode == u) ) ])

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;agg_n_to_u_flow&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(n,u,G_as_dict)&lt;/span&gt;:&lt;/span&gt;
   arcs_out = G_as_dict[n]
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; sum([a.datum.flow &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; arcs_out &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( (a.fromNode == n) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode == u) ) ])

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_residual_graph_of&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   G_as_dict = digraph_to_dict(G)
   residual_nodes = G.setOfNodes
   residual_arcs = frozenset([])

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_as_dict:
       arcs_from = G_as_dict[n]
       nodes_to = frozenset([find_node_by_uid(a.toNode.uid,G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; arcs_from])

       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; u &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; nodes_to:
           n_to_u_cap_sum  = agg_n_to_u_cap(n,u,G_as_dict)
           n_to_u_flow_sum = agg_n_to_u_flow(n,u,G_as_dict)
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(n_to_u_cap_sum &amp;gt; n_to_u_flow_sum):
               flow = round(n_to_u_cap_sum - n_to_u_flow_sum, TOL)
               residual_arcs = residual_arcs.union( frozenset([Arc(n,u,datum=ResidualDatum(flow, &lt;span class=&quot;hljs-string&quot;&gt;&#39;push&#39;&lt;/span&gt;))]) )
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(n_to_u_flow_sum &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;):
               flow = round(n_to_u_flow_sum, TOL)
               residual_arcs = residual_arcs.union( frozenset([Arc(u,n,datum=ResidualDatum(flow, &lt;span class=&quot;hljs-string&quot;&gt;&#39;pull&#39;&lt;/span&gt;))]) )
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; DiGraph(residual_nodes, residual_arcs)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;agg_n_to_u_cap(n,u,G_as_dict)&lt;/code&gt; regresan a la suma de &lt;code&gt;a.datum.capacity&lt;/code&gt; para los &lt;strong&gt;arcos&lt;/strong&gt; en el subset de &lt;code&gt;G.setOfArcs&lt;/code&gt; donde el &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; está en el subset si &lt;code&gt;a.fromNode = n&lt;/code&gt; y &lt;code&gt;a.toNode = u&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;agg_n_to_u_cap(n,u,G_as_dict)&lt;/code&gt; regresa la suma de &lt;code&gt;a.datum.flow&lt;/code&gt; para todos los &lt;strong&gt;arcos&lt;/strong&gt; en el subset de &lt;code&gt;G.setOfArcs&lt;/code&gt; donde el &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; está en el subset si &lt;code&gt;a.fromNode = n&lt;/code&gt; y &lt;code&gt;a.toNode = u&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En resumen, el &lt;strong&gt;gráfico residual&lt;/strong&gt; &lt;code&gt;G_f&lt;/code&gt; representa ciertas acciones que se pueden realizar en el &lt;strong&gt;dígrafo&lt;/strong&gt; ` G`.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cada par de &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;n, u&lt;/code&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; de la &lt;strong&gt;red de flujo&lt;/strong&gt; representada por &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; puede generar 0,1 o 2 &lt;strong&gt;arcos&lt;/strong&gt; en el &lt;strong&gt;gráfico residual&lt;/strong&gt; &lt;code&gt;G_f&lt;/code&gt; de ‘G`.&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El par &lt;code&gt;n, u&lt;/code&gt; no genera &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;G_f&lt;/code&gt; si no hay &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; tal como &lt;code&gt;a.fromNode = n&lt;/code&gt; y &lt;code&gt;a.toNode = u&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El par &lt;code&gt;n, u&lt;/code&gt; genera el &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G_f.setOfArcs&lt;/code&gt; donde &lt;code&gt;a&lt;/code&gt; representa un &lt;strong&gt;arco&lt;/strong&gt; etiquetado como un &lt;strong&gt;flujo de impulso&lt;/strong&gt; desde &lt;code&gt;n&lt;/code&gt; a &lt;code&gt;u&lt;/code&gt; &lt;code&gt;a = Arco (n, u, datum = ResidualNode (n_to_u_cap_sum - n_to_u_flow_sum))&lt;/code&gt; si &lt;code&gt;n_to_u_cap_sum&amp;gt; n_to_u_flow_sum&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El par &lt;code&gt;n, u&lt;/code&gt; genera el &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G_f.setOfArcs&lt;/code&gt; donde &lt;code&gt;a&lt;/code&gt; representa un &lt;strong&gt;arco&lt;/strong&gt; etiquetado como un &lt;strong&gt;pull stream arc&lt;/strong&gt; de &lt;code&gt;n&lt;/code&gt; a &lt;code&gt;u&lt;/code&gt; &lt;code&gt;a = Arco (n, u, datum = ResidualNode (n_to_u_cap_sum - n_to_u_flow_sum))&lt;/code&gt; si &lt;code&gt;n_to_u_flow_sum&amp;gt; 0.0&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cada &lt;strong&gt;push flow arc&lt;/strong&gt; en &lt;code&gt;G_f.setOfArcs&lt;/code&gt; representa la acción de añadir un total de flujo &lt;code&gt;x &amp;lt;= n_to_u_cap_sum - n_to_u_flow_sum&lt;/code&gt; a &lt;strong&gt;arcos&lt;/strong&gt; en el subconjunto de &lt;code&gt;G.setOfArcs&lt;/code&gt; donde el &lt;strong&gt;arc&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; está en el subconjunto si &lt;code&gt;a.fromNode = n&lt;/code&gt; y &lt;code&gt;a.toNode = u&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cada &lt;strong&gt;arco de flujo de tracción&lt;/strong&gt; en &lt;code&gt;G_f.setOfArcs&lt;/code&gt; representa la acción de sustraer un total de flujo &lt;code&gt;x &amp;lt;= n_to_u_flow_sum&lt;/code&gt; a &lt;strong&gt;arcos&lt;/strong&gt; en el subconjunto de &lt;code&gt;G.setOfArcs&lt;/code&gt; donde &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; está en el subconjunto si &lt;code&gt;a.fromNode = n&lt;/code&gt; y &lt;code&gt;a.toNode = u&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Realizar una acción individual como &lt;strong&gt;empuja&lt;/strong&gt; o &lt;strong&gt;hala&lt;/strong&gt;  desde &lt;code&gt;G_f&lt;/code&gt; en los &lt;strong&gt;arcos&lt;/strong&gt; aplicables en &lt;code&gt;G&lt;/code&gt; podría generar una &lt;strong&gt;red de flujo&lt;/strong&gt; sin &lt;strong&gt;flujos factibles&lt;/strong&gt; porque las &lt;strong&gt;constricciones de capacidad&lt;/strong&gt; o &lt;strong&gt;constricciones de conservación&lt;/strong&gt; podrían ser violado en la &lt;strong&gt;red de flujo generada&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;He aquí una visualización del &lt;strong&gt;gráfico residual&lt;/strong&gt; del ejemplo anterior de visualización de una &lt;strong&gt;solución de flujo máximo&lt;/strong&gt;, en la visualización cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; representa &lt;code&gt;a.residualCapacity&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización máxima del flujo (Residual)&quot; height=&quot;162&quot; src=&quot;https://uploads.toptal.io/blog/image/124065/toptal-blog-image-1503924725561-b0fbb5f1ee485579f111b1935e14bed6.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;h2 id=&quot;va-en-aumento&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;va-en-aumento&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Vía en Aumento&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;maxFlowProblem&lt;/code&gt; sea un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt;, y deja que &lt;code&gt;G_f = get_residual_graph_of (G)&lt;/code&gt; sea &lt;strong&gt;el gráfico residual&lt;/strong&gt; de &lt;code&gt;maxFlowProblem.G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow_network#Augmenting_paths&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;vía en aumento&lt;/a&gt; &lt;code&gt;augmentingPath&lt;/code&gt; para &lt;code&gt;maxFlowProblem&lt;/code&gt; es cualquier &lt;strong&gt;vía&lt;/strong&gt; desde &lt;code&gt;find_node_by_uid(maxFlowProblem.sourceNode,G_f)&lt;/code&gt; a &lt;code&gt;find_node_by_uid(maxFlowProblem.terminalNode,G_f)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Resulta que una &lt;strong&gt;ruta de aumento&lt;/strong&gt; &lt;code&gt;augmentingPath&lt;/code&gt; se puede aplicar a una &lt;strong&gt;solución de flujo máximo&lt;/strong&gt;  representada por el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; generando otra &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; representada por el &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;K&lt;/code&gt; donde &lt;code&gt;get_flow_value (H, maxFlowProblem) &amp;lt;valor de get_flow (K, maxFlowProblem)&lt;/code&gt; si &lt;code&gt;H&lt;/code&gt; no es &lt;strong&gt;óptimo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Aquí ves como:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;augment&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(augmentingPath, H)&lt;/span&gt;:&lt;/span&gt;
   augmentingPath = list(augmentingPath)
   H_as_dict = digraph_to_dict(H)
   new_nodes = frozenset({})
   new_arcs = frozenset({})
   visited_nodes  = frozenset({})
   visited_arcs = frozenset({})

   bottleneck_residualCapacity = min( augmentingPath, key=&lt;span class=&quot;hljs-keyword&quot;&gt;lambda&lt;/span&gt; a: a.datum.residualCapacity ).datum.residualCapacity
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; augmentingPath:
       from_node_uid = x.fromNode.uid &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; x.datum.action == &lt;span class=&quot;hljs-string&quot;&gt;&#39;push&#39;&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; x.toNode.uid
       to_node_uid = x.toNode.uid   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; x.datum.action == &lt;span class=&quot;hljs-string&quot;&gt;&#39;push&#39;&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; x.fromNode.uid
       from_node = find_node_by_uid( from_node_uid, H )
       to_node = find_node_by_uid( to_node_uid, H )
       load = bottleneck_residualCapacity &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; x.datum.action == &lt;span class=&quot;hljs-string&quot;&gt;&#39;push&#39;&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; -bottleneck_residualCapacity

       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H_as_dict[from_node]:
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode == to_node):
               test_sum = a.datum.flow + load
               new_flow = a.datum.flow
               new_from_node_flow_out = a.fromNode.datum.flowOut
               new_to_node_flow_in = a.toNode.datum.flowIn

               new_from_look = {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; new_nodes &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (n.uid == a.fromNode.uid)}
               new_to_look = {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; new_nodes &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (n.uid == a.toNode.uid)  }
               prev_from_node = new_from_look.pop() &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (len(new_from_look)&amp;gt;&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; a.fromNode
               prev_to_node = new_to_look.pop()   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (len(new_to_look)&amp;gt;&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;)   &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt; a.toNode
               new_nodes = new_nodes.difference(frozenset({prev_from_node}))
               new_nodes = new_nodes.difference(frozenset({prev_to_node}))

               &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(test_sum &amp;gt; a.datum.capacity):
                   new_flow = a.datum.capacity
                   new_from_node_flow_out = prev_from_node.datum.flowOut - a.datum.flow + a.datum.capacity
                   new_to_node_flow_in    = prev_to_node.datum.flowIn - a.datum.flow + a.datum.capacity
                   load = test_sum - a.datum.capacity
               &lt;span class=&quot;hljs-keyword&quot;&gt;elif&lt;/span&gt;(test_sum &amp;lt; &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;):
                   new_flow = &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;
                   new_from_node_flow_out = prev_from_node.datum.flowOut - a.datum.flow
                   new_to_node_flow_in    = prev_to_node.datum.flowIn - a.datum.flow
                   load = test_sum
                &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
                   new_flow = test_sum
                   new_from_node_flow_out = prev_from_node.datum.flowOut - a.datum.flow + new_flow
                   new_to_node_flow_in    = prev_to_node.datum.flowIn - a.datum.flow + new_flow
                   load = &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;

               new_from_node_flow_out = round(new_from_node_flow_out, TOL)
               new_to_node_flow_in    = round(new_to_node_flow_in, TOL)
               new_flow               = round(new_flow, TOL)

               new_from_node = Node(prev_from_node.uid, FlowNodeDatum(prev_from_node.datum.flowIn, new_from_node_flow_out))
               new_to_node   = Node(prev_to_node.uid, FlowNodeDatum(new_to_node_flow_in, prev_to_node.datum.flowOut))
               new_arc       = Arc(new_from_node, new_to_node, FlowArcDatum(a.datum.capacity, new_flow))

               visited_nodes = visited_nodes.union(frozenset({a.fromNode,a.toNode}))
               visited_arcs  = visited_arcs.union(frozenset({a}))
               new_nodes     = new_nodes.union(frozenset({new_from_node, new_to_node}))
               new_arcs      = new_arcs.union(frozenset({new_arc}))

   not_visited_nodes = H.setOfNodes.difference(visited_nodes)
   not_visited_arcs  = H.setOfArcs.difference(visited_arcs)

   full_new_nodes = new_nodes.union(not_visited_nodes)
   full_new_arcs  = new_arcs.union(not_visited_arcs)
   G = DiGraph(full_new_nodes, full_new_arcs)

   full_new_arcs_update = frozenset([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; full_new_arcs:
       new_from_node = a.fromNode
       new_to_node   = a.toNode
       new_from_node = find_node_by_uid( a.fromNode.uid, G )
       new_to_node   = find_node_by_uid( a.toNode.uid, G )
       full_new_arcs_update = full_new_arcs_update.union( {Arc(new_from_node, new_to_node, FlowArcDatum(a.datum.capacity, a.datum.flow))} )

   G = DiGraph(full_new_nodes, full_new_arcs_update)

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; G
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En lo anterior, &lt;code&gt;TOL&lt;/code&gt; es un valor de tolerancia para &lt;a href=&quot;https://docs.python.org/3/library/functions.html#round&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;redondear&lt;/a&gt; 
los valores de flujo en la red. Esto es para evitar la cascada de &lt;a href=&quot;https://docs.python.org/3/tutorial/floatingpoint.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;imprecisión de los cálculos de punto flotante&lt;/a&gt;. Así, por ejemplo, usé ‘TOL = 10` para redondear a 10 &lt;a href=&quot;https://en.wikipedia.org/wiki/Significant_figures&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;dígitos significativos&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja &lt;code&gt;K = augment (augmentingPath, H)&lt;/code&gt;, entonces &lt;code&gt;K&lt;/code&gt; representa una &lt;strong&gt;solución de flujo máximo factible&lt;/strong&gt; para &lt;code&gt;maxFlowProblem&lt;/code&gt;. Para que la afirmación sea verdadera, la &lt;strong&gt;red de flujo&lt;/strong&gt; representada por &lt;code&gt;K &lt;/code&gt; debe tener &lt;strong&gt;flujos factibles&lt;/strong&gt; (no violar la &lt;strong&gt;restricción de capacidad&lt;/strong&gt; o la &lt;strong&gt;restricción de conservación&lt;/strong&gt;.
Aquí está el por qué: En el método anterior, cada &lt;strong&gt;nodo&lt;/strong&gt; añadido a la nueva &lt;strong&gt;red de flujo&lt;/strong&gt; representado por &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;K&lt;/code&gt; es una copia exacta de un &lt;strong&gt;nodo&lt;/strong&gt; de &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; o un &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; que ha tenido el mismo número añadido a su &lt;code&gt;n.datum.flowIn&lt;/code&gt; como su &lt;code&gt;n.datum.flowOut&lt;/code&gt;. Esto significa que la &lt;strong&gt;restricción de conservación&lt;/strong&gt; se cumple en “K” siempre que se cumpla en “H”. La &lt;strong&gt;restricción de conservación&lt;/strong&gt; se satisface porque comprobamos explícitamente que cualquier &lt;strong&gt;arco&lt;/strong&gt; nuevo &lt;code&gt;a&lt;/code&gt; en la red tiene &lt;code&gt;a.datum.flow &amp;lt;= a.datum.capacity&lt;/code&gt;; por lo tanto, siempre y cuando los &lt;strong&gt;arcos&lt;/strong&gt; del conjunto &lt;code&gt;H.setOfArcs&lt;/code&gt; que fueron copiados sin modificar en &lt;code&gt;K.setOfArcs&lt;/code&gt; no violen la &lt;strong&gt;restricción de capacidad&lt;/strong&gt;, entonces &lt;code&gt;K&lt;/code&gt; no viola la &lt;strong&gt;restricción de capacidad&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;También es cierto que &lt;code&gt;get_flow_value (H, maxFlowProblem) &amp;lt;get_flow_value (K, maxFlowProblem)&lt;/code&gt; si &lt;code&gt;H&lt;/code&gt; no es &lt;strong&gt;óptimo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Aquí está el porqué: Para un &lt;strong&gt;aumento de ruta&lt;/strong&gt; &lt;code&gt;augmentingPath&lt;/code&gt; existe en el &lt;strong&gt;dígrafo&lt;/strong&gt; la representación del &lt;strong&gt;gráfico residual&lt;/strong&gt; &lt;code&gt;G_f&lt;/code&gt; de un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; &lt;code&gt;maxFlowProblem&lt;/code&gt; entonces el último &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;augmentingPath&lt;/code&gt; debe ser un &lt;strong&gt;arco&lt;/strong&gt;  ‘push’ y debe tener &lt;code&gt;a.toNode == maxFlowProblem.terminalNode&lt;/code&gt;. Una &lt;strong&gt;ruta de aumento&lt;/strong&gt; se define como una que termina en el &lt;strong&gt;nodo terminal&lt;/strong&gt; del &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; para el cual es una &lt;strong&gt;ruta de aumento&lt;/strong&gt;. De la definición del &lt;strong&gt;gráfico residual&lt;/strong&gt;, está claro que el último &lt;strong&gt;arco&lt;/strong&gt; en una &lt;strong&gt;vía de aumento&lt;/strong&gt; en ese &lt;strong&gt;gráfico residual&lt;/strong&gt; debe ser un &lt;strong&gt;arco&lt;/strong&gt; “push” porque cualquier &lt;strong&gt;arco&lt;/strong&gt; “pull” &lt;code&gt;b&lt;/code&gt; en la &lt;strong&gt;vía de aumento&lt;/strong&gt; tendrá &lt;code&gt;b.toNode == maxFlowProblem.terminalNode&lt;/code&gt; y &lt;code&gt;b.fromNode! = maxFlowProblem.terminalNode&lt;/code&gt; desde la definición de &lt;strong&gt;vía&lt;/strong&gt;. Además, a partir de la definición de &lt;strong&gt;vía&lt;/strong&gt;, está claro que el &lt;strong&gt;nodo terminal&lt;/strong&gt; sólo se modifica una vez con el método &lt;code&gt;augment&lt;/code&gt;. Así &lt;code&gt;augment&lt;/code&gt; modifica&lt;code&gt; maxFlowProblem.terminalNode.flowIn&lt;/code&gt; exactamente una vez y aumenta el valor de &lt;code&gt;maxFlowProblem.terminalNode.flowIn&lt;/code&gt; porque el último &lt;strong&gt;arco&lt;/strong&gt; en &lt;code&gt;augmentingPath&lt;/code&gt; debe ser el &lt;strong&gt;arco&lt;/strong&gt; que causa la modificación en &lt;code&gt;maxFlowProblem.terminalNode.flowIn&lt;/code&gt; durante &lt;code&gt;augment&lt;/code&gt;. Desde la definición de &lt;code&gt;augment&lt;/code&gt;, ya que se aplica a &lt;strong&gt;arcos&lt;/strong&gt; ‘push’, el &lt;code&gt;maxFlowProblem.terminalNode.flowIn&lt;/code&gt; sólo se puede aumentar, no disminuir.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;algunas-pruebas-de-sedgewick-y-wayne&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;algunas-pruebas-de-sedgewick-y-wayne&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Algunas Pruebas de Sedgewick y Wayne&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El libro &lt;a href=&quot;http://algs4.cs.princeton.edu/home/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Algorithms, cuarta edición de Robert Sedgewich y Kevin Wayne&lt;/a&gt; tiene algunas pruebas maravillosas y cortas (páginas 892-894) que serán útiles. Los recrearé aquí, aunque utilizaré el lenguaje que se ajuste a las definiciones anteriores. Mis etiquetas para las pruebas son las mismas que en el libro de Sedgewick.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Propuesta E:&lt;/strong&gt; Para cualquier &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; que representa una &lt;strong&gt;solución de flujo máximo factible&lt;/strong&gt; a un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; &lt;code&gt;maxFlowProblem&lt;/code&gt;, para cualquier &lt;code&gt;stCut&lt;/code&gt; &lt;code&gt;get_stcut_flow(stCut,H,maxFlowProblem) = get_flow_value(H, maxFlowProblem)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Prueba:&lt;/strong&gt; Deja &lt;code&gt;stCut=stCut(maxFlowProblem.sourceNode,maxFlowProblem.terminalNode,set([a for a in H.setOfArcs if a.toNode == maxFlowProblem.terminalNode]))&lt;/code&gt;. &lt;strong&gt;Proposición E&lt;/strong&gt; se mantiene por &lt;code&gt;stCut&lt;/code&gt; directamente desde la definición de &lt;strong&gt;valor de flujo s-t&lt;/strong&gt;. Supongamos que allí deseamos mover un &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; desde la partición s (&lt;code&gt;get_first_part(stCut.cut, G)&lt;/code&gt;) y en la partición &lt;code&gt;(get_second_part(stCut.cut, G))&lt;/code&gt;, para hacer esto necesitamos cambiar &lt;code&gt;stCut.cut&lt;/code&gt;, lo cual podría cambiar &lt;code&gt;stcut_flow = get_stcut_flow(stCut,H,maxFlowProblem)&lt;/code&gt; e invalidar &lt;strong&gt;proposition E&lt;/strong&gt;. Sin embargo, veamos cómo el valor de &lt;code&gt;stcut_flow&lt;/code&gt; cambiará a medida que hagamos este cambio. El &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; está en equilibrio, lo que significa que la suma de flujo en &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; es igual a la suma de flujo de ésta (esto es necesario para que &lt;code&gt;H&lt;/code&gt; represente una &lt;strong&gt;solución factible&lt;/strong&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Nota que todo el flujo que es parte de &lt;code&gt;stcut_flow&lt;/code&gt; entrando en &lt;strong&gt;node&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; entra en él desde la partición s (el flujo entrando a &lt;strong&gt;node&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; desde la partición t que lo hace directa o indirectamentefrom  no habría sido contado en el valor &lt;code&gt;stcut_flow&lt;/code&gt; porque está yendo en la dirección errónea basándonos en la definición). Observa que todo el flujo que es parte del &lt;code&gt;stcut_flow&lt;/code&gt; que entra al &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; lo introduce desde la partición s (el flujo que entra al &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; desde la partición t directa o indirectamente no se han contado en el valor &lt;code&gt;stcut_flow&lt;/code&gt; porque está dirigiendo la dirección incorrecta basada en la definición).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Además, todo el flujo que sale &lt;code&gt;n&lt;/code&gt; eventualmente fluirá (directa o indirectamente) hacia el &lt;strong&gt;nodo terminal&lt;/strong&gt; (demostrado anteriormente). Cuando movemos el &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en la partición t, todo el flujo que entra &lt;code&gt;n&lt;/code&gt; desde la partición s debe ser añadido al nuevo valor &lt;code&gt;stcut_flow&lt;/code&gt;; sin embargo, todo el flujo que sale &lt;code&gt;n&lt;/code&gt; debe ser restado del nuevo valor &lt;code&gt;stcut_flow&lt;/code&gt;; la parte del flujo que se dirige directamente a la partición t se resta, ya que este flujo es ahora interno a la nueva partición t y no se cuenta como &lt;code&gt;stcut_flow&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La parte del flujo desde la posición &lt;code&gt;n&lt;/code&gt; en &lt;strong&gt;nodos&lt;/strong&gt; de la partición s también debe ser restada de &lt;code&gt;stcut_flow&lt;/code&gt;: Después de que &lt;code&gt;n&lt;/code&gt; se mueva hacia la partición t, estos flujos serán dirigidos desde la posición partición t y en la partición s y por lo tanto no se debe tener en cuenta en el &lt;code&gt;stcut_flow&lt;/code&gt;, ya que estos flujos eliminan la entrada en la partición s y debe ser reducido por la suma de estos flujos, y el flujo de salida de la partición s en la partición-t (donde todos los flujos de st deben terminar) debe ser reducido en la misma cantidad. Como el &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; estaba en equilibrio antes del proceso, la actualización habrá agregado el mismo valor al nuevo valor &lt;code&gt;stcut_flow&lt;/code&gt; al restarse, dejando la &lt;strong&gt;proposición E&lt;/strong&gt; clara después de la actualización. La validez de la &lt;strong&gt;proposición E&lt;/strong&gt; luego se sigue en la inducción sobre el tamaño de la partición t.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Aquí hay algunos ejemplos de &lt;strong&gt;redes de flujo&lt;/strong&gt; para ayudar a visualizar los casos menos obvios donde la &lt;strong&gt;propuesta E&lt;/strong&gt; se mantiene; en la imagen, las áreas rojas indican la partición s, las áreas azules representan la partición t, y los &lt;strong&gt;arcos&lt;/strong&gt; verdes indican un &lt;strong&gt;corte s-t **. En la segunda imagen, el flujo entre **nodo&lt;/strong&gt; A y &lt;strong&gt;nodo&lt;/strong&gt; B aumenta mientras que el flujo en &lt;strong&gt;nodo terminal&lt;/strong&gt; t no cambia.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;img src=&quot;https://uploads.toptal.io/blog/image/124069/toptal-blog-image-1503925086128-9bf020557907bdc0ee38e9488e51bcd4.jpg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;https://uploads.toptal.io/blog/image/124070/toptal-blog-image-1503925096271-6a3cce1b7f2602caf632e238a65591fb.jpg&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Corolario:&lt;/strong&gt; Ningún valor de &lt;strong&gt;flujo de corte s-t&lt;/strong&gt; puede exceder la capacidad de &lt;strong&gt;corte s-t&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Proposición F. (teorema de flujo máximo y corte mínimo):&lt;/strong&gt; Deja que &lt;code&gt;f&lt;/code&gt; sea un flujo &lt;strong&gt;s-t&lt;/strong&gt;. Las siguientes 3 condiciones son equivalentes:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Existe un corte &lt;strong&gt;s-t&lt;/strong&gt; cuya capacidad es igual al valor del flujo &lt;code&gt;f&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;f&lt;/code&gt; es un &lt;strong&gt;flujo máximo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;No hay &lt;strong&gt;vía de aumento&lt;/strong&gt; con respecto a &lt;code&gt;f&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La condición 1 implica la condición 2 por el corolario. La condición 2 implica la condición 3 porque la existencia de una trayectoria aumentadora implica la existencia de un flujo con valores mayores, contradiciendo la máxima de “f”. La condición 3 implica la condición 1: Sea &lt;code&gt;C_s&lt;/code&gt; el conjunto de todos los &lt;strong&gt;nodos&lt;/strong&gt; que se pueden alcanzar desde&lt;code&gt; s&lt;/code&gt; con un &lt;strong&gt;aumento de ruta&lt;/strong&gt; en el &lt;strong&gt;gráfico residual&lt;/strong&gt;. Sea &lt;code&gt;C_t&lt;/code&gt; los &lt;strong&gt;arcos restantes&lt;/strong&gt;, entonces &lt;code&gt;t&lt;/code&gt; debe estar en &lt;code&gt;C_t&lt;/code&gt; (según nuestra suposición). Los &lt;strong&gt;arcos&lt;/strong&gt; que cruzan de &lt;code&gt;C_s&lt;/code&gt; a&lt;code&gt; C_t&lt;/code&gt; forman entonces un &lt;strong&gt;corte s-t&lt;/strong&gt; que contiene solamente &lt;strong&gt;arcos&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; donde &lt;code&gt;a.datum.capacity = a.datum.flow&lt;/code&gt; o &lt;code&gt;a.datum.flow = 0.0&lt;/code&gt;. De no ser así, los &lt;strong&gt;nodos&lt;/strong&gt; conectados por un &lt;strong&gt;arco&lt;/strong&gt; con la capacidad residual restante a &lt;code&gt;C_s&lt;/code&gt; estarían en el conjunto &lt;code&gt;C_s&lt;/code&gt; ya que entonces habría un &lt;strong&gt;aumento de vía&lt;/strong&gt; desde &lt;code&gt;s&lt;/code&gt; a un &lt;strong&gt;nodo&lt;/strong&gt;. El caudal a través del &lt;strong&gt;corte de s-t&lt;/strong&gt; es igual a la capacidad de &lt;strong&gt;corte de s-t&lt;/strong&gt; (ya que los &lt;strong&gt;arcos&lt;/strong&gt; de &lt;code&gt;C_s&lt;/code&gt; a &lt;code&gt;C_t&lt;/code&gt; tienen caudal igual a la capacidad) y también al valor de la &lt;strong&gt;flujo s-t&lt;/strong&gt; (por &lt;strong&gt;proposición E&lt;/strong&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esta afirmación del teorema &lt;strong&gt;de flujo máximo, min corte&lt;/strong&gt; implica la declaración anterior de &lt;a href=&quot;http://press.princeton.edu/titles/9233.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Flows in Networks&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;Corolario (propiedad de integralidad):&lt;/strong&gt; Cuando las capacidades son enteras, existe un flujo máximo de valor entero, y el algoritmo Ford-Fulkerson lo encuentra.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Prueba: Cada &lt;strong&gt;vía de aumento&lt;/strong&gt; incrementa el flujo por un entero positivo, el mínimo de las capacidades no utilizadas en los arcos &lt;strong&gt;de empuje&lt;/strong&gt; y los flujos en los arcos &lt;strong&gt;de tracción&lt;/strong&gt;, todos los cuales son siempre enteros positivos.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto justifica la descripción del método &lt;strong&gt;Ford-Fulkerson&lt;/strong&gt; de &lt;strong&gt;CLRS&lt;/strong&gt;. El método consiste en seguir encontrando &lt;strong&gt;incrementando rutas&lt;/strong&gt; y aplicando &lt;code&gt;augment&lt;/code&gt; a la última&lt;code&gt; maxFlowSolution&lt;/code&gt; encontrando mejores soluciones, hasta no más &lt;strong&gt;incrementando ruta&lt;/strong&gt;, lo que significa que la última &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; es &lt;strong&gt;óptimo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;de-ford-fulkerson-a-edmonds-karp&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;de-ford-fulkerson-a-edmonds-karp&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;De Ford-Fulkerson a Edmonds-Karp&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Las preguntas restantes con respecto a la resolución de &lt;strong&gt;problemas de flujo máximo&lt;/strong&gt; son:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;¿Cómo deben construirse &lt;strong&gt;caminos de aumento&lt;/strong&gt;?&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;¿Terminará el método si usamos números reales y no números enteros?&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;li&gt;
    &lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;¿Cuánto tiempo tomará terminar (si lo hace)?&lt;/span&gt;&lt;br /&gt;

  &lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;algoritmo Edmonds-Karp&lt;/strong&gt; especifica que cada &lt;strong&gt;ruta de aumento&lt;/strong&gt; se construye mediante una &lt;strong&gt;búsqueda de amplitud&lt;/strong&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Breadth-first_search&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;BFS&lt;/a&gt;) del &lt;strong&gt;gráfico residual&lt;/strong&gt;; resulta que esta decisión del punto 1 también obligará al algoritmo a terminar (punto 2) y permite que el &lt;a href=&quot;https://en.wikipedia.org/wiki/Big_O_notation&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;tiempo asintótico y la complejidad del espacio&lt;/a&gt; a ser determinados.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Primero, aquí hay una implementación &lt;strong&gt;BFS&lt;/strong&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;bfs&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(sourceNode, terminalNode, G_f)&lt;/span&gt;:&lt;/span&gt;
   G_f_as_dict = digraph_to_dict(G_f)
   parent_arcs = dict([])
   visited = frozenset([])
   deq = deque([sourceNode])
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; len(deq) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;:
       curr = deq.popleft()
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; curr == terminalNode:
           &lt;span class=&quot;hljs-keyword&quot;&gt;break&lt;/span&gt;
       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G_f_as_dict.get(curr):
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; visited):
               visited = visited.union(frozenset([a.toNode]))
               parent_arcs[a.toNode] = a
               deq.extend([a.toNode])
   path = list([])
   curr = terminalNode
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;(curr != sourceNode):
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (curr &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; parent_arcs):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;No augmenting path from {} to {}.&#39;&lt;/span&gt;.format(sourceNode.uid, terminalNode.uid)
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; StopIteration(err_msg)
       path.extend([parent_arcs[curr]])
       curr = parent_arcs[curr].fromNode
   path.reverse()

   test = deque([path[&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;].fromNode])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; path:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(test[-&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;] != a.fromNode):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;Bad path: {}&#39;&lt;/span&gt;.format(path)
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; ValueError(err_msg)
       test.extend([a.toNode])

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; path
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Utilicé un &lt;a href=&quot;https://docs.python.org/3/library/collections.html#collections.deque&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;deque del módulo de colecciones de python&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para responder a la pregunta 2, voy a parafrasear otra prueba de &lt;a href=&quot;http://algs4.cs.princeton.edu/home/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Sedgewick y Wayne&lt;/a&gt;: &lt;strong&gt;Proposición G.&lt;/strong&gt; El número de &lt;strong&gt;caminos de incremento&lt;/strong&gt; necesarios en el algoritmo &lt;strong&gt;Edmonds-Karp&lt;/strong&gt; con nodos &lt;code&gt;N&lt;/code&gt; y &lt;strong&gt;arcos&lt;/strong&gt; es como máximo &lt;code&gt;NA/2&lt;/code&gt;. Prueba: Cada &lt;strong&gt;ruta de aumento&lt;/strong&gt; tiene un arco de cuello &lt;strong&gt;arco&lt;/strong&gt; - un &lt;strong&gt;arco&lt;/strong&gt; que se suprime del &lt;strong&gt;gráfico residual&lt;/strong&gt; porque corresponde bien a un arco &lt;strong&gt;de empuje&lt;/strong&gt; que se llena a capacidad o un arco &lt;strong&gt;de tracción&lt;/strong&gt; a través del cual el flujo se convierte en 0. Cada vez que un &lt;strong&gt;arco&lt;/strong&gt; se convierte en un cuello de botella &lt;strong&gt;arco&lt;/strong&gt;, la longitud de cualquier &lt;strong&gt;trayecto de aumento&lt;/strong&gt; a través de él debe aumentar en un factor de 2. Esto es porque cada &lt;strong&gt;nodo&lt;/strong&gt; en una &lt;strong&gt;ruta&lt;/strong&gt; puede aparecer sólo una vez o no en absoluto (de la definición de &lt;strong&gt;ruta&lt;/strong&gt;) ya que las &lt;strong&gt;rutas&lt;/strong&gt; se están explorando desde la más corta &lt;strong&gt;ruta&lt;/strong&gt; a lo más largo que significa que por lo menos un &lt;strong&gt;nodo más&lt;/strong&gt; debe ser visitado por la siguiente ruta que atraviesa el cuello de botella &lt;strong&gt;nodo&lt;/strong&gt; que significa un adicional de 2 &lt;strong&gt;arcos&lt;/strong&gt; en el camino antes de llegar en el &lt;strong&gt;nodo&lt;/strong&gt;. Puesto que el &lt;strong&gt;trayecto de incremento&lt;/strong&gt; es de longitud como máximo &lt;code&gt;N&lt;/code&gt;, cada arco &lt;strong&gt;puede tener como máximo &lt;code&gt;N/2&lt;/code&gt;&lt;/strong&gt;, trayectos de incremento, &lt;strong&gt;y el número total de&lt;/strong&gt; trayectos de incremento &lt;strong&gt;es como máximo &lt;code&gt;NA/2&lt;/code&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;algoritmo Edmonds-Karp&lt;/strong&gt; se ejecuta en &lt;code&gt;O(NA^2)&lt;/code&gt;. Si a lo sumo &lt;strong&gt;los caminos&lt;/strong&gt; &lt;code&gt;NA/2&lt;/code&gt;  serán explorados durante el algoritmo y explorar cada &lt;strong&gt;trayectoria&lt;/strong&gt; con &lt;strong&gt;BFS&lt;/strong&gt; es &lt;code&gt;N+A&lt;/code&gt; entonces el término más significativo del producto y por lo tanto el complejidad asintótica &lt;code&gt;O(NA^2)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;mfp&lt;/code&gt; sea un &lt;code&gt;maxFlowProblemState&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;edmonds_karp&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(mfp)&lt;/span&gt;:&lt;/span&gt;
   sid, tid = mfp.sourceNodeUid, mfp.terminalNodeUid
   no_more_paths = &lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;
   loop_count = &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; no_more_paths):
      residual_digraph = get_residual_graph_of(mfp.G)
      &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
          asource = find_node_by_uid(mfp.sourceNodeUid, residual_digraph)
          aterm   = find_node_by_uid(mfp.terminalNodeUid, residual_digraph)
          apath   = bfs(asource, aterm, residual_digraph)
          paint_mfp_path(mfp, loop_count, apath)
          G = augment(apath, mfp.G)
          s = find_node_by_uid(sid, G)
          t = find_node_by_uid(tid, G)
          mfp = MaxFlowProblemState(G, s.uid, t.uid, mfp.maxFlowProblemStateUid)
          loop_count += &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
      &lt;span class=&quot;hljs-keyword&quot;&gt;except&lt;/span&gt; StopIteration &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; e:
          no_more_paths = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; mfp
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La versión anterior es ineficiente y tiene peor complejidad que &lt;code&gt;O(NA^2)&lt;/code&gt; ya que construye una nueva &lt;strong&gt;solución de flujo máximo&lt;/strong&gt; y una nueva &lt;strong&gt;gráfica residual&lt;/strong&gt; cada vez (en vez de modificar los &lt;strong&gt;dígrafos existentes&lt;/strong&gt; a medida que avanza el algoritmo). Para llegar a una solución &lt;code&gt;O(NA^2)&lt;/code&gt; verdadera el algoritmo debe mantener tanto el &lt;strong&gt;digrafo&lt;/strong&gt; que representa el &lt;strong&gt;estado de problema de flujo máximo&lt;/strong&gt; y su asociado ** gráfico residual&lt;strong&gt;. Por tanto, el algoritmo debe evitar repetir innecesariamente **arcos&lt;/strong&gt; y &lt;strong&gt;nodos&lt;/strong&gt; y actualizar sus valores y valores asociados en el &lt;strong&gt;gráfico residual&lt;/strong&gt; sólo cuando sea necesario.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para escribir un algoritmo &lt;strong&gt;Edmonds Karp&lt;/strong&gt; más rápido, reescribí varios fragmentos de código de lo anterior. Espero que pasar por el código que generó un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; fue útil en la comprensión de lo que está pasando. En el algoritmo rápido, uso algunos trucos nuevos y estructuras de datos de Python que no quiero detallar. Voy a decir que &lt;code&gt;a.fromNode&lt;/code&gt; y&lt;code&gt; a.toNode&lt;/code&gt; ahora son tratados como cadenas y uids a &lt;strong&gt;nodos&lt;/strong&gt;. Para este código, deje que &lt;code&gt;mfps&lt;/code&gt; sea un &lt;code&gt;maxFlowProblemState&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;import&lt;/span&gt; uuid

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;fast_get_mfps_flow&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(mfps)&lt;/span&gt;:&lt;/span&gt;
   flow_from_s = {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; mfps.G.setOfNodes &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; n.uid == mfps.sourceNodeUid}.pop().datum.flowOut
   flow_to_t   = {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; mfps.G.setOfNodes &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; n.uid == mfps.terminalNodeUid}.pop().datum.flowIn

   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( (flow_to_t - flow_from_s) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0.00&lt;/span&gt;):
       &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; Exception(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Infeasible s-t flow&#39;&lt;/span&gt;)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; flow_to_t

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;fast_e_k_preprocess&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   G = strip_flows(G)
   get = dict({})
   get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;] = dict({})
   get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_capacity&#39;&lt;/span&gt;] = dict({})
   get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_flow&#39;&lt;/span&gt;] = dict({})
   get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;] = dict({})
   get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;] = dict({})

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.fromNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfNodes):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;There is no Node {a.toNode.uid!s} to match the Arc from {a.fromNode.uid!s} to {a.toNode.uid!s}&#39;&lt;/span&gt;.format(**locals())
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; KeyError(err_msg)
       get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;][a.fromNode.uid] = a.fromNode
       get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;][a.toNode.uid]   = a.toNode
       lark = Arc(a.fromNode.uid, a.toNode.uid, FlowArcDatumWithUid(a.datum.capacity, a.datum.flow, uuid.uuid4()))
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.fromNode.uid &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;]):
           get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][a.fromNode.uid] = dict({a.toNode.uid : dict({lark.datum.uid : lark})})
       &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(a.toNode.uid &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][a.fromNode.uid]):
               get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][a.fromNode.uid][a.toNode.uid] = dict({lark.datum.uid : lark})
           &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
               get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][a.fromNode.uid][a.toNode.uid][lark.datum.uid] = lark

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.toNode.uid &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;]:
           get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][a.toNode.uid] = dict({})

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;]:
       get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;][n] = dict()
       get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_capacity&#39;&lt;/span&gt;][n] = dict()
       get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_flow&#39;&lt;/span&gt;][n] = dict()
       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; u &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;]:
           n_to_u_cap_sum  = sum(a.datum.capacity &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.fromNode.uid == n) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode.uid == u) )
           n_to_u_flow_sum = sum(a.datum.flow     &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.fromNode.uid == n) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode.uid == u) )

           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(n_to_u_cap_sum &amp;gt; n_to_u_flow_sum):
               flow = round(n_to_u_cap_sum - n_to_u_flow_sum, TOL)
               get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;][n][u] = Arc(n,u,ResidualDatum(flow, &lt;span class=&quot;hljs-string&quot;&gt;&#39;push&#39;&lt;/span&gt;))
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;(n_to_u_flow_sum &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0.0&lt;/span&gt;):
               flow = round(n_to_u_flow_sum, TOL)
               get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;][u][n] = Arc(u,n,ResidualDatum(flow, &lt;span class=&quot;hljs-string&quot;&gt;&#39;pull&#39;&lt;/span&gt;))

           get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_capacity&#39;&lt;/span&gt;][n][u] = n_to_u_cap_sum
           get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;node_to_node_flow&#39;&lt;/span&gt;][n][u]     = n_to_u_flow_sum

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; get

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;fast_bfs&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(sid, tid, get)&lt;/span&gt;:&lt;/span&gt;
   parent_of   = dict([])
   visited     = frozenset([])
   deq         = coll.deque([sid])
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; len(deq) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;:
       n = deq.popleft()
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; n == tid:
           &lt;span class=&quot;hljs-keyword&quot;&gt;break&lt;/span&gt;
       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; u &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;][n]:
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (u &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; visited):
               visited = visited.union(frozenset({u}))
               parent_of[u] = get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;residual_arcs&#39;&lt;/span&gt;][n][u]
               deq.extend([u])
   path = list([])
   curr = tid
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;(curr != sid):
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (curr &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; parent_of):
           err_msg = &lt;span class=&quot;hljs-string&quot;&gt;&#39;No augmenting path from {} to {}.&#39;&lt;/span&gt;.format(sid, curr)
           &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; StopIteration(err_msg)
       path.extend([parent_of[curr]])
       curr = parent_of[curr].fromNode
   path.reverse()
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; path

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;fast_edmonds_karp&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(mfps)&lt;/span&gt;:&lt;/span&gt;
   sid, tid = mfps.sourceNodeUid, mfps.terminalNodeUid
   get = fast_e_k_preprocess(mfps.G)
   no_more_paths, loop_count = &lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; no_more_paths):
      &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
          apath   = fast_bfs(sid, tid, get)
          get = fast_augment(apath, get)
          loop_count += &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
      &lt;span class=&quot;hljs-keyword&quot;&gt;except&lt;/span&gt; StopIteration &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; e:
          no_more_paths = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;
   nodes = frozenset(get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;nodes&#39;&lt;/span&gt;].values())
   arcs = frozenset({})
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; from_node &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;]:
       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; to_node &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][from_node]:
           &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; arc &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][from_node][to_node]:
               arcs |= frozenset({get[&lt;span class=&quot;hljs-string&quot;&gt;&#39;arcs&#39;&lt;/span&gt;][from_node][to_node][arc]})

   G = DiGraph(nodes, arcs)
   mfps = MaxFlowProblemState(G, sourceNodeUid=sid, terminalNodeUid=tid, maxFlowProblemStateUid=mfps.maxFlowProblemStateUid)
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; mfps
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;He aquí una visualización de cómo este algoritmo resuelve el ejemplo &lt;strong&gt;red de flujo&lt;/strong&gt; desde arriba. La visualización muestra los pasos que se reflejan en el &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; que representa la red de flujo &lt;strong&gt;más actualizada&lt;/strong&gt; y como se reflejan en el &lt;strong&gt;gráfico residual&lt;/strong&gt; de esa red de flujo . &lt;strong&gt;Los caminos de aumento&lt;/strong&gt; en el &lt;strong&gt;gráfico residual&lt;/strong&gt; se muestran como rutas rojas, y el &lt;strong&gt;digrafo&lt;/strong&gt; que representa el problema el conjunto de &lt;strong&gt;nodos&lt;/strong&gt; y &lt;strong&gt;arcos&lt;/strong&gt; afectados por un dado &lt;strong&gt;la ruta de aumento&lt;/strong&gt; se resalta en verde. En cada caso, resaltaré las partes del gráfico que se cambiarán (en rojo o verde) y luego mostraré el gráfico después de los cambios (sólo en negro).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización máxima del flujo&quot; height=&quot;331&quot; src=&quot;https://uploads.toptal.io/blog/image/124067/toptal-blog-image-1503924970456-18986a04aab51b0e72cf86ed759f5c19.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización Máxima de Flujo (Residual)&quot; height=&quot;330&quot; src=&quot;https://uploads.toptal.io/blog/image/124068/toptal-blog-image-1503924980496-49ac47c5f48301e312f4b503c1d975fe.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Aquí hay otra visualización de cómo este algoritmo resolviendo un ejemplo diferente &lt;strong&gt;red de flujo&lt;/strong&gt;. Observe que éste usa números reales y contiene varios &lt;strong&gt;arcos&lt;/strong&gt; con los mismos valores &lt;code&gt;fromNode&lt;/code&gt; y&lt;code&gt; toNode&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Observa también que debido a que los Arcos con un ‘pull’ ResidualDatum pueden ser parte de la Vía en Aumento, los nodos afectados en el DíGrafo de la Red de Flujo_no pueden estar en un camino en &lt;code&gt;G!&lt;/code&gt;.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;h2 id=&quot;grficos-bipartitos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;grficos-bipartitos&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Gráficos Bipartitos&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que tenemos un &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt; es &lt;a href=&quot;https://en.wikipedia.org/wiki/Bipartite_graph&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;bipartito&lt;/a&gt; si es posible particionar los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; en dos conjuntos (&lt;code&gt;part_1&lt;/code&gt; and &lt;code&gt;part_2&lt;/code&gt;) tal que para cualquier &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; no &lt;strong&gt;puede ser verdad&lt;/strong&gt; que &lt;code&gt;a.fromNode&lt;/code&gt; en &lt;code&gt;part_1&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; en &lt;code&gt;part_1&lt;/code&gt;. Tampoco &lt;strong&gt;puede ser verdad&lt;/strong&gt; que &lt;code&gt;a.fromNode&lt;/code&gt; en &lt;code&gt;part_2&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; en &lt;code&gt;part_2&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;En otras palabras, &lt;code&gt;G&lt;/code&gt; es &lt;strong&gt;bi-partición&lt;/strong&gt; si puede dividirse en dos conjuntos de &lt;strong&gt;nodos&lt;/strong&gt; de tal manera que cada &lt;strong&gt;arco&lt;/strong&gt; debe conectar un &lt;strong&gt;nodo&lt;/strong&gt; en un conjunto a un nodo &lt;strong&gt;en el otro conjunto.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;pruebas-bipartitas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;pruebas-bipartitas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Pruebas Bipartitas&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que tenemos un &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;, queremos probar si es &lt;strong&gt;bi-partición&lt;/strong&gt;. Podemos hacer esto en &lt;code&gt;O(|G.setOfNodes|+|G.setOfArcs|)&lt;/code&gt; por codicioso color de la gráfica en dos colores.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Primero, necesitamos generar un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;. Este gráfico tendrá tendrá el mismo conjunto de &lt;strong&gt;nodos&lt;/strong&gt; como &lt;code&gt;G&lt;/code&gt;, pero tendrá más &lt;strong&gt;arcos&lt;/strong&gt; que&lt;code&gt; G&lt;/code&gt;. Cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en&lt;code&gt; G&lt;/code&gt; creará 2 &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;H&lt;/code&gt;; el primer &lt;strong&gt;arco&lt;/strong&gt; será idéntico a &lt;code&gt;a&lt;/code&gt;, y el segundo &lt;strong&gt;arco&lt;/strong&gt; invierte al director de &lt;code&gt;a&lt;/code&gt; ( &lt;code&gt;b = Arc(a.toNode,a.fromNode,a.datum)&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Bipartition = coll.namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Bipartition&#39;&lt;/span&gt;,[&lt;span class=&quot;hljs-string&quot;&gt;&#39;firstPart&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;secondPart&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&#39;G&#39;&lt;/span&gt;])
&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;bipartition&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(G)&lt;/span&gt;:&lt;/span&gt;
   nodes = frozenset(G.setOfNodes
   arcs  = frozenset(G.setOfArcs)
   arcs = arcs.union( frozenset( {Arc(a.toNode,a.fromNode,a.datum) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs} ) )
   H = DiGraph(nodes, arcs)
   H_as_dict = digraph_to_dict(H)
   color = dict([])
   some_node = next(iter(H.setOfNodes))
   deq = coll.deque([some_node])
   color[some_node] = -&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; len(deq) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;:
       curr = deq.popleft()
       &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H_as_dict.get(curr):
           &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; color):
               color[a.toNode] = -&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;*color[curr]
               deq.extend([a.toNode])
           &lt;span class=&quot;hljs-keyword&quot;&gt;elif&lt;/span&gt;(color[curr] == color[a.toNode]):
               print(curr,a.toNode)
               &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; Exception(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Not Bipartite.&#39;&lt;/span&gt;)

   firstPart  = frozenset( {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; color &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; color[n] == -&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt; } )
   secondPart = frozenset( {n &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; color &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; color[n] == &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt; } )

   &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( firstPart.union(secondPart) != G.setOfNodes ):
       &lt;span class=&quot;hljs-keyword&quot;&gt;raise&lt;/span&gt; Exception(&lt;span class=&quot;hljs-string&quot;&gt;&#39;Not Bipartite.&#39;&lt;/span&gt;)

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; Bipartition(firstPart, secondPart, G)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;coincidencias-y-coincidencias-mximas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;coincidencias-y-coincidencias-mximas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Coincidencias y Coincidencias Máximas&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que tenemos un &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; y&lt;code&gt; matching&lt;/code&gt; es un subconjunto de &lt;strong&gt;arcos&lt;/strong&gt; de &lt;code&gt;G.setOfArcs&lt;/code&gt;. &lt;code&gt;matching&lt;/code&gt; es un &lt;a href=&quot;https://en.wikipedia.org/wiki/Matching_(graph_theory)&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;matching&lt;/a&gt; si para dos &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; y &lt;code&gt;b&lt;/code&gt; en &lt;code&gt;matching&lt;/code&gt;: &lt;code&gt;len(frozenset( {a.fromNode} ).union( {a.toNode} ).union( {b.fromNode} ).union( {b.toNode} )) == 4&lt;/code&gt;. En otras palabras, ningún &lt;strong&gt;arco&lt;/strong&gt; en una &lt;strong&gt;coincidencia&lt;/strong&gt; comparte un &lt;strong&gt;nodo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La &lt;strong&gt;coincidencia&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt;, es una coincidencia máxima si no hay ninguna otra &lt;strong&gt;concordancia&lt;/strong&gt; &lt;code&gt;alt_matching&lt;/code&gt; en &lt;code&gt;G&lt;/code&gt; tanto que &lt;code&gt;len(matching) &amp;lt; len(alt_matching)&lt;/code&gt;. En otras palabras, &lt;code&gt;matching&lt;/code&gt; es una &lt;strong&gt;coincidencia máxima&lt;/strong&gt; Si es el set más largo de &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; que todavía satisface la definición de &lt;strong&gt;combinación&lt;/strong&gt; (la adición de cualquier &lt;strong&gt;arco&lt;/strong&gt; que no esté ya en la coincidencia romperá la &lt;strong&gt;combinación&lt;/strong&gt; definición).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una &lt;strong&gt;combinación máxima&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt; es una &lt;strong&gt;combinación perfecta&lt;/strong&gt; si para cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; existe un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;matching&lt;/code&gt; donde &lt;code&gt;a.fromNode == n or a.toNode == n&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;combinacin-bi-particionada-mxima&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;combinacin-bi-particionada-mxima&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Combinación Bi-Particionada Máxima&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una &lt;strong&gt;combinación bi-particionada máxima&lt;/strong&gt; es una &lt;strong&gt;combinación máxima&lt;/strong&gt; en un &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; que es &lt;strong&gt;bi-particionado&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Dado que &lt;code&gt;G&lt;/code&gt; es &lt;strong&gt;bi-particionado&lt;/strong&gt;, el problema de encontrar una &lt;strong&gt;combinación máxima bipartita&lt;/strong&gt; se puede transformar en un &lt;strong&gt;problema de flujo máximo&lt;/strong&gt; solucionable con el algoritmo &lt;strong&gt;de Edmonds-Karp&lt;/strong&gt; y entonces el &lt;strong&gt;acoplamiento bipartito máximo&lt;/strong&gt; puede ser recuperado del solución al &lt;strong&gt;problema de flujo máximo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Deja que &lt;code&gt;bipartition&lt;/code&gt; sea una &lt;strong&gt;bi-partición&lt;/strong&gt; de &lt;code&gt;G&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para ello, necesito generar un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; (&lt;code&gt;H&lt;/code&gt;) con algunos nuevos  &lt;strong&gt;nodos&lt;/strong&gt; (&lt;code&gt;H.setOfNodes&lt;/code&gt;) y algunos &lt;strong&gt;arcos&lt;/strong&gt; nuevos (&lt;code&gt;H.setOfArcs&lt;/code&gt;). &lt;code&gt;H.setOfNodes&lt;/code&gt; contiene todos los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; y dos &lt;strong&gt;nodos&lt;/strong&gt; más, &lt;code&gt;s&lt;/code&gt; (un &lt;strong&gt;nodo fuente&lt;/strong&gt;) y &lt;code&gt;t&lt;/code&gt; (un &lt;strong&gt;nodo terminal&lt;/strong&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;code&gt;H.setOfArcs&lt;/code&gt; contendrá un &lt;strong&gt;arco&lt;/strong&gt; por cada &lt;code&gt;G.setOfArcs&lt;/code&gt;. Si un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; es un &lt;code&gt;G.setOfArcs&lt;/code&gt; y &lt;code&gt;a.fromNode&lt;/code&gt; está en &lt;code&gt;bipartition.firstPart&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; está en &lt;code&gt;bipartition.secondPart&lt;/code&gt; y luego incluye &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;H&lt;/code&gt; (agregando un &lt;code&gt;FlowArcDatum(1,0)&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si &lt;code&gt;a.fromNode&lt;/code&gt; es una &lt;code&gt;bipartition.secondPart&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; es una &lt;code&gt;bipartition.firstPart&lt;/code&gt;, luego incluye &lt;code&gt;Arc(a.toNode,a.fromNode,FlowArcDatum(1,0))&lt;/code&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La definición de un gráfico &lt;strong&gt;bi-particionado&lt;/strong&gt; asegura que ningún &lt;strong&gt;arco&lt;/strong&gt; conecte cualquier &lt;strong&gt;nodo&lt;/strong&gt; donde ambos &lt;strong&gt;nodos&lt;/strong&gt; están en la misma partición. &lt;code&gt;H.setOfArcs&lt;/code&gt; también contiene un &lt;strong&gt;arco&lt;/strong&gt; de &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; a cada &lt;strong&gt;nodo&lt;/strong&gt; en&lt;code&gt; bipartition.firstPart&lt;/code&gt;. Por último, &lt;code&gt;H.setOfArcs&lt;/code&gt; contiene un &lt;strong&gt;arco&lt;/strong&gt; cada &lt;strong&gt;node&lt;/strong&gt; en&lt;code&gt; bipartition.secondPart&lt;/code&gt; un &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;t&lt;/code&gt;. &lt;code&gt;a.datum.capacity = 1&lt;/code&gt; por todas las &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Primera partición de los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;G.setOfNodes&lt;/code&gt; los dos sets (&lt;code&gt;part1&lt;/code&gt; and &lt;code&gt;part2&lt;/code&gt;) &lt;a href=&quot;https://en.wikipedia.org/wiki/Disjoint_sets&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;separados&lt;/a&gt; tanto que ningún &lt;strong&gt;arco&lt;/strong&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; se dirige desde un conjunto al mismo conjunto (esta partición es posible porque &lt;code&gt;G&lt;/code&gt; está &lt;strong&gt;bi-particionado&lt;/strong&gt;). A continuación, agregue todos los &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;G.setOfArcs&lt;/code&gt; los cuales están dirigidos de la &lt;code&gt;part1&lt;/code&gt; a la &lt;code&gt;part2&lt;/code&gt; hacia &lt;code&gt;H.setOfArcs&lt;/code&gt;. A continuación, cree un único nodo &lt;strong&gt;fuente&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt; y un único nodo &lt;strong&gt;terminal&lt;/strong&gt;&lt;code&gt; t&lt;/code&gt; y cree más &lt;strong&gt;arcos&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Luego, construye un &lt;code&gt;maxFlowProblemState&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;solve_mbm&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;( bipartition )&lt;/span&gt;:&lt;/span&gt;
   s = Node(uuid.uuid4(), FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;))
   t = Node(uuid.uuid4(), FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;))

   translate = {}
   arcs = frozenset([])
   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.G.setOfArcs:
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart) ):
           fark = Arc(a.fromNode,a.toNode,FlowArcDatum(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;))
           arcs = arcs.union({fark})
           translate[frozenset({a.fromNode.uid,a.toNode.uid})] = a
       &lt;span class=&quot;hljs-keyword&quot;&gt;elif&lt;/span&gt; ( (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart) ):
           bark = Arc(a.toNode,a.fromNode,FlowArcDatum(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;))
           arcs = arcs.union({bark})
           translate[frozenset({a.fromNode.uid,a.toNode.uid})] = a
   arcs1 = frozenset( {Arc(s,n,FlowArcDatum(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart } )
   arcs2 = frozenset( {Arc(n,t,FlowArcDatum(&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart } )
   arcs = arcs.union(arcs1.union(arcs2))

   nodes = frozenset( {Node(n.uid,FlowNodeDatum(&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;,&lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.G.setOfNodes} ).union({s}).union({t})
   G = DiGraph(nodes, arcs)
   mfp = MaxFlowProblemState(G, s.uid, t.uid, &lt;span class=&quot;hljs-string&quot;&gt;&#39;bipartite&#39;&lt;/span&gt;)
   result = edmonds_karp(mfp)

   lookup_set = {a &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; result.G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (a.datum.flow &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.fromNode.uid != s.uid) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode.uid != t.uid)}
   matching = {translate[frozenset({a.fromNode.uid,a.toNode.uid})] &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; lookup_set}

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; matching
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cubierta-mnima-de-nodo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;cubierta-mnima-de-nodo&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Cubierta Mínima de Nodo&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una cubierta de nodo en un &lt;strong&gt;dígrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; es un conjunto de &lt;strong&gt;nodos&lt;/strong&gt; (&lt;code&gt;cover&lt;/code&gt;) proveniente de &lt;code&gt;G.setOfNodes&lt;/code&gt; tanto que para cualquier &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; de &lt;code&gt;G.setOfArcs&lt;/code&gt; esto debe ser verdad: &lt;code&gt;(a.fromNode en cubierta) o (a.toNode en cubierta)&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Una cubierta de nodo mínima es el set más pequeño de &lt;strong&gt;nodos&lt;/strong&gt; en la grífica que sigue siendo una &lt;strong&gt;cubierta de nodo&lt;/strong&gt;. El teorema de König indica que en un gráfico &lt;strong&gt;bi-particionado&lt;/strong&gt;, el tamaño de la &lt;strong&gt;coincidencia máxima&lt;/strong&gt; en ese gráfico es igual al tamaño de la &lt;strong&gt;cubierta de nodo mínima&lt;/strong&gt;, y sugiere cómo la cubierta del nodo puede recuperarse de una &lt;strong&gt;coincidencia máxima&lt;/strong&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que tenemos la &lt;strong&gt;bi-partición&lt;/strong&gt; &lt;code&gt;bipartition&lt;/code&gt; y la &lt;strong&gt;coincidencia máxima&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt;. Define un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;, &lt;code&gt;H.setOfNodes=G.setOfNodes&lt;/code&gt;, los &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt; son la unión de dos sets.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El primer set de &lt;strong&gt;arcos&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;matching&lt;/code&gt;, con el cambio que si &lt;code&gt;a.fromNode in bipartition.firstPart&lt;/code&gt; y &lt;code&gt;a.toNode en bipartition.secondPart&lt;/code&gt; entonces &lt;code&gt;a.fromNode&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; son intercambiados en el &lt;strong&gt;acro creado&lt;/strong&gt; le dan a tales &lt;strong&gt;arcos&lt;/strong&gt; un atributo &lt;code&gt;a.datum.inMatching = True&lt;/code&gt; para indicar que se derivaron de &lt;strong&gt;arcos&lt;/strong&gt; en una &lt;strong&gt;coincidencia&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El segundo conjunto es &lt;strong&gt;arcos&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; NO en&lt;code&gt; matching&lt;/code&gt;, con el cambio que si &lt;code&gt;a.fromNode en bipartition.secondPart&lt;/code&gt; y&lt;code&gt; a.toNode en bipartition.firstPart&lt;/code&gt; entonces &lt;code&gt;a.fromNode&lt;/code&gt; y&lt;code&gt; a.toNode&lt;/code&gt; se intercambian en el &lt;strong&gt;arco&lt;/strong&gt; creado (da a tal &lt;strong&gt;arco&lt;/strong&gt; un atributo &lt;code&gt;a.datum.inMatching = False&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;A continuación, ejecute una &lt;strong&gt;primera búsqueda de profundidad&lt;/strong&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Depth-first_search&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;DFS&lt;/a&gt;) a partir de cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en&lt;code&gt; bipartition.firstPart&lt;/code&gt; que no es &lt;code&gt;n == a.fromNode&lt;/code&gt; ni&lt;code&gt; n == a.toNodes&lt;/code&gt; para cualquier &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en&lt;code&gt; matching&lt;/code&gt;. Durante el DFS, algunos &lt;strong&gt;nodos&lt;/strong&gt; son visitados y otros no (almacene esta información en un campo &lt;code&gt;n.datum.visited&lt;/code&gt;). La &lt;strong&gt;cubierta de nodo mínima&lt;/strong&gt; es la unión de los &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;{a.fromNode para a en H.setOfArcs si ((a.datum.inMatching) y (a.fromNode.datum.visited))} &lt;/code&gt;y los nodos &lt;strong&gt;&lt;code&gt;{a.fromNode para a en H.setOfArcs si (a.datum.inMatching) y (no a.toNode.datum.visited)}&lt;/code&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto puede demostrarse que conduce desde una &lt;strong&gt;coincidencia máxima&lt;/strong&gt; a una &lt;strong&gt;cubierta de nodo mínima&lt;/strong&gt; por una &lt;a href=&quot;https://en.wikipedia.org/wiki/Proof_by_contradiction&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;prueba por contradicción&lt;/a&gt;, tomar un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; que supuestamente no estaba cubierto y considerar todos los cuatro casos sobre si &lt;code&gt;a.fromNode&lt;/code&gt; y &lt;code&gt;a.toNode&lt;/code&gt; pertenecen (ya sea como&lt;code&gt; toNode&lt;/code&gt; o &lt;code&gt;fromNode&lt;/code&gt;) a cualquier &lt;strong&gt;arco&lt;/strong&gt; en &lt;strong&gt;coincidencia&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt;. Cada caso lleva a una contradicción debido al orden en que DFS visita &lt;strong&gt;nodos&lt;/strong&gt; y el hecho de que &lt;code&gt;matching&lt;/code&gt; es un &lt;strong&gt;matching máximo&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que tenemos una función para ejecutar estos pasos y devolver el conjunto de &lt;strong&gt;nodos&lt;/strong&gt; que comprende la &lt;strong&gt;cubierta de nodo mínima&lt;/strong&gt; cuando se le da el &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt;, y la &lt;strong&gt;coincidencia máxima&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;ArcMatchingDatum = coll.namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;ArcMatchingDatum&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;inMatching&#39;&lt;/span&gt; ])
NodeMatchingDatum = coll.namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;NodeMatchingDatum&#39;&lt;/span&gt;, [&lt;span class=&quot;hljs-string&quot;&gt;&#39;visited&#39;&lt;/span&gt;])

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;dfs_helper&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(snodes, G)&lt;/span&gt;:&lt;/span&gt;
   sniter, do_stop = iter(snodes), &lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;
   visited, visited_uids = set(), set()
   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; do_stop):
       &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
           stack = [ next(sniter) ]
           &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt; len(stack) &amp;gt; &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;:
               curr = stack.pop()
               &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; curr.uid &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; visited_uids:
                   visited = visited.union( frozenset( {Node(curr.uid, NodeMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;))} ) )
                   visited_uids = visited.union(frozenset({curr.uid}))
                   succ = frozenset({a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.fromNode == curr})
                   stack.extend( succ.difference( frozenset(visited) ) )
       &lt;span class=&quot;hljs-keyword&quot;&gt;except&lt;/span&gt; StopIteration &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; e:
           stack, do_stop = [], &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; visited

&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;get_min_node_cover&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(matching, bipartition)&lt;/span&gt;:&lt;/span&gt;
   nodes = frozenset( { Node(n.uid, NodeMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.G.setOfNodes} )
   G = DiGraph(nodes, &lt;span class=&quot;hljs-keyword&quot;&gt;None&lt;/span&gt;)
   charcs = frozenset( {a &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart) )} )
   arcs0 = frozenset( { Arc(find_node_by_uid(a.toNode.uid,G), find_node_by_uid(a.fromNode.uid,G), ArcMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;) ) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; charcs } )
   arcs1 = frozenset( { Arc(find_node_by_uid(a.fromNode.uid,G), find_node_by_uid(a.toNode.uid,G), ArcMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;) ) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching.difference(charcs) } )
   not_matching = bipartition.G.setOfArcs.difference( matching )
   charcs = frozenset( {a &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; not_matching &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart) )} )
   arcs2 = frozenset( { Arc(find_node_by_uid(a.toNode.uid,G), find_node_by_uid(a.fromNode.uid,G), ArcMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;) ) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; charcs } )
   arcs3 = frozenset( { Arc(find_node_by_uid(a.fromNode.uid,G), find_node_by_uid(a.toNode.uid,G), ArcMatchingDatum(&lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;) ) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; not_matching.difference(charcs) } )
   arcs = arcs0.union(arcs1.union(arcs2.union(arcs3)))

   G = DiGraph(nodes, arcs)
   bip = Bipartition({find_node_by_uid(n.uid,G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart},{find_node_by_uid(n.uid,G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart},G)
   match_from_nodes = frozenset({find_node_by_uid(a.fromNode.uid,G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching})
   match_to_nodes = frozenset({find_node_by_uid(a.toNode.uid,G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching})
   snodes = bip.firstPart.difference(match_from_nodes).difference(match_to_nodes)
   visited_nodes = dfs_helper(snodes, bip.G)
   not_visited_nodes = bip.G.setOfNodes.difference(visited_nodes)

   H = DiGraph(visited_nodes.union(not_visited_nodes), arcs)
   cover1 = frozenset( {a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.datum.inMatching) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.fromNode.datum.visited) ) } )
   cover2 = frozenset( {a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.datum.inMatching) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; a.toNode.datum.visited) ) } )
   min_cover_nodes = cover1.union(cover2)
   true_min_cover_nodes = frozenset({find_node_by_uid(n.uid, bipartition.G) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; min_cover_nodes})

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; min_cover_nodes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;el-problema-de-asignacin-lineal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;el-problema-de-asignacin-lineal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El Problema de Asignación Lineal&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El problema de asignación lineal consiste en encontrar una máxima coincidencia de pesos en un gráfico bipartito ponderado.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Problemas como el que aparece al comienzo de este post pueden expresarse como un problema &lt;strong&gt;de asignación lineal&lt;/strong&gt;. Dado un conjunto de trabajadores, un conjunto de tareas, y una función que indica la rentabilidad de una asignación de un trabajador a una tarea, queremos maximizar la suma de todas las asignaciones que hacemos; esto es un &lt;strong&gt;problema de asignación lineal&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que el número de tareas y los trabajadores son iguales, aunque voy a demostrar que esta suposición es fácil de quitar. En la implementación, represento &lt;strong&gt;pesos de arco&lt;/strong&gt; con un atributo &lt;code&gt;a.datum.weight&lt;/code&gt; para un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;WeightArcDatum = namedtuple(&lt;span class=&quot;hljs-string&quot;&gt;&#39;WeightArcDatum&#39;&lt;/span&gt;, [weight])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;algoritmo-kuhn-munkres&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;algoritmo-kuhn-munkres&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Algoritmo Kuhn-Munkres&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El Algoritmo de Kuhn-Munkres resuelve el &lt;strong&gt;problema de asignación lineal&lt;/strong&gt;. Una buena implementación puede tomar tiempo &lt;code&gt;O(N^{4})&lt;/code&gt;, 
(donde &lt;code&gt;N&lt;/code&gt; es el número de &lt;strong&gt;nodos&lt;/strong&gt; en el &lt;strong&gt;digrafo&lt;/strong&gt; que representa el problema). Una implementación que es más fácil de explicar toma &lt;code&gt;O (N ^ {5})&lt;/code&gt; (para una versión que regenera &lt;strong&gt;digrafos&lt;/strong&gt;) y &lt;code&gt;O (N ^ {4})&lt;/code&gt; para (para una versión que mantiene los &lt;strong&gt;digrafos&lt;/strong&gt;). Esto es similar a las dos implementaciones diferentes del algoritmo &lt;strong&gt;Edmonds-Karp&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Para esta descripción, sólo estoy trabajando con gráficos bipartitos completos (aquellos donde la mitad de los &lt;strong&gt;nodos&lt;/strong&gt; están en una parte de la &lt;strong&gt;bi-partición&lt;/strong&gt; y la otra mitad en la segunda parte). En el trabajador, la motivación de la tarea significa que hay tantos trabajadores como tareas.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esto parece una condición significativa (¿qué sucede si estos conjuntos no son iguales?), Pero es fácil solucionar este problema; Hablo de cómo hacerlo en la última sección.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;La versión del algoritmo descrito aquí utiliza el concepto útil de &lt;strong&gt;arcos de peso cero&lt;/strong&gt;. Desafortunadamente, este concepto sólo tiene sentido cuando estamos resolviendo una &lt;strong&gt;minimización&lt;/strong&gt; (si en vez de maximizar los beneficios de nuestras asignaciones de tareas de trabajadores, en vez de eso minimizamos el costo de tales asignaciones).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Afortunadamente, es fácil convertir un &lt;strong&gt;problema de asignación lineal máximo&lt;/strong&gt; en un &lt;strong&gt;problema de asignación lineal mínimo&lt;/strong&gt; estableciendo cada uno de los pesos de &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en&lt;code&gt; M-a.datum.weight&lt;/code&gt; donde &lt;code&gt;M=max({a.datum.weight for a in G.setOfArcs})&lt;/code&gt;. 
La solución al problema de maximización &lt;strong&gt;original será idéntica a la solución&lt;/strong&gt; minimizando el problema después de que se cambien los pesos &lt;strong&gt;de arco&lt;/strong&gt;. Así que para el resto, supongamos que hacemos este cambio.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El &lt;strong&gt;algoritmo Kuhn-Munkres&lt;/strong&gt; resuelve 
&lt;strong&gt;ponderación de peso mínima en un gráfico bi-particionado ponderado&lt;/strong&gt; por una secuencia de &lt;strong&gt;concordancias máximas&lt;/strong&gt; en gráficos &lt;strong&gt;no ponderados&lt;/strong&gt; bipartitos. Si a encontramos una &lt;strong&gt;concordancia perfecta&lt;/strong&gt; en la &lt;strong&gt;representación del digrafo&lt;/strong&gt; del problema de asignación lineal y si el peso de cada &lt;strong&gt;arco&lt;/strong&gt; en la &lt;strong&gt;coincidencia&lt;/strong&gt; es cero, entonces hemos encontrado la &lt;strong&gt;ponderación de peso mínimo&lt;/strong&gt; ya que esta coincidencia sugiere que todos &lt;strong&gt;nodos&lt;/strong&gt; en el &lt;strong&gt;digrafos&lt;/strong&gt; han sido &lt;strong&gt;emparejado&lt;/strong&gt; por un &lt;strong&gt;arco&lt;/strong&gt; con el menor costo posible ( ningún coste puede ser inferior a 0, basado en definiciones anteriores).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Ningún otro &lt;strong&gt;arcos&lt;/strong&gt; se puede agregar a la &lt;strong&gt;coincidencia&lt;/strong&gt; (ya que todos &lt;strong&gt;nodos&lt;/strong&gt; ya están emparejados) y no &lt;strong&gt;arcos&lt;/strong&gt; debe ser eliminado de la &lt;strong&gt;coincidente&lt;/strong&gt; porque cualquier posible reemplazo &lt;strong&gt;arco&lt;/strong&gt; tendrá al menos un valor de peso tan grande.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si encontramos una &lt;strong&gt;coincidencia máxima&lt;/strong&gt; del &lt;a href=&quot;https://en.wikipedia.org/wiki/Graph_theory#Subgraphs.2C_induced_subgraphs.2C_and_minors&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;subgrafo&lt;/a&gt; 
de &lt;code&gt;G&lt;/code&gt; que contiene sólo &lt;strong&gt;arcos de peso cero&lt;/strong&gt;, y no es una &lt;strong&gt;concordancia perfecta&lt;/strong&gt;, no tenemos una solución completa (ya que &lt;strong&gt;la combinación&lt;/strong&gt; no es &lt;strong&gt;perfecta&lt;/strong&gt;). Sin embargo, podemos producir un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt; cambiando los pesos de &lt;strong&gt;arcos&lt;/strong&gt; en&lt;code&gt; G.setOfArcs&lt;/code&gt; de manera que aparezcan nuevos 0-peso &lt;strong&gt;arcos&lt;/strong&gt; y la solución óptima de «H» es la misma que la solución óptima de «G». Dado que garantizamos que al menos un &lt;strong&gt;arco de peso cero&lt;/strong&gt; se produce en cada iteración, garantizamos que llegaremos a un &lt;strong&gt;coincidencia perfecta&lt;/strong&gt; en no más de &lt;strong&gt;|G.setOfNodes|^{2}=N^{2}&lt;/strong&gt; en tales iteraciones.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que en la &lt;strong&gt;bi-partición&lt;/strong&gt; &lt;code&gt;bipartition&lt;/code&gt;, &lt;code&gt;bipartition.firstPart&lt;/code&gt; contiene &lt;strong&gt;nodos&lt;/strong&gt; representando trabajadores, y &lt;code&gt;bipartition.secondPart&lt;/code&gt; representa &lt;strong&gt;nodos&lt;/strong&gt; que al mismo tiempo representa pruebas.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;El algoritmo comienza generando un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;H&lt;/code&gt;. &lt;code&gt;H.setOfNodes = G.setOfNodes&lt;/code&gt;. Algunos &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;H&lt;/code&gt; son &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; generados  en &lt;code&gt;bipartition.firstPart&lt;/code&gt;. Cada &lt;strong&gt;nodo&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; genera un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;b&lt;/code&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt; por cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;bipartition.G.setOfArcs&lt;/code&gt; donde &lt;code&gt;a.fromNode = n&lt;/code&gt; or &lt;code&gt;a.toNode = n&lt;/code&gt;, &lt;code&gt;b=Arc(a.fromNode, a.toNode, a.datum.weight - z)&lt;/code&gt; donde &lt;code&gt;z=min(x.datum.weight for x in G.setOfArcs if ( (x.fromNode == n) or (x.toNode == n) ))&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Más &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;H&lt;/code&gt; se generan por &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; en &lt;code&gt;bipartition.secondPart&lt;/code&gt;. Cada uno de estos &lt;strong&gt;nodos&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; genera un &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;b&lt;/code&gt; en &lt;code&gt;H.setOfArcs&lt;/code&gt; por cada &lt;strong&gt;arco&lt;/strong&gt; &lt;code&gt;a&lt;/code&gt; en &lt;code&gt;bipartition.G.setOfArcs&lt;/code&gt; donde &lt;code&gt;a.fromNode = n&lt;/code&gt; o &lt;code&gt;a.toNode = n&lt;/code&gt;, &lt;code&gt;b=Arc(a.fromNode, a.toNode, ArcWeightDatum(a.datum.weight - z))&lt;/code&gt; donde &lt;code&gt;z=min(x.datum.weight for x in G.setOfArcs if ( (x.fromNode == n) or (x.toNode == n) ))&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;strong&gt;KMA:&lt;/strong&gt;  Luego, forma un nuevo &lt;strong&gt;digrafo&lt;/strong&gt; &lt;code&gt;K&lt;/code&gt; compuesto sólo de los &lt;strong&gt;arcos de peso cero&lt;/strong&gt; de &lt;code&gt;H&lt;/code&gt;, y los &lt;strong&gt;nodos&lt;/strong&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Glossary_of_graph_theory_terms#incident&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;incidente&lt;/a&gt; 
en esos &lt;strong&gt;arcos&lt;/strong&gt;. Forma una &lt;code&gt;bipartition&lt;/code&gt; en los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;K&lt;/code&gt;, luego usa &lt;code&gt;solve_mbm( bipartition )&lt;/code&gt; para obtener una &lt;strong&gt;combinación máxima&lt;/strong&gt; (&lt;code&gt;matching&lt;/code&gt;) en &lt;code&gt;K&lt;/code&gt;. Si &lt;code&gt;matching&lt;/code&gt; es una &lt;strong&gt;combinación perfecta&lt;/strong&gt; en &lt;code&gt;H&lt;/code&gt; (los &lt;strong&gt;arcos&lt;/strong&gt; en &lt;code&gt;matching&lt;/code&gt; son &lt;strong&gt;incidente&lt;/strong&gt; en todos los &lt;strong&gt;nodos&lt;/strong&gt; en &lt;code&gt;H.setOfNodes&lt;/code&gt;) entonces &lt;code&gt;matching&lt;/code&gt; es una solución óptima para &lt;strong&gt;problema de asignación lineal&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;De lo contrario, si &lt;code&gt;matching&lt;/code&gt; no es &lt;strong&gt;perfecto&lt;/strong&gt;, genera la &lt;strong&gt;cubierta de nodo mínima&lt;/strong&gt; de&lt;code&gt; K&lt;/code&gt; usando &lt;code&gt;node_cover = get_min_node_cover(matching, bipartition(K))&lt;/code&gt;. Luego, define &lt;code&gt;z=min({a.datum.weight for a in H.setOfArcs if a not in node_cover})&lt;/code&gt;. Define &lt;code&gt;nodes = H.setOfNodes&lt;/code&gt;, &lt;code&gt;arcs1 = {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh-z)) for a in H.setOfArcs if ( (a.fromNode not in node_cover) and (a.toNode not in node_cover)}&lt;/code&gt;, &lt;code&gt;arcs2 = {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh)) for a in H.setOfArcs if ( (a.fromNode not in node_cover) != (a.toNode not in node_cover)}&lt;/code&gt;, &lt;code&gt;arcs3 = {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh+z)) for a in H.setOfArcs if ( (a.fromNode in node_cover) and (a.toNode in node_cover)}&lt;/code&gt;. El &lt;code&gt;!=&lt;/code&gt; símbolo en la expresión anterior actúa como un operador &lt;a href=&quot;https://en.wikipedia.org/wiki/Exclusive_or&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;XOR&lt;/a&gt;. Luego &lt;code&gt;arcs = arcs1.union(arcs2.union(arcs3))&lt;/code&gt;. Luego, &lt;code&gt;H=DiGraph(nodes,arcs)&lt;/code&gt;. Regresa a la marca &lt;strong&gt;KMA&lt;/strong&gt;. El algoritmo continúa hasta que se produce una &lt;strong&gt;combinación perfecta&lt;/strong&gt;. Esta &lt;strong&gt;combinación&lt;/strong&gt; es también la solución al &lt;strong&gt;problema de asignación lineal&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;language-python hljs&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;kuhn_munkres&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;( bipartition )&lt;/span&gt;:&lt;/span&gt;
   nodes = bipartition.G.setOfNodes
   arcs = frozenset({})

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.firstPart:
       z = min( {x.datum.weight &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (x.fromNode == n) &lt;span class=&quot;hljs-keyword&quot;&gt;or&lt;/span&gt; (x.toNode == n) )} )
       arcs = arcs.union( frozenset({Arc(a.fromNode, a.toNode, ArcWeightDatum(a.datum.weight - z)) }) )

   &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.secondPart:
       z = min( {x.datum.weight &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; bipartition.G.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (x.fromNode == n) &lt;span class=&quot;hljs-keyword&quot;&gt;or&lt;/span&gt; (x.toNode == n) )} )
       arcs = arcs.union( frozenset({Arc(a.fromNode, a.toNode, ArcWeightDatum(a.datum.weight - z)) }) )

   H = DiGraph(nodes, arcs)

   assignment, value = dict({}), &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
   not_done = &lt;span class=&quot;hljs-keyword&quot;&gt;True&lt;/span&gt;

   &lt;span class=&quot;hljs-keyword&quot;&gt;while&lt;/span&gt;( not_done ):
       zwarcs = frozenset( {a &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a.datum.weight == &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;} )
       znodes = frozenset( {n.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; zwarcs} ).union( frozenset( {n.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; zwarcs} ) )
       K = DiGraph(znodes, zwarcs)
       k_bipartition = bipartition(K)
       matching = solve_mbm( k_bipartition )
       mnodes = frozenset({a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching}).union(frozenset({a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching}))
       &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt;( len(mnodes) == len(H.setOfNodes) ):
           &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching:
               assignment[ a.fromNode.uid ] = a.toNode.uid
           value = sum({a.datum.weight &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; matching})
           not_done = &lt;span class=&quot;hljs-keyword&quot;&gt;False&lt;/span&gt;
       &lt;span class=&quot;hljs-keyword&quot;&gt;else&lt;/span&gt;:
           node_cover = get_min_node_cover(matching, bipartition(K))
           z = min( frozenset( {a.datum.weight &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover} ) )
           nodes = H.setOfNodes
           arcs1 = frozenset( {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh-z)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover)} )
           arcs2 = frozenset( {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover) != (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover)} )
           arcs3 = frozenset( {Arc(a.fromNode,a.toNode,ArcWeightDatum(a.datum.weigh+z)) &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; H.setOfArcs &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; ( (a.fromNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover) &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; (a.toNode &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; node_cover)} )
           arcs = arcs1.union(arcs2.union(arcs3))
           H = DiGraph(nodes,arcs)

   &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; value, assignment
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Esta implementación es &lt;code&gt;O(N^{5})&lt;/code&gt; porque genera una nueva &lt;strong&gt;combinación máxima&lt;/strong&gt; &lt;code&gt;matching&lt;/code&gt; en cada iteración; similar a las dos implementaciones anteriores de &lt;strong&gt;Edmonds-Karp&lt;/strong&gt; este algoritmo puede ser modificado para que siga la pista de la coincidencia y la adapte inteligentemente a cada iteración. Cuando esto se hace, la complejidad se convierte en &lt;code&gt;O(N^{4})&lt;/code&gt;. Una versión más avanzada y más reciente de este algoritmo (que requiere algunas estructuras de datos más avanzadas) puede ejecutarse en &lt;code&gt;O (N ^ {3})&lt;/code&gt;. Detalles de la implementación más sencilla anterior y la implementación más avanzada se puede encontrar en &lt;a href=&quot;https://www.topcoder.com/community/data-science/data-science-tutorials/assignment-problem-and-hungarian-algorithm/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;esta publicación&lt;/a&gt; que motivó este blog.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Ninguna de las operaciones sobre los pesos del &lt;strong&gt;arco&lt;/strong&gt; modifica la asignación final devuelta por el algoritmo. Por eso: Dado que nuestros gráficos de entrada son siempre &lt;strong&gt;gráficos completos bi-particionados&lt;/strong&gt;, una solución debe asignar cada &lt;strong&gt;nodo&lt;/strong&gt; en una partición a otro &lt;strong&gt;nodo&lt;/strong&gt; en la segunda partición, a través del &lt;strong&gt;arco&lt;/strong&gt; entre estos dos &lt;strong&gt;nodos&lt;/strong&gt;. Observe que las operaciones realizadas en los pesos de &lt;strong&gt;arco&lt;/strong&gt; nunca cambian el orden (ordenado por peso) de los &lt;strong&gt;arcos&lt;/strong&gt; incidentes en ningún nodo &lt;strong&gt;particular&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por lo tanto, cuando el algoritmo termina en un &lt;strong&gt;perfecta y completa bi-partición coincidente&lt;/strong&gt;, cada &lt;strong&gt;nodo&lt;/strong&gt; se le asigna un &lt;strong&gt;peso cero al arco&lt;/strong&gt;, ya que el orden relativo de los &lt;strong&gt;arcos&lt;/strong&gt; de que &lt;strong&gt;nodo&lt;/strong&gt; no ha cambiado durante el algoritmo y dado que un &lt;strong&gt;arco de peso cero&lt;/strong&gt; es el arco &lt;strong&gt;más barato posible&lt;/strong&gt; y el &lt;strong&gt;complemento bipartito completo perfecto&lt;/strong&gt; garantiza que existe un &lt;strong&gt;arco&lt;/strong&gt; para cada &lt;strong&gt;nodo&lt;/strong&gt;. Esto significa que la solución generada es de hecho la misma que la solución del problema &lt;strong&gt;de asignación lineal original&lt;/strong&gt; sin ninguna modificación de pesos de  &lt;strong&gt;arco&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;asignaciones-no-balanceadas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;asignaciones-no-balanceadas&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Asignaciones no Balanceadas&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Parece que el algoritmo es bastante limitado, ya que como se describe, opera sólo en &lt;strong&gt;gráficos bipartitos completos&lt;/strong&gt; (aquellos donde la mitad de los &lt;strong&gt;nodos&lt;/strong&gt; están en una parte de la &lt;strong&gt;bi-partición&lt;/strong&gt; y la otra mitad en el segundo parte). En el trabajador, la motivación de la tarea significa que hay tantos trabajadores como tareas (parece bastante limitante).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Sin embargo, hay una transformación fácil que elimina esta restricción. Supongamos que hay menos trabajadores que tareas, agregamos algunos trabajadores ficticios (lo suficiente para hacer que el gráfico resultante sea un &lt;strong&gt;gráfico bipartito completo&lt;/strong&gt;). Cada trabajador ficticio tiene un &lt;strong&gt;arco&lt;/strong&gt; dirigido del trabajador a cada una de las tareas. Cada uno de estos &lt;strong&gt;arco&lt;/strong&gt; tiene peso 0 (colocándolo en una coincidencia no da ningún beneficio adicional). Después de este cambio el gráfico es un &lt;strong&gt;gráfico bipartito completo&lt;/strong&gt; que podemos resolver. No se inicia ninguna tarea asignada a un trabajador ficticio.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supongamos que hay más tareas que los trabajadores. Añadimos algunas tareas ficticias (suficiente para hacer que el gráfico resultante sea un &lt;strong&gt;gráfico bi-particionado completo&lt;/strong&gt;). Cada tarea ficticia tiene un &lt;strong&gt;arco&lt;/strong&gt; dirigido de cada trabajador a la tarea ficticia. Cada uno de estos &lt;strong&gt;arco&lt;/strong&gt; tiene un peso de 0 (colocándolo en una coincidencia no da ningún beneficio adicional). Después de este cambio el gráfico es un &lt;strong&gt;gráfico bi-particionado completo&lt;/strong&gt; que podemos resolver. Cualquier trabajador asignado a la tarea ficticia no es empleado durante el período.&lt;/span&gt;&lt;br /&gt;
&lt;h2 id=&quot;ejemplo-de-asignacin-lineal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;ejemplo-de-asignacin-lineal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Ejemplo de asignación lineal&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por último, vamos a hacer un ejemplo con el código que he estado usando. Voy a modificar el ejemplo de problema de &lt;a href=&quot;https://en.wikipedia.org/wiki/Hungarian_algorithm#The_algorithm_in_terms_of_bipartite_graphs&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;. Tenemos 3 tareas: necesitamos &lt;strong&gt;limpiar el baño&lt;/strong&gt;, &lt;strong&gt;barrer el piso&lt;/strong&gt;, y &lt;strong&gt;lavar las ventanas&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Los trabajadores disponibles son &lt;strong&gt;Alice&lt;/strong&gt;, &lt;strong&gt;Bob&lt;/strong&gt;, &lt;strong&gt;Charlie&lt;/strong&gt; y &lt;strong&gt;Diane&lt;/strong&gt;. Cada uno de los trabajadores nos da el salario que requieren por tarea. Aquí están los salarios por trabajador:&lt;/span&gt;&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
   table {
       border-collapse: collapse;
       margin-bottom: 1em;
   }
   td, th {
       padding: 8px;
       border: 1px solid black;
       text-align: left;
   }
&lt;/style&gt;

&lt;br /&gt;
&lt;table&gt;
   &lt;thead&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Clean the Bathroom&lt;/span&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Sweep the Floor&lt;/span&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Wash the Windows&lt;/span&gt;&lt;/th&gt;
       &lt;/tr&gt;
&lt;/thead&gt;
   &lt;tbody&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Alice&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Bob&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Charlie&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Diane&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$9&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$9&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$1&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Si queremos pagar la menor cantidad de dinero, pero todavía obtener todas las tareas realizadas, ¿quién debe hacer qué tarea? Comienza introduciendo una tarea ficticia para que el digrafo que representa el problema bipartito.&lt;/span&gt;&lt;br /&gt;
&lt;table&gt;
   &lt;thead&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Clean the Bathroom&lt;/span&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Sweep the Floor&lt;/span&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Wash the Windows&lt;/span&gt;&lt;/th&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Do Nothing&lt;/span&gt;&lt;/th&gt;
       &lt;/tr&gt;
&lt;/thead&gt;
   &lt;tbody&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Alice&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$0&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Bob&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$0&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Charlie&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$3&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$2&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$0&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;tr&gt;
           &lt;th&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Diane&lt;/span&gt;&lt;/th&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$9&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$9&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$1&lt;/span&gt;&lt;/td&gt;
           &lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;$0&lt;/span&gt;&lt;/td&gt;
       &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Suponiendo que el problema está codificado en un &lt;strong&gt;digrafo&lt;/strong&gt;, entonces &lt;code&gt;kuhn_munkres( bipartition(G) )&lt;/code&gt; resolverá el problema y devolverá la asignación. Es fácil verificar que la asignación óptima (costo más bajo) costará $ 5.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;He aquí una visualización de la solución que el código anterior genera:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización de Flujo Máximo&quot; height=&quot;279&quot; src=&quot;https://uploads.toptal.io/blog/image/124061/toptal-blog-image-1503922944233-918c6faefd88554e45442287ce635def.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Visualización de Flujo Máximo (Residual)&quot; height=&quot;279&quot; src=&quot;https://uploads.toptal.io/blog/image/124062/toptal-blog-image-1503922967927-76f1d422af49bb49275afdbcdf9fa5fa.gif&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Eso es todo . Ya sabes todo lo que necesitas saber sobre el problema de asignación lineal.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Puedes encontrar todo el código de este artículo en &lt;a href=&quot;https://github.com/darkhipo/learning_graph_assign&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/resume/dmitri-ivanovich-arkhipov&quot;&gt;Dmitri Ivanovich Arkhipov&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Artículo vía: &lt;a href=&quot;https://www.toptal.com/algorithms/flujo-m%C3%A1ximo-y-el-problema-de-asignaci%C3%B3n-lineal/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/1262769866440311835/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/flujo-maximo-y-el-problema-de-asignacion-lineal_13.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1262769866440311835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1262769866440311835'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/flujo-maximo-y-el-problema-de-asignacion-lineal_13.html' title='Flujo Máximo y el Problema de Asignación Lineal'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-1743221283199853988</id><published>2017-10-01T16:24:00.001-03:00</published><updated>2017-10-01T16:24:10.044-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Design"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="UserExperience"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><title type='text'>Diseño Anticipatorio: Cómo Crear Experiencias de Usuarios Mágicos</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta mañana la canción “This Magic Moment” de The Drifters apareció en mi cabeza sin ninguna razón aparente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esas inquietantes redes neuronales en nuestro cerebro hacen cosas divertidas. Hacen que aparentemente conceptos y pensamientos no relacionados se conectan.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Golpeándome la frente me dije: “Pero, por supuesto …”&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Recientemente he estado pensando en esos momentos mágicos en UX que suceden cuando interactuamos con nuestros dispositivos o servicios digitales. Encontramos momentos perfectos, cuando todo cae en su lugar, exactamente en el camino correcto, exactamente en el momento adecuado, como si fuera mágico. Podría ser en tu banco, en tu coche, una máquina expendedora, o en tu teléfono.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Creo que la era del diseño anticipatorio está aquí, o al menos a nuestro alcance.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nuestras GUIs limitadas están cambiando como resultado de la evolución de las tecnologías y los métodos de entrada. Es una evolución orgánica, natural - ¡ por supuesto, ya estamos hablando con nuestros dispositivos!&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, mientras conducimos podríamos decir: “Llama a Anna.” Le pedimos a Siri que inicie un cronómetro o que las películas estén jugando cerca. Y le pedimos a Alexa que toque música o nos ordene el café. Sin embargo, las metáforas y los elementos gráficos establecidos hace más de cuatro décadas no han cambiado mucho.&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Pasado&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ten en cuenta que la GUI original de Xerox PARC tiene 44 años, pero nuestras interfaces de usuario todavía se ven muy bien.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122078/toptal-blog-image-1486057686653-f7a128e33b071de931520b7c8c7b18a1.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 870px;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
La estación de trabajo Xerox Star introdujo el primer sistema operativo de interfaz gráfica de usuario (GUI) comercial en 1973&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hoy en día, todavía estamos viendo pantallas bidimensionales y en su mayoría utilizan teclados y ratones para la entrada, dispositivos diseñados para métodos de interacción optimizados para ordenadores, no para humanos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las máquinas con las que interactuamos - ordenadores portátiles, escritorios, tablets,&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/mobile-ui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;móviles&amp;nbsp;&lt;/a&gt;, máquinas expendedoras, etc., diseñados y construidos con modelos mentales y tecnologías que son sistemas heredados del pasado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es como si estuviéramos utilizando modelos de interacción de la era de Los Picapiedras en un mundo de Los Supersónicos. Todavía dependen de mucha interacción de los usuarios (entrada) para pasar al siguiente paso y mostrar información útil (salida).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122079/toptal-blog-image-1486057776447-d70f6614ea0691e437200ebd32d7b1c5.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 1250px;&quot; /&gt;&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es el diseño anticipatorio?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La aplicación del diseño anticipatorio es más importante que nunca si las empresas digitales son para simplificar y facilitar el curso de nuestras vidas digitales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A la luz de esto, ¿qué es el diseño anticipatorio?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es de salida, sin mucha necesidad de entrada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un mundo donde nuestras máquinas de computación están diseñadas para los métodos de interacción optimizados para los seres humanos, no para las computadoras. Un mundo digital donde nos movemos de la intención del usuario que es determinista a probabilística.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aaron Shapiro de Huge&lt;a href=&quot;https://www.fastcodesign.com/3045039/the-next-big-thing-in-design-fewer-choices&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot; title=&quot;Aaron Shapiro de Huge define el diseño anticipatorio&quot;&gt;define el diseño anticipatorio&lt;/a&gt;&amp;nbsp;como un método para simplificar los procesos respondiendo a las necesidades un paso por delante de las decisiones del usuario, es decir, respondiendo a las necesidades de los usuarios que aún no han expresado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122080/toptal-blog-image-1486057985475-6d3254db6d32c5f6aaacbeffe1aefa31.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El diseño anticipado en su forma más fina va mucho más allá de la personalización.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, Netflix que muestra películas para ver en función de tus preferencias y el historial para la personalización. Con un diseño anticipado, la interfaz cambia realmente en el momento en que estás interactuando con una aplicación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122081/toptal-blog-image-1486058011969-34d7f8a8f97b3444d440d7dcee007abe.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
An example of personalization-not anticipatory design.&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El diseño anticipatorio significaría -en el caso de las compras en línea, por ejemplo- que el sistema conocería y personalizaría una experiencia en la medida en que se sentiría como una mano mágica guiando tu experiencia. En realidad, cambiaría la interfaz de usuario al instante, eliminaría cualquier información extraña y sólo presentaría las opciones más relevantes de manera oportuna, sencilla y eficiente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto no es demasiado difícil de lograr hoy.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Digamos que alguien está comprando una guitarra muy cara en guitarcenter.com. Al momento de pagar el sitio presentaría automágicamente “enviar a la tienda para ser recoger” como una opción por defecto porque sabe al observar el comportamiento pasado de otros usuarios comprando guitarras caras, estos preferirían recogerlas en la tienda más cercana.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para otro ejemplo, vamos a fingir que estás comprando una camisa en Amazon.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Amazon ya personaliza toda una serie de cosas para ti y debe saber tu tamaño y las preferencias de color ya que has comprado camisas en el sitio antes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al ir a la página de detalles del producto, podría pre-seleccionar tu tamaño, y mostrar las de color azul marino, blancas y a cuadros en primer lugar, y no poner importancia en los rosados ​​y amarillos, y no obligarte a seleccionar tu tamaño cada vez que veas distintas camisas.&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Por qué?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La promesa del diseño anticipatorio es la eliminación de la fricción y un aumento en la eficiencia que mejoraría en gran medida las experiencias de los usuarios y, a su vez, impactaría en los resultados. La gente vuelve a los productos y servicios que ofrecen lo que quieren cuando lo desean.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nuestras interacciones diarias con sistemas digitales han alcanzado una escala sin precedentes. Sin embargo, muchas de estas interacciones se sofocan con fricción y sentimientos subsiguientes de frustración.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122082/toptal-blog-image-1486058088572-6b5b40212343c9e025578c2d051fde08.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay una necesidad real de personalización y en una escala mayor que deleitaría a los usuarios, y simplificar sus vidas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Toma las máquinas expendedoras de billetes de autoservicio (ó ATMs), donde los viajeros pueden recargar tarjetas de viajero.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todavía están diseñados para ser mudos - impulsados por la entrada del usuario en el que todo el mundo se toma a través de la misma plétora frustrante de opciones.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Uno podría fácilmente imaginar un sistema mucho mejorado, más personalizado, donde el historial de recarga podría ser almacenado en su tarjeta.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En lugar de un sinnúmero de solicitudes de entrada: selecciona esta opción primero, luego selecciona esta otra opción, y así sucesivamente, toda la interacción podría comenzar con la inserción de la tarjeta que siempre se quiere recargar y el sistema inmediatamente mostraría: “Hola, ¿te gustaría volver a llenar esta tarjeta con $ 20, usando tu Mastercard? “&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El siguiente paso sería pagar y terminar la operación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Se reduciría el tiempo necesario para recargar las tarjetas por lo menos en un 75 por ciento, aumentar la eficiencia, mover a la gente más rápido y, posteriormente, hacerlos más satisfechos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto ya es posible, pero no sé de una sola máquina de venta de billetes que haga esto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122083/toptal-blog-image-1486058121367-ec98dd40875c7e8a70036830f5ea848d.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
Una interfaz de usuario &quot;tonto&quot; que requiere una gran cantidad de entrada frente a uno que es &quot;anticipatorio&quot;?&lt;/blockquote&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Interfaces del futuro.&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando la IA se vuelve más penetrante, un mayor grado de personalización permitirá un mayor nivel de diseño anticipatorio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Basado en todo tipo de seguimiento de comportamiento autorizado por el usuario - historiales de compra, preferencias, etc., el sistema lo reconocería y, con un alto grado de certeza, predecirá cuál podría ser tu próxima elección.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La falta de diseño anticipatorio es sorprendente dado que las tecnologías existen hoy en día que haría que hacerlo no es tan difícil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunas empresas ya están practicando las primeras formas de diseño anticipatorio. Dos ejemplos son&amp;nbsp;&lt;a href=&quot;http://www.androidcentral.com/google-now&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google Now&amp;nbsp;&lt;/a&gt;y&amp;nbsp;&lt;a href=&quot;https://ride.uber.com/en_US/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot; title=&quot;Uber&quot;&gt;Uber.&lt;/a&gt;&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Google Now&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La aplicación Google Now es una de las evoluciones más ambiciosas del software de búsqueda de Google.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La idea es simple: predecir lo que desearás o necesitarás saber antes de saber que lo necesitas o deseas, y servirlo en un formato de tarjeta fácil de leer.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las capacidades de minería de datos de Google son insuperables. Sabe quién eres, y puede mostrar tarjetas con información personalizada, información de localización, como eventos de calendario, clima local, noticias, precios de las acciones, vuelos, pases de embarque, hoteles, fotos cerca y mucho más. También le dice cuánto tiempo le llevará a llegar a casa del trabajo, basado en las condiciones actuales del tráfico.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si Google no cree que necesites algo en este momento, no se mostrará. Es la encarnación del diseño anticipatorio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122084/toptal-blog-image-1486058283019-a623107251c67e39f23e1c1ab4515ff5.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 750px;&quot; /&gt;&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Uber&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En la aplicación Uber, cuando tomas un viaje en algún lugar, proporcionará un botón de retorno en un lanzamiento posterior de la aplicación porque hay un 90 por ciento de posibilidades de que quieras volver a tu destino original. No es necesario especificar los lugares de recogida y entrega. Y eso es brillante.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122085/toptal-blog-image-1486058319919-b57e1350923ba93e1484bc3b628748b2.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 585px;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
La aplicación Uber ofrece a los usuarios un atajo rápido para &quot;Volver&quot; cuando se inicia poco después de completar un viaje&lt;/blockquote&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
The times they are a-changin&#39;.&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las cosas evolucionan a métodos naturales de interacción.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En un futuro no muy lejano, nuestra entrada será más fácil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Vamos a tener realidad aumentada y virtual con métodos de interacción, como la voz, el seguimiento de los gestos, el seguimiento de los ojos y el habla. Google ya está trabajando en ello. Se llama Proyecto Soli.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los métodos de diseño anticipados, asistidos por la IA y el aprendizaje automático, ofrecerán experiencias en un nivel completamente mejor.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122086/toptal-blog-image-1486058373460-c98d2f98cc85f97b9530b295ac2af6d2.jpeg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 800px;&quot; /&gt;&lt;/div&gt;
&lt;h2 style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo ponemos en juego el diseño anticipatorio?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No hay varita mágica para pronunciar “abracadabra”, así que ¿cómo diseñamos para esos momentos mágicos ahora? ¿Cuáles son los pasos que podemos tomar hoy para entregar esos momentos mágicos, usando el diseño anticipatorio?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;https://uploads.toptal.io/blog/image/122087/toptal-blog-image-1486058405195-604d884bdbf0e33d4bdf575a6d8539ac.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
Algoritmos sofisticados y personalizados en el trabajo en Metromile crean una sensación de anticipación e increíblemente útil para los clientes (evitar entradas de estacionamiento)&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hasta que tengamos algoritmos predictivos increíblemente sofisticados, IA completamente desarrollada y aprendizaje de máquinas, las empresas pueden extraer datos existentes para oportunidades de personalización, reduciendo así los posibles puntos de dolor y barreras.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También pueden participar plenamente en el proceso de diseño centrado en el usuario, emplear investigaciones profundas, extensas pruebas de usuario y herramientas de uso, como una biblioteca de software de código abierto, para la inteligencia de la máquina, como&amp;nbsp;&lt;a href=&quot;https://www.tensorflow.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot; title=&quot;Tensorflow&quot;&gt;Tensorflow.&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las investigaciones profundas nos ofrecerán una observación mucho-contextual quizás o estudios etnográficos- donde podamos observar lo que los usuarios están dispuestos a hacer de momento a momento en su flujo. Podríamos mapear estos viajes de usuario paso a paso, y diseñar la interacción en consecuencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El resultado ideal de la aplicación de la minería de datos y la personalización, junto con los métodos de diseño centrados en el usuario, crearía experiencias fluidas y sin precedentes anticipación que agradaría a los clientes y generar lealtad por tener las cosas aparecen como por arte de magia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Se avanzaría el estado del arte de la experiencia del usuario y crear una situación de ganar-ganar tanto para empresas y usuarios, ofreciendo una mayor satisfacción del cliente que repercute positivamente en la línea de fondo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Por:&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://www.toptal.com/designers/resume/miklos-philips&quot;&gt;Miklos Philips&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Artículo vía:&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://www.toptal.com/designers/product-design/dise%C3%B1o-anticipatorio-c%C3%B3mo-crear-experiencias-de-usuarios-m%C3%A1gicos/es&quot;&gt;Toptal&lt;/a&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/1743221283199853988/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/diseno-anticipatorio-como-crear-experiencias-de-usuarios-magicos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1743221283199853988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1743221283199853988'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/10/diseno-anticipatorio-como-crear-experiencias-de-usuarios-magicos.html' title='Diseño Anticipatorio: Cómo Crear Experiencias de Usuarios Mágicos'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-8704952126757647852</id><published>2017-09-24T23:53:00.000-03:00</published><updated>2017-09-24T23:53:26.934-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Angular"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>Angular vs. React: ¿Cuál es Mejor Para el Desarrollo Web?</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay innumerables artículos por ahí debatiendo si React o Angular es la mejor opción para el desarrollo web. ¿Necesitamos otro?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La razón por la que escribí este artículo es porque ninguno de&amp;nbsp;&lt;a href=&quot;https://gofore.com/en/angular-2-vs-react-the-final-battle-round-1/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;los&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://medium.com/javascript-scene/angular-2-vs-react-the-ultimate-dance-off-60e7dfbc379c&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;artículos&lt;/a&gt;&amp;nbsp;ya&amp;nbsp;&lt;a href=&quot;https://www.sitepoint.com/react-vs-angular/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;publicados&lt;/a&gt;&amp;nbsp;–aunque contienen grandes ideas– van en profundidad para un práctico desarrollador de front-end para decidir cuál puede satisfacer sus necesidades.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Angular vs. Reaccionar: ¿Eliges la forma de framework, o juguetear con las librerías?&quot; src=&quot;https://uploads.toptal.io/blog/image/123411/toptal-blog-image-1498222227642.2_newsletter_copy_12-9de10ce9e4df038b0285ab7482fc3040.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, aprenderás cómo Angular y React apuntan a resolver problemas front-end similares aunque con filosofías muy diferentes, y si elegir uno o el otro es simplemente una cuestión de preferencia personal. Para compararlos, vamos a construir la misma aplicación dos veces, una vez con Angular y luego otra vez con React.&lt;/div&gt;
&lt;h2 id=&quot;anuncio-intempestivo-de-angular&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Anuncio Intempestivo de Angular&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hace dos años, escribí un artículo sobre&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/react/navigating-the-react-ecosystem&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React Ecosystem&lt;/a&gt;. Entre otros puntos, el artículo argumentaba que Angular había sido víctima de la “muerte por el anuncio previo”. En aquel entonces, la elección entre Angular y casi cualquier otra cosa era fácil para cualquiera que no quisiera que su proyecto funcionara con un marco obsoleto. Angular 1 era obsoleto, y Angular 2 ni siquiera estaba disponible en versión alfa.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En retrospectiva, los temores eran más o menos justificados. Angular 2 cambió dramáticamente e incluso pasó por una reescritura importante justo antes del lanzamiento final.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dos años más tarde, tenemos Angular 4 con una promesa de estabilidad relativa de aquí en adelante.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Y ahora qué?&lt;/div&gt;
&lt;h2 id=&quot;angular-vs-reaccionar-comparando-manzanas-y-naranjas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Angular vs. Reaccionar: Comparando Manzanas y Naranjas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunas personas dicen que comparar React y Angular es como comparar las manzanas con las naranjas. Mientras que uno es una biblioteca que se ocupa de opiniones, el otro es un framework completo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por supuesto, la mayoría de los&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/react&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Desarrolladores React&lt;/a&gt;&amp;nbsp;añadirán algunas librerías a React para convertirlo en un framework completo. Por otra parte, el flujo de trabajo resultante de esta pila a menudo sigue siendo muy diferente de Angular, por lo que la comparabilidad sigue siendo limitada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayor diferencia radica en la administración estatal. Angular viene con el enlace de datos incluido, mientras que React hoy en día suele ser aumentado por Redux para proporcionar flujo de datos unidireccional y trabajar con datos inmutables. Esos son enfoques opuestos en su propio derecho, y las discusiones incontables ahora están encendiendo si la unión mutable/de datos es mejor o peor que inmutable/unidireccional.&lt;/div&gt;
&lt;h2 id=&quot;un-campo-de-juego-nivelado&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un Campo de Juego Nivelado&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como React es famoso más fácil de hackear, he decidido, con el propósito de esta comparación, construir una configuración de React que refleja Angular razonablemente cerca para permitir la comparación de lado a lado de fragmentos de código.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunas características angulares que se destacan pero no se encuentran en Reaccionar por defecto son:&lt;/div&gt;
&lt;table style=&quot;background-color: white; border-collapse: collapse; border-spacing: 0px; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;thead style=&quot;background-color: steelblue; border: 0px; box-sizing: border-box; color: white; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;th style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; text-align: left; vertical-align: baseline;&quot;&gt;Feature&lt;/th&gt;&lt;th style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; text-align: left; vertical-align: baseline;&quot;&gt;Angular package&lt;/th&gt;&lt;th style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; text-align: left; vertical-align: baseline;&quot;&gt;React library&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Data binding, dependency injection (DI)&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/core&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://mobx.js.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;MobX&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Computed properties&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://reactivex.io/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;rxjs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://mobx.js.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;MobX&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Component-based routing&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/router&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://reacttraining.com/react-router/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React Router v4&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Material design components&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/material&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://react-toolbox.com/#/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React Toolbox&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;CSS scoped to components&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/core&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/css-modules/css-modules&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;CSS modules&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Form validations&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/forms&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://formstate.github.io/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;FormState&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;Project generator&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;@angular/cli&lt;/td&gt;&lt;td style=&quot;border: 1px solid steelblue; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 8px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/wmonk/create-react-app-typescript&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React Scripts TS&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;enlace-de-datos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Enlace de Datos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La vinculación de datos es discutiblemente más fácil de comenzar que el enfoque unidireccional. Por supuesto, sería posible ir en dirección completamente opuesta, y usar&amp;nbsp;&lt;a href=&quot;http://redux.js.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Redux&lt;/a&gt;&amp;nbsp;o&amp;nbsp;&lt;a href=&quot;https://github.com/mobxjs/%20mobx-state-tree&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;mobx-state-tree&lt;/a&gt;&amp;nbsp;con React, y&amp;nbsp;&lt;a href=&quot;https://github.com/ngrx/store&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ngrx&lt;/a&gt;&amp;nbsp;con Angular. Pero eso sería un tema para otro post.&lt;/div&gt;
&lt;h3 id=&quot;propiedades-calculadas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Propiedades Calculadas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras que el funcionamiento se refiere, los adquiridores llanos en Angular están simplemente fuera de la pregunta mientras que se llaman en cada procesamiento. Es posible utilizar&amp;nbsp;&lt;a href=&quot;https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;BehaviorSubject&lt;/a&gt;&amp;nbsp;de&amp;nbsp;&lt;a href=&quot;https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;RsJS&lt;/a&gt;, que realiza el trabajo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con React, es posible usar&amp;nbsp;&lt;a href=&quot;https://mobx.js.org/refguide/computed-decorator.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;@computed&lt;/a&gt;&amp;nbsp;de MobX, que logra el mismo objetivo, con una API algo mejor.&lt;/div&gt;
&lt;h3 id=&quot;inyeccin-de-dependencia&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Inyección de Dependencia&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La inyección de dependencia es un poco polémica porque va en contra del actual paradigma React de programación funcional e inmutabilidad. Como resulta, algún tipo de inyección de dependencia es casi indispensable en entornos de enlace de datos, ya que ayuda con el desacoplamiento (y, por lo tanto, burla y pruebas) donde no hay una arquitectura de capa de datos independiente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una ventaja más de DI (apoyado en Angular) es la capacidad de tener diferentes ciclos de vida de diferentes tiendas. La mayoría de los paradigmas actuales de React utilizan algún tipo de estado de aplicación global que mapea diferentes componentes, pero por mi experiencia, es demasiado fácil introducir errores al limpiar el estado global en el desmontaje de componentes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener una tienda que se crea en el montaje de componentes (y estar perfectamente disponible para los hijos de este componente) parece ser realmente útil, ya menudo se pasa por alto el concepto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Fuera de la caja en Angular, pero muy fácilmente reproducible con MobX también.&lt;/div&gt;
&lt;h3 id=&quot;enrutamiento&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Enrutamiento&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El enrutamiento basado en componentes permite a los componentes gestionar sus propias rutas secundarias en lugar de tener una configuración de enrutador global grande. Este enfoque finalmente lo ha hecho a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;react-router&lt;/code&gt;&amp;nbsp;en la versión 4.&lt;/div&gt;
&lt;h3 id=&quot;material-design&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Material Design&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Siempre es bueno comenzar con algunos componentes de alto nivel, y el diseño de materiales se ha convertido en algo así como una opción predeterminada universalmente aceptada, incluso en proyectos que no son de Google.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
He elegido deliberadamente&amp;nbsp;&lt;a href=&quot;http://react-toolbox.com/#/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React Toolbox&lt;/a&gt;&amp;nbsp;sobre el recomendado&amp;nbsp;&lt;a href=&quot;http://react-toolbox.com/#/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Material UI&lt;/a&gt;, ya que la interfaz de usuario de material tiene serias auto-confesados&amp;nbsp;&lt;a href=&quot;https://github.com/callemall/material-ui/blob/master/ROADMAP.md#summarizing-what-are-our-main-problems-with-css&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;problemas de rendimiento&lt;/a&gt;&amp;nbsp;con su CSS-en-línea, que planean resolver en la próxima versión.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además,&amp;nbsp;&lt;a href=&quot;http://cssnext.io/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;PostCSS/cssnext&lt;/a&gt;&amp;nbsp;fue utilizado en React Toolbox y está empezando a reemplazar Sass/LESS de todos modos.&lt;/div&gt;
&lt;h3 id=&quot;css-con-alcance&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
CSS con Alcance&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las clases CSS son algo así como las variables globales. Existen numerosos enfoques para la organización de CSS para evitar conflictos (incluyendo&amp;nbsp;&lt;a href=&quot;https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;BEM&lt;/a&gt;), pero hay una clara corriente tendencia en el uso de bibliotecas que ayudan a procesar CSS para evitar esos conflictos sin la necesidad de un desarrollador&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/front-end&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;front-end&lt;/a&gt;&amp;nbsp;para elaborar elaborados sistemas de nombres CSS.&lt;/div&gt;
&lt;h3 id=&quot;validacin-de-formularios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Validación de Formularios&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las validaciones de formulario son una característica no trivial y muy ampliamente utilizada. Es bueno tener los cubiertos por una librería para evitar la repetición de código y errores.&lt;/div&gt;
&lt;h3 id=&quot;generador-de-proyecto&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Generador de Proyecto&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener un generador CLI para un proyecto es sólo un poco más conveniente que tener que clonar chapas de calderas de GitHub.&lt;/div&gt;
&lt;h2 id=&quot;la-misma-aplicacin-construda-dos-veces&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Misma Aplicación, Construída Dos Veces&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que vamos a crear la misma aplicación en React y Angular. Nada espectacular, solo un Shoutboard que permite a cualquiera publicar mensajes en una página común.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes probar las aplicaciones aquí:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://shoutboard-angular.herokuapp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shoutboard Angular&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://shoutboard-react.herokuapp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shoutboard React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Shoutboard app en Angular vs. en React&quot; src=&quot;https://uploads.toptal.io/blog/image/123409/toptal-blog-image-1498198291713-a9fa085141c82b5b48f1b98c192a1432.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: 640.5px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si deseas tener todo el código fuente, puedes obtenerlo desde GitHub:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/tomaash/shoutboard-angular&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shoutboard Angular source&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/tomaash/shoutboard-react&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shoutboard React source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Observará que también hemos utilizado TypeScript para la aplicación React. Las ventajas de la comprobación de tipos en TypeScript son evidentes. Y ahora, con un mejor manejo de las importaciones, async/espera y propagación de descanso finalmente llegaron a TypeScript 2, y deja a Babel/ES7/&lt;a href=&quot;https://flow.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Flow&lt;/a&gt;&amp;nbsp;en el polvo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, vamos a agregar&amp;nbsp;&lt;a href=&quot;https://github.com/apollographql/apollo-client&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Apollo Client&lt;/a&gt;&amp;nbsp;a ambos porque queremos usar GraphQL. Quiero decir, REST es genial, pero después de una década aproximadamente, se hace viejo.&lt;/div&gt;
&lt;h3 id=&quot;bootstrap-y-enrutamiento&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Bootstrap y Enrutamiento&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero, echemos un vistazo a los puntos de entrada de ambas aplicaciones.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; appRoutes: Routes = [
  { path: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;home&#39;&lt;/span&gt;, component: HomeComponent },
  { path: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;posts&#39;&lt;/span&gt;, component: PostsComponent },
  { path: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;form&#39;&lt;/span&gt;, component: FormComponent },
  { path: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;, redirectTo: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/home&#39;&lt;/span&gt;, pathMatch: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;full&#39;&lt;/span&gt; }
]
 
@NgModule({
  declarations: [
    AppComponent,
    PostsComponent,
    HomeComponent,
    FormComponent,
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes),
    ApolloModule.forRoot(provideClient),
    FormsModule,
    ReactiveFormsModule,
    HttpModule,
    BrowserAnimationsModule,
    MdInputModule, MdSelectModule, MdButtonModule, MdCardModule, MdIconModule
  ],
  providers: [
    AppService
  ],
  bootstrap: [AppComponent]
})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; AppService {
  username = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Mr. User&#39;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Básicamente, todos los componentes que queremos utilizar en la aplicación necesitan ir a declaraciones. Todas las librerías de terceros a las importaciones y todas las tiendas globales a los proveedores. Los componentes de los hijos tienen acceso a todo esto, con la oportunidad de agregar más cosas locales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; appStore = AppStore.getInstance()
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; routerStore = RouterStore.getInstance()
 
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; rootStores = {
  appStore,
  routerStore
}
 
ReactDOM.render(
  &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt; {&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;...rootStores&lt;/span&gt;} &amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Router&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;history&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{routerStore.history}&lt;/span&gt; &amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;App&lt;/span&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Switch&lt;/span&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Route&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;exact&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;path&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/home&#39;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;component&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{Home&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;any&lt;/span&gt;} /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Route&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;exact&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;path&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;component&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{Posts&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;any&lt;/span&gt;} /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Route&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;exact&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;path&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/form&#39;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;component&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{Form&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;any&lt;/span&gt;} /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Redirect&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;from&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/&#39;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;to&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/home&#39;&lt;/span&gt; /&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Switch&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;App&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Router&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt; &amp;gt;&lt;/span&gt;,
  document.getElementById(&#39;root&#39;)
)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El componente&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;Provider/&amp;gt;&lt;/code&gt;&amp;nbsp;se utiliza para la inyección de dependencia en MobX. Guarda las tiendas en el contexto para que los componentes de React puedan inyectarlas posteriormente. Sí, el contexto de React puede (discutiblemente) ser utilizado&amp;nbsp;&lt;a href=&quot;https://medium.com/@mweststrate/how-to-safely-use-react-context-b7e343eff076&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;con seguridad&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La versión de React es un poco más corta porque no hay declaraciones de módulo - por lo general, es sólo importar y ya está listo para usar. A veces este tipo de dependencia dura no es deseado (en pruebas), por lo que para las tiendas singleton globales, tuve que usar este&amp;nbsp;&lt;a href=&quot;https://www.wikiwand.com/es/Design_Patterns&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;GoF&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/front-end/angular-vs-react-cu%C3%A1l-es-mejor-para-el-desarrollo-web-/%20//en.wikipedia.org/wiki/Singleton_pattern&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;patrón&lt;/a&gt;&amp;nbsp;de vieja década:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; AppStore {
  static instance: AppStore
  static getInstance() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; AppStore.instance || (AppStore.instance = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; AppStore())
  }
  @observable username = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Mr. User&#39;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Angular’s Router es inyectable, por lo que puede ser utilizado desde cualquier lugar, no sólo los componentes. Para lograr lo mismo en reaccionar, usamos el paquete&amp;nbsp;&lt;a href=&quot;https://github.com/alisd23/mobx-react-router&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;mobx-react-router&lt;/a&gt;&amp;nbsp;e inyectamos el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;routerStore&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resumen:&lt;/span&gt;&amp;nbsp;Hacer bootstrapping en ambas aplicaciones es bastante sencillo. React tiene una ventaja que es más simple, usando sólo importaciones en lugar de módulos, pero, como veremos más adelante, esos módulos pueden ser muy útiles. Hacer semifallos manualmente es un poco molesto. En cuanto a la sintaxis de la declaración de enrutamiento, JSON vs JSX es sólo una cuestión de preferencia.&lt;/div&gt;
&lt;h3 id=&quot;enlaces-y-navegacin-imperativa&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Enlaces y Navegación Imperativa&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que hay dos casos para cambiar una ruta. Declarativamente, utilizando elementos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;a href...&amp;gt;&lt;/code&gt;, e imperativamente, llamando directamente a la API de enrutamiento (y, por tanto, de ubicación).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt; Shoutboard Application &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;routerLink&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;/home&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;routerLinkActive&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;active&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Home&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;routerLink&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;/posts&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;routerLinkActive&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;active&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Posts&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;router-outlet&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;router-outlet&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Angular Router detecta automáticamente qué&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;routerLink&lt;/code&gt;&amp;nbsp;está activo, y pone una clase apropiada&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;routerLinkActive&lt;/code&gt;&amp;nbsp;en ella, para que pueda ser estilizada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El enrutador utiliza el elemento especial&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;router-outlet&amp;gt;&lt;/code&gt;&amp;nbsp;para representar cualquier ruta de acceso actual. Es posible tener muchos ‘&lt;router-outlet style=&quot;box-sizing: border-box;&quot;&gt;`, mientras profundizamos en los subcomponentes de la aplicación.&lt;/router-outlet&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormService {
  constructor(private router: Router) { }
  goBack() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.router.navigate([&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt;])
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El módulo de enrutador puede ser inyectado a cualquier servicio (mitad-mágicamente por su tipo TypeScript), la declaración&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;private&lt;/code&gt;&amp;nbsp;lo almacena en la instancia sin necesidad de asignación explícita. Utilice el método&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;navigate&lt;/code&gt;&amp;nbsp;para cambiar las URL.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;import * as style from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./app.css&#39;&lt;/span&gt;
&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// …&lt;/span&gt;
  &amp;lt;h1&amp;gt;Shoutboard Application&amp;lt;&lt;span class=&quot;hljs-regexp&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;/h1&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;NavLink to=&#39;/&lt;/span&gt;home&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39; activeClassName={style.active}&amp;gt;Home&amp;lt;/NavLink&amp;gt;
    &amp;lt;NavLink to=&#39;&lt;/span&gt;/posts&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39; activeClassName={style.active}&amp;gt;Posts&amp;lt;/NavLink&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;
    {this.props.children}
  &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
React Router también puede establecer la clase de enlace activo con&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;activeClassName&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí no podemos proporcionar el nombre de la clase directamente porque se ha hecho único por el compilador de módulos CSS, y tenemos que usar el ayudante&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;style&lt;/code&gt;. Hablaremos sobre eso más tarde.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como se ha visto anteriormente, React Router utiliza el elemento&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;Switch&amp;gt;&lt;/code&gt;&amp;nbsp;dentro de un elemento&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;App&amp;gt;&lt;/code&gt;. Como el elemento&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;Switch&amp;gt;&lt;/code&gt;simplemente envuelve y monta la ruta actual, significa que las sub-rutas del componente actual son simplemente&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;this.props.children&lt;/code&gt;. Así que es componible también.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormStore {
  routerStore: RouterStore
  constructor() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.routerStore = RouterStore.getInstance()
  }
  goBack = () =&amp;gt; {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.routerStore.history.push(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El paquete&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;mobx-router-store&lt;/code&gt;&amp;nbsp;también permite una fácil inyección y navegación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resumen:&lt;/span&gt;&amp;nbsp;Ambos enfoques de enrutamiento son bastante comparables. Angular parece ser más intuitivo, mientras que React Router tiene un poco más fácil de componer.&lt;/div&gt;
&lt;h3 id=&quot;inyeccin-de-dependencia-1&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Inyección de Dependencia&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ya se ha demostrado que es beneficioso separar la capa de datos de la capa de presentación. Lo que estamos tratando de lograr con DI es hacer que los componentes de las capas de datos (aquí denominados modelo/tienda/servicio) sigan el ciclo de vida de los componentes visuales y, por lo tanto, permitan hacer una o varias instancias de dichos componentes sin necesidad de tocar globales estado. Además, debería ser posible mezclar y combinar datos compatibles y capas de visualización.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ejemplos en este artículo son muy simples, por lo que todas las cosas DI puede parecer exceso, pero viene muy bien a medida que crece la aplicación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeService {
  message = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Welcome to home page&#39;&lt;/span&gt;
  counter = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
  increment() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counter++
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que cualquier clase se puede hacer&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@inyectable&lt;/code&gt;, y sus propiedades y métodos puestos a disposición de los componentes.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Component({
  selector: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;app-home&#39;&lt;/span&gt;,
  templateUrl: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./home.component.html&#39;&lt;/span&gt;,
  providers: [
    HomeService
  ]
})
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeComponent {
  constructor(
    public homeService: HomeService,
    public appService: AppService,
  ) { }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al registrar el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;HomeService&lt;/code&gt;&amp;nbsp;a&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;providers&lt;/code&gt;&amp;nbsp;del componente, lo ponemos a disposición de este componente exclusivamente. No es un semifallo ahora, pero cada instancia del componente recibirá una nueva copia, fresca en el montaje del componente. Eso significa que no hay datos obsoletos de uso previo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por el contrario, el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;AppService&lt;/code&gt;&amp;nbsp;se ha registrado en el&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;app.module&lt;/code&gt;&amp;nbsp;(ver arriba), por lo que es un semifallo y se mantiene igual para todos los componentes, aunque la duración de la aplicación. Ser capaz de controlar el ciclo de vida de los servicios de los componentes es un concepto muy útil, pero poco apreciado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
DI funciona asignando las instancias de servicio al constructor del componente, identificadas por tipos TypeScript. Además, las palabras clave&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;public&lt;/code&gt;&amp;nbsp;asignan automáticamente los parámetros a&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;this&lt;/code&gt;, de modo que ya no necesitamos escribir esas líneas aburridas&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;this.homeService = homeService&lt;/code&gt;.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mdInput&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Edit your name&#39;&lt;/span&gt; [(&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ngModel&lt;/span&gt;)]=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;appService.username&#39;&lt;/span&gt; /&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;Clicks since last visit: {{homeService.counter}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; (&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;click&lt;/span&gt;)=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;homeService.increment()&#39;&lt;/span&gt;&amp;gt;&lt;/span&gt;Click!&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sintaxis de la plantilla de Angular, sin duda bastante elegante. Me gusta el atajo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[()]&lt;/code&gt;, que funciona como un enlace de datos de 2 vías, pero bajo el capó, en realidad es un atributo vinculante + evento. Como dicta el ciclo de vida de nuestros servicios,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;homeService.counter&lt;/code&gt;&amp;nbsp;va a reiniciarse cada vez que naveguemos lejos de&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;/home&lt;/code&gt;, pero el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;appService.username&lt;/code&gt;&amp;nbsp;permanece, y es accesible desde cualquier lugar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;import { observable } from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;mobx&#39;&lt;/span&gt;
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeStore {
  @observable counter = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
  increment = () =&amp;gt; {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counter++
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con MobX, necesitamos agregar el decorador&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@observable&lt;/code&gt;&amp;nbsp;a cualquier propiedad que queramos hacer observable.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@observer
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; Home extends React.Component&amp;lt;any, any&amp;gt; {
 
  homeStore: HomeStore
  componentWillMount() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.homeStore = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; HomeStore()
  }
 
  render() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;homeStore&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{this.homeStore}&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;HomeComponent&lt;/span&gt; /&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt;&amp;gt;&lt;/span&gt;
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para gestionar el ciclo de vida correctamente, necesitamos hacer un poco más de trabajo que en el ejemplo Angular. Envolvemos el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;HomeComponent&lt;/code&gt;dentro de un&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Provider&lt;/code&gt;, que recibe una nueva instancia de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;HomeStore&lt;/code&gt;&amp;nbsp;en cada montaje.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;interface HomeComponentProps {
  appStore?: AppStore,
  homeStore?: HomeStore
}
 
@inject(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;appStore&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;homeStore&#39;&lt;/span&gt;)
@observer
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeComponent extends React.Component&amp;lt;HomeComponentProps, any&amp;gt; {
  render() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; { homeStore, appStore } = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.props
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Input
&lt;/span&gt;        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;text&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Edit your name&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;username&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{appStore.username}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{appStore.onUsernameChange}&lt;/span&gt;
      /&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;Clicks since last visit: {homeStore.counter}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{homeStore.increment}&lt;/span&gt;&amp;gt;&lt;/span&gt;Click!&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;HomeComponent&lt;/code&gt;&amp;nbsp;utiliza el decorador&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@observer&lt;/code&gt;&amp;nbsp;para escuchar los cambios en las propiedades&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@observable&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El mecanismo bajo-la-capucha de esto es bastante interesante, así que vamos a pasar por esto brevemente aquí. El decorador&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@observable&lt;/code&gt;reemplaza una propiedad en un objeto con getter y setter, lo que le permite interceptar llamadas. Cuando se llama a la función render de un componente aumentado&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@observador&lt;/code&gt;, las propiedades getters se llaman y mantienen una referencia al componente que las llama.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación, cuando se llama a setter y se cambia el valor, se llaman las funciones render de los componentes que utilizaron la propiedad en el último procesamiento. Ahora, los datos sobre qué propiedades se utilizan donde se actualizan, y todo el ciclo puede comenzar de nuevo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un mecanismo muy simple, y bastante performant también. Más explicación en profundidad&amp;nbsp;&lt;a href=&quot;https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El decorador&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@inyectar &#39;se utiliza para inyectar instancias&lt;/code&gt;appStore&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;y&lt;/code&gt;homeStore&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;en los accesorios de&lt;/code&gt;HomeComponent&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;. En este punto, cada una de esas tiendas tiene un ciclo de vida diferente.&lt;/code&gt;appStore&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;es el mismo durante la vida de la aplicación, pero&lt;/code&gt;homeStore` es recién creado en cada navegación a la ruta “/home”.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La ventaja de esto es que no es necesario limpiar las propiedades manualmente, como ocurre cuando todas las tiendas son globales, lo cual es doloroso si la ruta es alguna página de “detalle” que contiene datos completamente diferentes cada vez.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resumen:&lt;/span&gt;&amp;nbsp;Como la gestión del ciclo de vida del proveedor en una característica inherente de la DI de Angular, es, por supuesto, más simple lograrlo allí. La versión de React es también utilizable pero implica mucho más boilerplate.&lt;/div&gt;
&lt;h3 id=&quot;propiedades-calculadas-1&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Propiedades Calculadas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comencemos con Reaccionar en éste, tiene una solución más directa.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;import { observable, computed, action } from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;mobx&#39;&lt;/span&gt;
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeStore {
import { observable, computed, action } from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;mobx&#39;&lt;/span&gt;
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeStore {
  @observable counter = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
  increment = () =&amp;gt; {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counter++
  }
  @computed get counterMessage() {
    console.log(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;recompute counterMessage!&#39;&lt;/span&gt;)
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; `${&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counter} ${&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counter === &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; ? &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;click&#39;&lt;/span&gt; : &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;clicks&#39;&lt;/span&gt;} since last visit`
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que tenemos una propiedad calculada que se une a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;counter&lt;/code&gt;&amp;nbsp;y devuelve un mensaje correctamente pluralizado. El resultado de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;counterMessage&lt;/code&gt;se almacena en caché y se vuelve a calcular sólo cuando&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;counter&lt;/code&gt;&amp;nbsp;cambia.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Input
&lt;/span&gt;  &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;text&#39;&lt;/span&gt;
  &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Edit your name&#39;&lt;/span&gt;
  &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;username&#39;&lt;/span&gt;
  &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{appStore.username}&lt;/span&gt;
  &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{appStore.onUsernameChange}&lt;/span&gt;
/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;{homeStore.counterMessage}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{homeStore.increment}&lt;/span&gt;&amp;gt;&lt;/span&gt;Click!&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Luego, hacemos referencia a la propiedad (y el método&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;increment&lt;/code&gt;) de la plantilla JSX. El campo de entrada se controla mediante la vinculación a un valor y permite que un método de `appStore ‘maneje el evento de usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para lograr el mismo efecto en Angular, necesitamos ser un poco más inventivos.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;import { Injectable } from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;@angular/core&#39;&lt;/span&gt;
import { BehaviorSubject } from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;rxjs/BehaviorSubject&#39;&lt;/span&gt;
 
@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; HomeService {
  message = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Welcome to home page&#39;&lt;/span&gt;
  counterSubject = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; BehaviorSubject(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;)
  &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Computed property can serve as basis for further computed properties&lt;/span&gt;
  counterMessage = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; BehaviorSubject(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;)
  constructor() {
    &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Manually subscribe to each subject that couterMessage depends on&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counterSubject.subscribe(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.recomputeCounterMessage)
  }
 
  &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Needs to have bound this&lt;/span&gt;
  private recomputeCounterMessage = (x) =&amp;gt; {
    console.log(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;recompute counterMessage!&#39;&lt;/span&gt;)
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counterMessage.next(`${x} ${x === &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; ? &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;click&#39;&lt;/span&gt; : &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;clicks&#39;&lt;/span&gt;} since last visit`)
  }
 
  increment() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counterSubject.next(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.counterSubject.getValue() + &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Necesitamos definir todos los valores que sirven como base para una propiedad calculada como un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;BehaviorSubject&lt;/code&gt;. La propia propiedad calculada es también un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;BehaviorSubject&lt;/code&gt;, porque cualquier propiedad calculada puede servir como entrada para otra propiedad calculada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por supuesto,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;RxJS&lt;/code&gt;&amp;nbsp;puede hacer&amp;nbsp;&lt;a href=&quot;https://www.sitepoint.com/functional-reactive-programming-rxjs/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;mucho más&lt;/a&gt;&amp;nbsp;que sólo esto, pero eso sería un tema para un artículo completamente diferente. El inconveniente menor es que este uso trivial de RxJS para las propiedades calculadas es un poco más detallado que el ejemplo reactivo, y es necesario administrar las suscripciones manualmente (como aquí en el constructor).&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mdInput&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Edit your name&#39;&lt;/span&gt; [(&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ngModel&lt;/span&gt;)]=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;appService.username&#39;&lt;/span&gt; /&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;{{homeService.counterMessage | async}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; (&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;click&lt;/span&gt;)=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;homeService.increment()&#39;&lt;/span&gt;&amp;gt;&lt;/span&gt;Click!&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tenga en cuenta cómo podemos hacer referencia al sujeto RxJS con el&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;|asíncrona&lt;/code&gt;&amp;nbsp;. Eso es un toque agradable, mucho más corto que la necesidad de suscribirse en sus componentes. El componente&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;input&lt;/code&gt;&amp;nbsp;es impulsado por la directiva&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[(ngModel)]&lt;/code&gt;. A pesar de mirar extraño, es realmente bastante elegante. Sólo un azúcar sintáctico para la vinculación de datos de valor a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;appService.username&lt;/code&gt;&amp;nbsp;y el valor de asignación automática del evento de entrada del usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resumen:&lt;/span&gt;&amp;nbsp;Las propiedades calculadas son más fáciles de implementar en React/MobX que en Angular/RxJS, pero RxJS podría proporcionar algunas características de FRP más útiles, que podrían apreciarse más tarde.&lt;/div&gt;
&lt;h3 id=&quot;plantillas-y-css&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Plantillas y CSS&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para mostrar cómo las pilas de plantillas entre sí, vamos a utilizar el componente de mensajes que muestra una lista de mensajes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Component({
  selector: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;app-posts&#39;&lt;/span&gt;,
  templateUrl: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./posts.component.html&#39;&lt;/span&gt;,
  styleUrls: [&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./posts.component.css&#39;&lt;/span&gt;],
  providers: [
    PostsService
  ]
})
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; PostsComponent implements OnInit {
  constructor(
    public postsService: PostsService,
    public appService: AppService
  ) { }
 
  ngOnInit() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postsService.initializePosts()
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este componente sólo conecta HTML, CSS y servicios inyectados y también llama a la función para cargar los mensajes de la API en la inicialización.&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;AppService&lt;/code&gt;&amp;nbsp;es un semifallo definido en el módulo de aplicación, mientras que&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;PostsService&lt;/code&gt;&amp;nbsp;es transitorio, con una instancia nueva creada en cada componente de tiempo creado. El CSS que se hace referencia desde este componente tiene un ámbito de este componente, lo que significa que el contenido no puede afectar a nada fuera del componente.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;routerLink&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;/form&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;float-right&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-fab&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-icon&lt;/span&gt;&amp;gt;&lt;/span&gt;add&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-icon&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;a&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;Hello {{appService.username}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card&lt;/span&gt; *&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ngFor&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;let post of postsService.posts&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-title&lt;/span&gt;&amp;gt;&lt;/span&gt;{{post.title}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-title&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-subtitle&lt;/span&gt;&amp;gt;&lt;/span&gt;{{post.name}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-subtitle&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-content&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;
      {{post.message}}
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card-content&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-card&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En la plantilla HTML, hacemos referencia principalmente a componentes de Material Angular. Para tenerlos disponibles, era necesario incluirlos en las importaciones&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;app.module&lt;/code&gt;&amp;nbsp;(véase más arriba). La directiva&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;*ngFor&lt;/code&gt;&amp;nbsp;se utiliza para repetir el componente&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;md-card&lt;/code&gt;&amp;nbsp;para cada puesto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Local CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.mat-card&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;margin-bottom&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;rem&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El CSS local sólo aumenta una de las clases presentes en el componente&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;md-card&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Global CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.float-right&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; right&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta clase se define en el archivo global&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;style.css&lt;/code&gt;&amp;nbsp;para que esté disponible para todos los componentes. Se puede hacer referencia en la forma estándar,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;class =&quot; float-right &quot;&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Compiled CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.float-right&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; right&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.mat-card&lt;/span&gt;&lt;span class=&quot;hljs-attr_selector&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;[_ngcontent-c1]&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
    &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;margin-bottom&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;rem&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En CSS compilado, podemos ver que el CSS local ha sido delimitado al componente renderizado mediante el selector de atributos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[_ngcontent-c1]&lt;/code&gt;. Cada componente Angular representado tiene una clase generada como ésta para fines de alcance CSS.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La ventaja de este mecanismo es que podemos referenciar clases normalmente, y el alcance se maneja “bajo el capó”.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;import * as style from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./posts.css&#39;&lt;/span&gt;
import * as appStyle from &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;../app.css&#39;&lt;/span&gt;
 
@observer
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; Posts extends React.Component&amp;lt;any, any&amp;gt; {
 
  postsStore: PostsStore
  componentWillMount() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postsStore = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; PostsStore()
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postsStore.initializePosts()
  }
 
  render() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;postsStore&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{this.postsStore}&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PostsComponent&lt;/span&gt; /&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Provider&lt;/span&gt;&amp;gt;&lt;/span&gt;
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En React, de nuevo, necesitamos usar el método&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Provider&lt;/code&gt;&amp;nbsp;para hacer que la dependencia de PostsStore sea “transitoria”. También importamos estilos CSS, denominados&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;style&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;appStyle&lt;/code&gt;, para poder utilizar las clases de esos archivos CSS en JSX.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;interface PostsComponentProps {
  appStore?: AppStore,
  postsStore?: PostsStore
}
 
@inject(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;appStore&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;postsStore&#39;&lt;/span&gt;)
@observer
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; PostsComponent extends React.Component&amp;lt;PostsComponentProps, any&amp;gt; {
  render() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; { postsStore, appStore } = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.props
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;NavLink&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;to&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;form&#39;&lt;/span&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Button&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;icon&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;add&#39;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floating&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;accent&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{appStyle.floatRight}&lt;/span&gt; /&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;NavLink&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;Hello {appStore.username}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
      {postsStore.posts.map(post =&amp;gt;
        &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Card&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{post.id}&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{style.messageCard}&lt;/span&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CardTitle
&lt;/span&gt;            &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;title&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{post.title}&lt;/span&gt;
            &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;subtitle&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{post.name}&lt;/span&gt;
          /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CardText&lt;/span&gt;&amp;gt;&lt;/span&gt;{post.message}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;CardText&lt;/span&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Card&lt;/span&gt;&amp;gt;&lt;/span&gt;
      )}
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Naturalmente, JSX se siente mucho más JavaScript-y que las plantillas HTML de Angular, que puede ser una buena o mala cosa dependiendo de sus gustos. En lugar de la directiva&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;*ngFor&lt;/code&gt;, usamos el constructo&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;map&lt;/code&gt;&amp;nbsp;para iterar sobre los posts.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora bien, Angular podría ser el marco que promociona a TypeScript más, pero en realidad es JSX donde TypScript realmente brilla. Con la adición de módulos CSS (importados anteriormente), realmente convierte la codificación de su plantilla en zen de código. Cada cosa es revisada. Componentes, atributos, incluso clases CSS (&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;appStyle.floatRight&lt;/code&gt;&amp;nbsp;y&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;style.messageCard&lt;/code&gt;, ver más abajo). Y, por supuesto, la naturaleza delgada de JSX fomenta la división en componentes y fragmentos un poco más que las plantillas de Angular.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Local CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.messageCard&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;margin-bottom&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;rem&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Global CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.floatRight&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; right&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Compiled CSS:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-css hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.floatRight__qItBM&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
  &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; right&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
 
&lt;span class=&quot;hljs-class&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.messageCard__1Dt_9&lt;/span&gt; &lt;span class=&quot;hljs-rules&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{
    &lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;margin-bottom&lt;/span&gt;:&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;rem&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;hljs-rule&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como puede ver, el cargador de CSS Módulos postfixes cada clase CSS con un postfix aleatorio, que garantiza la singularidad. Una forma sencilla de evitar conflictos. A continuación, las clases se hacen referencia a través de los objetos importados del paquete web. Un inconveniente posible de esto puede ser que no se puede crear un CSS con una clase y aumentarlo, como lo hicimos en el ejemplo Angular. Por otro lado, esto puede ser realmente una buena cosa, porque le obliga a encapsular estilos correctamente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resumen:&lt;/span&gt;&amp;nbsp;Personalmente, me gusta JSX un poco mejor que las plantillas Angular, sobre todo debido a la terminación del código y el tipo de control de apoyo. Eso realmente es una característica asesina. Angular ahora tiene el compilador AOT, que también puede detectar algunas cosas, la finalización de código también funciona para alrededor de la mitad de las cosas allí, pero no es casi tan completo como JSX/TypeScript.&lt;/div&gt;
&lt;h3 id=&quot;graphql---cargando-datos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
GraphQL - Cargando Datos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que hemos decidido utilizar GraphQL para almacenar datos para esta aplicación. Una de las maneras más fáciles de crear el back-end de GraphQL es usar algún BaaS, como Graphcool. Así que eso es lo que hicimos. Básicamente, sólo define modelos y atributos, y su CRUD es bueno para ir.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Código Común&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como parte del código relacionado con GraphQL es 100% igual para ambas implementaciones, no lo repetimos dos veces:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; PostsQuery = gql`
  query PostsQuery {
    allPosts(orderBy: createdAt_DESC, first: &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;)
    {
      id,
      name,
      title,
      message
    }
  }
`
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
GraphQL es un lenguaje de consulta dirigido a proporcionar un conjunto más rico de funcionalidad en comparación con los puntos finales RESTful clásicos. Vamos a diseccionar esta consulta en particular.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;PostsQuery&lt;/code&gt;&amp;nbsp;es sólo un nombre para esta consulta a la referencia posterior, se puede nombrar nada.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;allPosts&lt;/code&gt;&amp;nbsp;es la parte más importante - hace referencia a la función para consultar todos los registros con el modelo `Post`. Este nombre fue creado por Graphcool.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;orderBy&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;first&lt;/code&gt;&amp;nbsp;son parámetros de la función&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;allPosts&lt;/code&gt;.&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;createdAt&lt;/code&gt;&amp;nbsp;es uno de los&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Post&lt;/code&gt;&amp;nbsp;atributos del modelo.&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;first: 5&lt;/code&gt;&amp;nbsp;significa que devolverá sólo los primeros 5 resultados de la consulta.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;id&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;name&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;title&lt;/code&gt;, y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;message&lt;/code&gt;&amp;nbsp;son los atributos del modelo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Post&lt;/code&gt;&amp;nbsp;que queremos ser incluidos en el resultado. Otros atributos serán filtrados.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como ya puedes ver, es bastante potente. Echa un vistazo a&amp;nbsp;&lt;a href=&quot;http://graphql.org/learn/queries/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;esta página&lt;/a&gt;&amp;nbsp;para familiarizarse más con las consultas de GraphQL.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;interface Post {
  id: string
  name: string
  title: string
  message: string
}
 
interface PostsQueryResult {
  allPosts: &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Array&lt;/span&gt;&amp;lt;Post&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sí, como buenos ciudadanos de TypeScript, creamos interfaces para los resultados de GraphQL.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; PostsService {
  posts = []
 
  constructor(private apollo: Apollo) { }
 
  initializePosts() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.apollo.query&amp;lt;PostsQueryResult&amp;gt;({
      query: PostsQuery,
      fetchPolicy: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;network-only&#39;&lt;/span&gt;
    }).subscribe(({ data }) =&amp;gt; {
      &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.posts = data.allPosts
    })
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La consulta GraphQL es un RxJS observable, y nos suscribimos a ella. Funciona un poco como una promesa, pero no es así, por lo que no tenemos suerte con&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;async/await&lt;/code&gt;. Por supuesto, todavía hay&amp;nbsp;&lt;a href=&quot;https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/topromise.md&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;toPromise&lt;/a&gt;, pero no parece ser el camino Angular de todas formas. Establecemos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;fetchPolicy: &#39;network-only&#39;&lt;/code&gt;&amp;nbsp;porque en este caso, no queremos almacenar en caché los datos, sino refetch cada vez.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; PostsStore {
  appStore: AppStore
 
  @observable posts: &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Array&lt;/span&gt;&amp;lt;Post&amp;gt; = []
 
  constructor() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appStore = AppStore.getInstance()
  }
 
  async initializePosts() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; result = await &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appStore.apolloClient.query&amp;lt;PostsQueryResult&amp;gt;({
      query: PostsQuery,
      fetchPolicy: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;network-only&#39;&lt;/span&gt;
    })
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.posts = result.data.allPosts
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La versión de React es casi idéntica, pero como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;apolloClient&lt;/code&gt;&amp;nbsp;aquí usa promesas, podemos aprovechar la sintaxis&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;async / await&lt;/code&gt;. Existen otros enfoques en React que sólo “graban” las consultas GraphQL a&amp;nbsp;&lt;a href=&quot;https://github.com/apollographql/react-apollo&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;componentes de orden superior&lt;/a&gt;, pero me pareció mezclar la capa de datos y presentación a tad demasiado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;En resúmen:&lt;/span&gt;&amp;nbsp;Las ideas de la RxJS suscribirse vs async/await son realmente lo mismo.&lt;/div&gt;
&lt;h3 id=&quot;graphql---guardando-datos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
GraphQL - Guardando Datos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Código Común&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez más, algo de código GraphQL relacionado:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; AddPostMutation = gql`
  mutation AddPostMutation($name: &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;String&lt;/span&gt;!, $title: &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;String&lt;/span&gt;!, $message: &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;String&lt;/span&gt;!) {
    createPost(
      name: $name,
      title: $title,
      message: $message
    ) {
      id
    }
  }
`
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El propósito de las mutaciones es crear o actualizar registros. Por lo tanto, es beneficioso para declarar algunas variables con la mutación, ya que son la forma de cómo pasar los datos en ella. Así que tenemos las variables&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;name&lt;/code&gt;,&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;title&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;message&lt;/code&gt;, escritas como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;String&lt;/code&gt;, que necesitamos llenar cada vez que llamemos a esta mutación. La función&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;createPost&lt;/code&gt;, de nuevo, está definida por Graphcool. Especificamos que las claves del modelo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Post&lt;/code&gt;&amp;nbsp;tendrán valores de las variables de mutación de salida, y también que queremos que el&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;id&lt;/code&gt;&amp;nbsp;del Post recién creado sea enviado a cambio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Injectable()
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormService {
  constructor(
    private apollo: Apollo,
    private router: Router,
    private appService: AppService
  ) { }
 
  addPost(value) {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.apollo.mutate({
      mutation: AddPostMutation,
      variables: {
        name: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appService.username,
        title: value.title,
        message: value.message
      }
    }).subscribe(({ data }) =&amp;gt; {
      &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.router.navigate([&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt;])
    }, (error) =&amp;gt; {
      console.log(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;there was an error sending the query&#39;&lt;/span&gt;, error)
    })
  }
 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando llamamos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;apollo.mutate&lt;/code&gt;, necesitamos proporcionar la mutación que llamamos y las variables también. Obtenemos el resultado en la función de devolución de llamada&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;subscribe&lt;/code&gt;&amp;nbsp;y usamos el` roteador ‘inyectado para navegar de nuevo a la lista de correos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormStore {
  constructor() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appStore = AppStore.getInstance()
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.routerStore = RouterStore.getInstance()
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postFormState = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; PostFormState()
  }
 
  submit = async () =&amp;gt; {
    await &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postFormState.form.validate()
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postFormState.form.error) &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; result = await &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appStore.apolloClient.mutate(
      {
        mutation: AddPostMutation,
        variables: {
          name: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.appStore.username,
          title: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postFormState.title.value,
          message: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postFormState.message.value
        }
      }
    )
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.goBack()
  }
 
  goBack = () =&amp;gt; {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.routerStore.history.push(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Muy similar a lo anterior, con la diferencia de más “manual” la inyección de dependencia, y el uso de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;async/await&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;En resúmen:&lt;/span&gt;&amp;nbsp;Una vez más, no hay mucha diferencia aquí. suscribirse vs async / await es básicamente todo lo que difiere.&lt;/div&gt;
&lt;h3 id=&quot;formularios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Formularios&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Queremos lograr los siguientes objetivos con los formularios de esta aplicación:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Enlace de datos de campos a un modelo&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mensajes de validación para cada campo, varias reglas&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Soporte para comprobar si todo el formulario es válido&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; check = (validator, message, options) =&amp;gt;
  (value) =&amp;gt; (!validator(value, options) &amp;amp;&amp;amp; message)
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; checkRequired = (msg: string) =&amp;gt; check(nonEmpty, msg)
 
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; PostFormState {
  title = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; FieldState(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;).validators(
    checkRequired(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title is required&#39;&lt;/span&gt;),
    check(isLength, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title must be at least 4 characters long.&#39;&lt;/span&gt;, { min: &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt; }),
    check(isLength, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title cannot be more than 24 characters long.&#39;&lt;/span&gt;, { max: &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;24&lt;/span&gt; }),
  )
  message = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; FieldState(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;).validators(
    checkRequired(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message cannot be blank.&#39;&lt;/span&gt;),
    check(isLength, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message is too short, minimum is 50 characters.&#39;&lt;/span&gt;, { min: &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;50&lt;/span&gt; }),
    check(isLength, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message is too long, maximum is 1000 characters.&#39;&lt;/span&gt;, { max: &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1000&lt;/span&gt; }),
  )
  form = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; FormState({
    title: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.title,
    message: &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.message
  })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por lo tanto, la librería&amp;nbsp;&lt;a href=&quot;https://formstate.github.io/#/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;formstate&lt;/a&gt;&amp;nbsp;funciona de la siguiente manera: para cada campo de su formulario, define un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FieldState&lt;/code&gt;. El parámetro pasado es el valor inicial. La propiedad&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;validators&lt;/code&gt;&amp;nbsp;toma una función, que devuelve “false” cuando el valor es válido, y un mensaje de validación cuando el valor no es válido. Con las funciones de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;check&#39; y&lt;/code&gt;checkRequired`, todo puede parecer muy declarativo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para tener la validación de toda la forma, es beneficioso también envolver esos campos con una instancia&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FormState&lt;/code&gt;, que a continuación, proporciona la validez agregada.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@inject(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;appStore&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;formStore&#39;&lt;/span&gt;)
@observer
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormComponent extends React.Component&amp;lt;FormComponentProps, any&amp;gt; {
  render() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; { appStore, formStore } = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.props
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; { postFormState } = formStore
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;xml&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h2&lt;/span&gt;&amp;gt;&lt;/span&gt; Create a new post &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h2&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt; You are now posting as {appStore.username} &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Input
&lt;/span&gt;        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;text&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;title&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;error&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.title.error}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.title.value}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.title.onChange}&lt;/span&gt;
      /&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Input
&lt;/span&gt;        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;text&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;multiline&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{true}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;rows&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{3}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;message&#39;&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;error&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.message.error}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.message.value}&lt;/span&gt;
        &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;{postFormState.message.onChange}&lt;/span&gt;
      /&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La instancia&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FormState&lt;/code&gt;&amp;nbsp;proporciona propiedades&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;value&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;onChange&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;error&lt;/code&gt;, que se pueden utilizar fácilmente con cualquier componente front-end.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;      &amp;lt;Button
        label=&#39;Cancel&#39;
        onClick={formStore.goBack}
        raised
        accent
      /&amp;gt; &amp;amp;nbsp;
      &amp;lt;Button
        label=&#39;Submit&#39;
        onClick={formStore.submit}
        raised
        disabled={postFormState.form.hasError}
        primary
      /&amp;gt;
 
    &amp;lt;/div&amp;gt;
 
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;form.hasError&lt;/code&gt;&amp;nbsp;es&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;true&lt;/code&gt;, mantenemos el botón deshabilitado. El botón Enviar envía el formulario a la mutación GraphQL presentada anteriormente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En Angular, vamos a utilizar&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FormService&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FormBuilder&lt;/code&gt;, que son partes del paquete&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@angular/forms&lt;/code&gt;.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;@Component({
  selector: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;app-form&#39;&lt;/span&gt;,
  templateUrl: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;./form.component.html&#39;&lt;/span&gt;,
  providers: [
    FormService
  ]
})
export &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;class&lt;/span&gt; FormComponent {
  postForm: FormGroup
  validationMessages = {
    &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;title&#39;&lt;/span&gt;: {
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;required&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title is required.&#39;&lt;/span&gt;,
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;minlength&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title must be at least 4 characters long.&#39;&lt;/span&gt;,
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;maxlength&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Title cannot be more than 24 characters long.&#39;&lt;/span&gt;
    },
    &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;message&#39;&lt;/span&gt;: {
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;required&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message cannot be blank.&#39;&lt;/span&gt;,
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;minlength&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message is too short, minimum is 50 characters&#39;&lt;/span&gt;,
      &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;maxlength&#39;&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Message is too long, maximum is 1000 characters&#39;&lt;/span&gt;
    }
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
First, let’s define the validation messages.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;  constructor(
    private router: Router,
    private formService: FormService,
    public appService: AppService,
    private fb: FormBuilder,
  ) {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.createForm()
  }
 
  createForm() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postForm = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.fb.group({
      title: [&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;,
        [Validators.required,
        Validators.minLength(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;),
        Validators.maxLength(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;24&lt;/span&gt;)]
      ],
      message: [&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;,
        [Validators.required,
        Validators.minLength(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;50&lt;/span&gt;),
        Validators.maxLength(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1000&lt;/span&gt;)]
      ],
    })
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;FormBuilder&lt;/code&gt;, es muy fácil crear la estructura del formulario, aún más sucintamente que en el ejemplo React.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;  get validationErrors() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; errors = {}
    &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Object&lt;/span&gt;.keys(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postForm.controls).forEach(key =&amp;gt; {
      errors[key] = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;&#39;&lt;/span&gt;
      &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; control = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.postForm.controls[key]
      &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (control &amp;amp;&amp;amp; !control.valid) {
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;const&lt;/span&gt; messages = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.validationMessages[key]
        &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Object&lt;/span&gt;.keys(control.errors).forEach(error =&amp;gt; {
          errors[key] += messages[error] + &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39; &#39;&lt;/span&gt;
        })
      }
    })
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; errors
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para obtener mensajes de validación vinculables en el lugar correcto, necesitamos realizar algún procesamiento. Este código se toma de la documentación oficial, con algunos pequeños cambios. Básicamente, en FormService, los campos guardan referencia sólo a errores activos, identificados por nombre de validador, por lo que necesitamos emparejar manualmente los mensajes requeridos a los campos afectados. Esto no es totalmente un inconveniente; por ejemplo, se presta más fácilmente a la internacionalización.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;  onSubmit({ value, valid }) {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!valid) {
      &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt;
    }
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.formService.addPost(value)
  }
 
  onCancel() {
    &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.router.navigate([&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/posts&#39;&lt;/span&gt;])
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez más, cuando el formulario es válido, los datos pueden ser enviados a la mutación GraphQL.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 1134px;&quot;&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h2&lt;/span&gt;&amp;gt;&lt;/span&gt; Create a new post &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h2&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt; You are now posting as {{appService.username}} &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;h3&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;form&lt;/span&gt; [&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;formGroup&lt;/span&gt;]=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;postForm&quot;&lt;/span&gt; (&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ngSubmit&lt;/span&gt;)=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;onSubmit(postForm)&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;novalidate&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mdInput&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;Title&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;formControlName&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;title&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-error&lt;/span&gt;&amp;gt;&lt;/span&gt;{{validationErrors[&#39;title&#39;]}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-error&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;textarea&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mdInput&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;Message&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;formControlName&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;textarea&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-error&lt;/span&gt;&amp;gt;&lt;/span&gt;{{validationErrors[&#39;message&#39;]}}&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-error&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-input-container&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-raised-button&lt;/span&gt; (&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;click&lt;/span&gt;)=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;onCancel()&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;color&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;warn&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button
&lt;/span&gt;    &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;md-raised-button&lt;/span&gt;
    &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;submit&quot;&lt;/span&gt;
    &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;color&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;primary&quot;&lt;/span&gt;
    [&lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;disabled&lt;/span&gt;]=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;postForm.dirty &amp;amp;&amp;amp; !postForm.valid&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;button&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;form&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo más importante es hacer referencia al formGroup que hemos creado con FormBuilder, que es la asignación&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[formGroup] = &#39;postForm&#39;&lt;/code&gt;. Los campos dentro del formulario están enlazados al modelo de formulario a través de la propiedad&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;formControlName&lt;/code&gt;. Nuevamente, desactivamos el botón “Enviar” cuando el formulario no es válido. También debemos agregar el check sucio, porque aquí, el formulario no sucio puede ser inválido. Queremos que el estado inicial del botón esté “habilitado”.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;En resúmen:&lt;/span&gt;&amp;nbsp;Este enfoque de las formas en React y Angular es bastante diferente en los frentes de validación y de plantilla. El enfoque Angular implica un poco más de “magia” en lugar de un enlace directo, pero, por otro lado, es más completo.&lt;/div&gt;
&lt;h3 id=&quot;tamao-del-lote&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tamaño del Lote&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Oh, una cosa más. La producción redujo los tamaños de paquetes de JS, con ajustes por defecto de los generadores de aplicación: notablemente Tree Shaking en React y AOT compilación en Angular.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Angular: 1200 KB&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;React: 300 KB&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Bueno, no hay mucha sorpresa aquí. Angular siempre ha sido el más voluminoso.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando se utiliza gzip, los tamaños bajan a 275kb y 127kb respectivamente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sólo ten en cuenta que estas son básicamente todas las librerías de proveedores. La cantidad de código de aplicación real es mínima por comparación, lo que no es el caso en una aplicación del mundo real. Allí, la proporción sería probablemente más parecida a 1:2 que 1:4. Además, cuando empieces a incluir muchas librerías de terceros con React, el tamaño del paquete también tiende a crecer con bastante rapidez.&lt;/div&gt;
&lt;h2 id=&quot;flexibilidad-de-las-bibliotecas-frente-a-la-robustez-del-marco&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Flexibilidad de las bibliotecas frente a la robustez del marco&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que parece que no hemos sido capaces (¡de nuevo!) para dar una respuesta clara sobre si Angular o React es mejor para el desarrollo web.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Resulta que los flujos de trabajo de desarrollo en React y Angular pueden ser muy similares, dependiendo de las bibliotecas que elegimos para usar React with. Entonces es principalmente una cuestión de preferencia personal.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si te gustan las pilas ya hechas, la poderosa inyección de dependencia y el plan para usar algunas golosinas de RxJS, eligió Angular.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si te gusta jugar y construir tu propia pila, te gusta la simplicidad de JSX y prefieres propiedades computables más simples, selecciona React / MobX.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez más, puede obtener el código fuente completo de la aplicación de este artículo&amp;nbsp;&lt;a href=&quot;https://github.com/tomaash/shoutboard-angular&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;https://github.com/tomaash/shoutboard-react&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
O, si prefieres ejemplos más grandes, y de RealWorld:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/gothinkster/angular-realworld-example-app&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;RealWorld Angular 4+&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://github.com/gothinkster/react-mobx-realworld-example-app&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;RealWorld React/MobX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;primero-elige-tu-paradigma-de-programacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero, Elige tu Paradigma de Programación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La programación con React/MobX es en realidad más similar a Angular que con React/Redux. Hay algunas diferencias notables en las plantillas y el manejo de dependencias, pero tienen el mismo paradigma&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mutable/data binding&lt;/span&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
React / Redux con su paradigma&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;inmutable/unidireccional&lt;/span&gt;&amp;nbsp;es una bestia completamente diferente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No te dejes engañar por la pequeña huella de la librería de Redux. Puede ser pequeña, pero es un framework de todos modos. La mayoría de las mejores prácticas de Redux hoy se centran en el uso de librerías compatibles con redux, como&amp;nbsp;&lt;a href=&quot;https://redux-saga.js.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Redux Saga&lt;/a&gt;&amp;nbsp;para el código asíncrono y la búsqueda de datos,&amp;nbsp;&lt;a href=&quot;http://%20/redux-form.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Redux Form&lt;/a&gt;&amp;nbsp;para la gestión de formularios,&amp;nbsp;&lt;a href=&quot;https://github.com/reactjs/reselect&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Reselect&lt;/a&gt;&amp;nbsp;para selectores memorizados (valores calculados de Redux). y&amp;nbsp;&lt;a href=&quot;https://github.com/acdlite/recompose&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Recompose&lt;/a&gt;, entre otros, para una gestión del ciclo de vida más fina. Además, hay un cambio en la comunidad Redux de&amp;nbsp;&lt;a href=&quot;https://facebook.github.io/immutable-js/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Immutable.js&lt;/a&gt;&amp;nbsp;a&amp;nbsp;&lt;a href=&quot;http://ramdajs.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ramda&lt;/a&gt;&amp;nbsp;o&amp;nbsp;&lt;a href=&quot;https://github.com/lodash/lodash/wiki/FP-Guide&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;lodash/fp&lt;/a&gt;, que funcionan con objetos JS sencillos en lugar de convertirlos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un buen ejemplo de Redux moderno es el bien conocido&amp;nbsp;&lt;a href=&quot;https://github.com/react-boilerplate/react-boilerplate&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React Boilerplate&lt;/a&gt;. Es una pila de desarrollo formidable, pero si lo echas un vistazo, es realmente muy, muy diferente de todo lo que hemos visto en este post hasta ahora.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Siento que Angular está recibiendo un poco de tratamiento injusto de la parte más vocal de la comunidad de JavaScript. Muchas personas que expresan su insatisfacción con ella probablemente no aprecian el cambio inmenso que ocurrió entre el antiguo AngularJS y Angular de hoy. En mi opinión, es un marco muy limpio y productivo que tomaría el mundo por la tormenta si hubiera aparecido 1-2 años antes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, Angular está ganando un punto de apoyo sólido, especialmente en el mundo corporativo, con grandes equipos y necesidades de estandarización y soporte a largo plazo. O para decirlo de otra manera, Angular es la forma en que los ingenieros de Google piensan que el desarrollo web debe hacerse, si eso sigue siendo así.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En cuanto a MobX, se aplica una evaluación similar. Realmente genial, pero no se aprecia mucho.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En conclusión: antes de elegir entre React y Angular, elige primero tu paradigma de programación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mutable/enlace de datos&lt;/span&gt;&amp;nbsp;ó&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;inmutable/unidireccional&lt;/span&gt;, ese parece ser el problema real.&lt;/div&gt;
&lt;div class=&quot;post_key_learnings&quot; style=&quot;background: rgb(245, 247, 250); border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: rgb(207, 217, 232); border-top-style: solid; border-width: 1px 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px -37px 45px; min-height: 0px; min-width: 0px; padding: 35px 37px 20px; vertical-align: baseline;&quot;&gt;
&lt;h2 class=&quot;post_key_learnings-heading&quot; data-disable_subscribe_placement=&quot;true&quot; style=&quot;border: 0px; box-sizing: border-box; line-height: 1.3em; margin: 0px 0px 25px; min-height: 0px; min-width: 0px; padding: 0px; text-transform: uppercase; vertical-align: baseline;&quot;&gt;
UNDERSTANDING THE BASICS&lt;/h2&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;expanded&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-expanded&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-expanded&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Is React a framework?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
React is a JavaScript library for building user interfaces. It deals with the views and lets you choose the rest of your front-end architecture. However, a strong library ecosystem has developed around it, allowing you to build a complete framework around React by adding a few libraries to it.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom: none; border-image: initial; border-left: 0px; border-right: 0px; border-top: 0px; box-sizing: border-box; margin: 0px -37px; min-height: 0px; min-width: 0px; padding: 0px 37px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
How do I implement computed properties in Angular?&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
Por: &lt;b&gt;&lt;a href=&quot;https://www.toptal.com/resume/tomas-holas&quot;&gt;Tomas Holas&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Artículo vía: &lt;a href=&quot;https://www.toptal.com/front-end/angular-vs-react-cu%C3%A1l-es-mejor-para-el-desarrollo-web-/es&quot;&gt;&lt;b&gt;Toptal&lt;/b&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/8704952126757647852/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/angular-vs-react-cual-es-mejor-para-el-desarrollo-web.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/8704952126757647852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/8704952126757647852'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/angular-vs-react-cual-es-mejor-para-el-desarrollo-web.html' title='Angular vs. React: ¿Cuál es Mejor Para el Desarrollo Web?'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-4031259488959117334</id><published>2017-09-10T22:12:00.000-03:00</published><updated>2017-09-11T11:23:45.325-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dropwizard"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Microservices"/><category scheme="http://www.blogger.com/atom/ns#" term="Programacion"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><title type='text'>Un Comienzo con Microservicios: Un Tutorial de Dropwizard</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todos somos testigos de un aumento en la popularidad de las arquitecturas de microservicios. En una arquitectura de microservicios, Dropwizard ocupa un lugar muy importante. Es un marco para la creación de servicios web RESTful o, para ser más específicos, un conjunto de herramientas y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;frameworks&lt;/em&gt;&amp;nbsp;para la creación de servicios web RESTful.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Permite a los desarrolladores un arranque más rápido del proyecto. Esto te ayuda a empaquetar tus aplicaciones, para que se puedan desplegar fácilmente en un entorno de producción como servicios independientes. Si alguna vez has estado en una situación en la que necesitas arrancar un proyecto en el&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/twitter-bootstrap/speeding-up-development-bootstrap&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framework Spring&lt;/a&gt;, por ejemplo, probablemente sabes lo doloroso que puede ser.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Ilustración: Ejemplo de Microservicios en el Tutorial de Dropwizard&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123376/toptal-blog-image-1498044832305-7c1db9b310998f5b0a11486a2a6dcb32.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Con Dropwizard, solo se trata de añadir una dependencia de Maven.&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este blog, te guiaré a través del proceso completo de escribir un simple servicio Dropwizard RESTful. Cuando terminemos, tendremos un servicio para operaciones básicas de CRUD en “partes”. Realmente no importa que es “parte”; puede ser cualquier cosa, pero fue lo primero que se me ocurrió.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Almacenaremos la data en una base de datos MySQL, usando JDBI para consultarla y usaremos los siguientes&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoints&lt;/em&gt;:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;GET /parts&lt;/code&gt;&amp;nbsp;-to retrieve all parts from DB&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;GET /part/{id}&lt;/code&gt;&amp;nbsp;to get a particular part from DB&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;POST /parts&lt;/code&gt;&amp;nbsp;-to create new part&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;PUT /parts/{id}&lt;/code&gt;&amp;nbsp;-to edit an existing part&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;DELETE /parts/{id}&lt;/code&gt;&amp;nbsp;-to delete the part from a DB&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usaremos OAuth para autenticar nuestro servicio y luego agregarle algunas pruebas de unidad&lt;/div&gt;
&lt;h2 id=&quot;bibliotecas-dropwizard-predeterminadas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Bibliotecas Dropwizard Predeterminadas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En lugar de incluir todas las bibliotecas necesarias para crear un servicio REST por separado y configurar cada una de ellas, Dropwizard lo hace por nosotros. Aquí está la lista de bibliotecas que vienen predeterminadas con Dropwizard:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Jetty:&lt;/span&gt;&amp;nbsp;Necesitarás HTTP para ejecutar una aplicación web. Dropwizard incorpora el contenedor&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;servlet&lt;/em&gt;&amp;nbsp;Jetty para ejecutar aplicaciones web. En lugar de implementar tus aplicaciones en un servidor de aplicaciones o servidor web, Dropwizard define un método principal que invoca al servidor Jetty como un proceso autónomo. A partir de ahora, Dropwizard recomienda sólo ejecutar la aplicación con Jetty; otros servicios web como Tomcat no son oficialmente compatibles.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Jersey:&lt;/span&gt;&amp;nbsp;Jersey es una de las mejores implementaciones API de REST en el mercado. Además, sigue la especificación estándar de JAX-RS y es la implementación de referencia para la especificación JAX-RS. Dropwizard utiliza Jersey como el marco predeterminado para la creación de aplicaciones web RESTful.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Jackson:&lt;/span&gt;&amp;nbsp;Jackson es el estándar de facto para el manejo del formato JSON. Es una de las mejores API de asignación de objetos para el formato JSON.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Métricas:&lt;/span&gt;&amp;nbsp;Dropwizard tiene su propio módulo de métricas para exponer las métricas de la aplicación a través de los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoints&lt;/em&gt;&amp;nbsp;HTTP.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Guava:&lt;/span&gt;&amp;nbsp;Además de estructuras de data inmutables y altamente optimizadas, Guava proporciona un número creciente de clases para acelerar el&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/java&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;desarrollo en Java&lt;/a&gt;.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Logback y Slf4j:&lt;/span&gt;&amp;nbsp;Estos dos se utilizan para mejorar los mecanismos de registro.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemarker y Mustache:&lt;/span&gt;&amp;nbsp;La elección de motores de plantilla para su aplicación es una de las decisiones clave. El motor de plantilla elegido tiene que ser más flexible para escribir mejores secuencias de comandos. Dropwizard utiliza motores de plantilla Freemarker y Mustache, los cuales son bien conocidos y populares, para la construcción de las interfaces de usuario.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aparte de la lista anterior, hay muchas otras bibliotecas como Joda Time, Liquibase, Apache HTTP Client y Hibernate Validator utilizadas por Dropwizard para la creación de servicios REST.&lt;/div&gt;
&lt;h2 id=&quot;configuracin-maven&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Configuración Maven&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dropwizard apoya, de manera oficial, a&amp;nbsp;&lt;a href=&quot;https://maven.apache.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Maven&lt;/a&gt;. Incluso si puedes usar otras herramientas de compilación, la mayoría de las guías y documentación utilizan Maven, así que también lo usaremos aquí. Si no estás familiarizado con Maven, puedes consultar este&amp;nbsp;&lt;a href=&quot;https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;tutorial Maven&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este es el primer paso para crear tu aplicación Dropwizard. Agrega la siguiente entrada en el archivo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;pom.xml&lt;/code&gt;de Maven:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;dependencies&amp;gt;
 &amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;dropwizard-core&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Antes de añadir la entrada anterior, puedes añadir&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;dropwizard.versión&lt;/code&gt;&amp;nbsp;como se muestra a continuación:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;properties&amp;gt;
 &amp;lt;dropwizard.version&amp;gt;1.1.0&amp;lt;/dropwizard.version&amp;gt;
&amp;lt;/properties&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Eso es todo. Ya terminaste de escribir la configuración de Maven. Esto descargará todas las dependencias necesarias para tu proyecto. La versión actual de&amp;nbsp;&lt;a href=&quot;http://www.dropwizard.io/1.1.0/docs/about/release-notes.html#v1-1-0-mar-21-2017&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Dropwizard es 1.1.0&lt;/a&gt;, así que la estaremos usando en esta guía.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora podemos pasar a escribir nuestra primera aplicación Dropwizard real.&lt;/div&gt;
&lt;h2 id=&quot;definir-clase-de-configuracin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Definir Clase de Configuración&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dropwizard almacena configuraciones en archivos&amp;nbsp;&lt;a href=&quot;http://www.yaml.org/start.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;YAML&lt;/a&gt;. Vas a necesitar el archivo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;configuration.yml&lt;/code&gt;&amp;nbsp;en la carpeta raíz de la aplicación. Este archivo se deserializará a una instancia de la clase de configuración de tu aplicación y se validará. El archivo de configuración de tu aplicación es la subclase de la clase de configuración de Dropwizard (&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;io.dropwizard.Configuration&lt;/code&gt;).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Vamos a crear una clase configuración simple:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import com.fasterxml.jackson.annotation.JsonProperty;

import io.dropwizard.Configuration;
import io.dropwizard.db.DataSourceFactory;

public class DropwizardBlogConfiguration extends Configuration {
 private static final String DATABASE = &quot;database&quot;;

 @Valid
 @NotNull
 private DataSourceFactory dataSourceFactory = new DataSourceFactory();

 @JsonProperty(DATABASE)
 public DataSourceFactory getDataSourceFactory() {
   return dataSourceFactory;
 }

 @JsonProperty(DATABASE)
 public void setDataSourceFactory(final DataSourceFactory dataSourceFactory) {
   this.dataSourceFactory = dataSourceFactory;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El archivo de configuración YAML se vería así:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;database:
 driverClass: com.mysql.cj.jdbc.Driver
 url: jdbc:mysql://localhost/dropwizard_blog
 user: dropwizard_blog
 password: dropwizard_blog 
 maxWaitForConnection: 1s
 validationQuery: &quot;SELECT 1&quot;
 validationQueryTimeout: 3s
 minSize: 8
 maxSize: 32
 checkConnectionWhileIdle: false
 evictionInterval: 10s
 minIdleTime: 1 minute
 checkConnectionOnBorrow: true
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La clase anterior se deserializará del archivo YAML y colocará los valores del archivo YAML en este objeto.&lt;/div&gt;
&lt;h2 id=&quot;definir-una-clase-de-aplicacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Definir una Clase de Aplicación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora debemos ir y crear la clase de aplicación principal. Esta clase reunirá todos los paquetes, llevará la aplicación y la pondrá en funcionamiento para tu uso.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación se muestra un ejemplo de una clase de aplicación en Dropwizard:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import io.dropwizard.Application;
import io.dropwizard.auth.AuthDynamicFeature;
import io.dropwizard.auth.oauth.OAuthCredentialAuthFilter;
import io.dropwizard.setup.Environment;

import javax.sql.DataSource;

import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
import org.skife.jdbi.v2.DBI;

import com.toptal.blog.auth.DropwizardBlogAuthenticator;
import com.toptal.blog.auth.DropwizardBlogAuthorizer;
import com.toptal.blog.auth.User;
import com.toptal.blog.config.DropwizardBlogConfiguration;
import com.toptal.blog.health.DropwizardBlogApplicationHealthCheck;
import com.toptal.blog.resource.PartsResource;
import com.toptal.blog.service.PartsService;

public class DropwizardBlogApplication extends Application&amp;lt;DropwizardBlogConfiguration&amp;gt; {
 private static final String SQL = &quot;sql&quot;;
 private static final String DROPWIZARD_BLOG_SERVICE = &quot;Dropwizard blog service&quot;;
 private static final String BEARER = &quot;Bearer&quot;;

 public static void main(String[] args) throws Exception {
   new DropwizardBlogApplication().run(args);
 }

 @Override
 public void run(DropwizardBlogConfiguration configuration, Environment environment) {
   // Datasource configuration
   final DataSource dataSource =
       configuration.getDataSourceFactory().build(environment.metrics(), SQL);
   DBI dbi = new DBI(dataSource);

   // Register Health Check
   DropwizardBlogApplicationHealthCheck healthCheck =
       new DropwizardBlogApplicationHealthCheck(dbi.onDemand(PartsService.class));
   environment.healthChecks().register(DROPWIZARD_BLOG_SERVICE, healthCheck);

   // Register OAuth authentication
   environment.jersey()
       .register(new AuthDynamicFeature(new OAuthCredentialAuthFilter.Builder&amp;lt;User&amp;gt;()
           .setAuthenticator(new DropwizardBlogAuthenticator())
           .setAuthorizer(new DropwizardBlogAuthorizer()).setPrefix(BEARER).buildAuthFilter()));
   environment.jersey().register(RolesAllowedDynamicFeature.class);

   // Register resources
   environment.jersey().register(new PartsResource(dbi.onDemand(PartsService.class)));
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo que hicimos anteriormente es anular el método de ejecución de Dropwizard. En este método, estamos instanciando una conexión de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DB&lt;/em&gt;&amp;nbsp;(Base de datos), registrando nuestro chequeo de salud personalizado (hablaremos de eso más adelante), inicializando la autenticación OAuth para nuestro servicio y finalmente, registrando un recurso Dropwizard.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todo esto se explicará más adelante.&lt;/div&gt;
&lt;h2 id=&quot;define-una-clase-de-representacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Define una Clase de Representación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora tenemos que empezar a pensar en nuestra REST API y cuál será la representación de nuestro recurso. Tenemos que diseñar el formato JSON y la clase de representación correspondiente que se convierte al formato JSON deseado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Veamos el formato JSON de muestra para este ejemplo de clase de representación simple:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;{
 &quot;code&quot;: 200,
 &quot;data&quot;: {
   &quot;id&quot;: 1,
   &quot;name&quot;: &quot;Part 1&quot;,
   &quot;code&quot;: &quot;PART_1_CODE&quot;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para el formato JSON anterior, crearemos la clase de representación de la siguiente manera:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import org.hibernate.validator.constraints.Length;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Representation&amp;lt;T&amp;gt; {
 private long code;

 @Length(max = 3)
 private T data;

 public Representation() {
   // Jackson deserialization
 }

 public Representation(long code, T data) {
   this.code = code;
   this.data = data;
 }

 @JsonProperty
 public long getCode() {
   return code;
 }

 @JsonProperty
 public T getData() {
   return data;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto es POJO de una manera muy simple.&lt;/div&gt;
&lt;h2 id=&quot;definicin-de-una-clase-de-recursos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Definición de una Clase de Recursos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un recurso es en lo que se basan los servicios REST. No es nada más que un URI de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoint&lt;/em&gt;&amp;nbsp;para acceder al recurso en el servidor. En este ejemplo, tendremos una clase de recurso con pocas anotaciones para el mapeo de URI de solicitud. Dado que Dropwizard utiliza la implementación JAX-RS, definiremos la ruta URI utilizando la anotación&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;@Path&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí te muestro una clase de recurso para nuestro ejemplo de Dropwizard:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.eclipse.jetty.http.HttpStatus;

import com.codahale.metrics.annotation.Timed;
import com.toptal.blog.model.Part;
import com.toptal.blog.representation.Representation;
import com.toptal.blog.service.PartsService;

@Path(&quot;/parts&quot;)
@Produces(MediaType.APPLICATION_JSON)
@RolesAllowed(&quot;ADMIN&quot;)
public class PartsResource {
 private final PartsService partsService;;

 public PartsResource(PartsService partsService) {
   this.partsService = partsService;
 }

 @GET
 @Timed
 public Representation&amp;lt;List&amp;lt;Part&amp;gt;&amp;gt; getParts() {
   return new Representation&amp;lt;List&amp;lt;Part&amp;gt;&amp;gt;(HttpStatus.OK_200, partsService.getParts());
 }

 @GET
 @Timed
 @Path(&quot;{id}&quot;)
 public Representation&amp;lt;Part&amp;gt; getPart(@PathParam(&quot;id&quot;) final int id) {
   return new Representation&amp;lt;Part&amp;gt;(HttpStatus.OK_200, partsService.getPart(id));
 }

 @POST
 @Timed
 public Representation&amp;lt;Part&amp;gt; createPart(@NotNull @Valid final Part part) {
   return new Representation&amp;lt;Part&amp;gt;(HttpStatus.OK_200, partsService.createPart(part));
 }

 @PUT
 @Timed
 @Path(&quot;{id}&quot;)
 public Representation&amp;lt;Part&amp;gt; editPart(@NotNull @Valid final Part part,
     @PathParam(&quot;id&quot;) final int id) {
   part.setId(id);
   return new Representation&amp;lt;Part&amp;gt;(HttpStatus.OK_200, partsService.editPart(part));
 }

 @DELETE
 @Timed
 @Path(&quot;{id}&quot;)
 public Representation&amp;lt;String&amp;gt; deletePart(@PathParam(&quot;id&quot;) final int id) {
   return new Representation&amp;lt;String&amp;gt;(HttpStatus.OK_200, partsService.deletePart(id));
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes ver como todos los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoints&lt;/em&gt;&amp;nbsp;realmente se definen en esta clase.&lt;/div&gt;
&lt;h2 id=&quot;registro-de-un-recurso&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Registro de un Recurso&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Volvería ahora a la clase de aplicación principal. Puedes ver al final de esa clase que hemos registrado nuestro recurso para ser inicializado con la ejecución del servicio. Tenemos que hacerlo con todos los recursos que podamos tener en nuestra aplicación. Éste es el fragmento de código responsable de eso:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;// Register resources
   environment.jersey().register(new PartsResource(dbi.onDemand(PartsService.class)));
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;capa-de-servicio&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Capa de Servicio&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para un manejo de excepciones adecuado y la capacidad de ser independiente del motor de almacenamiento de data, introduciremos una clase de servicio de “capa-media”. Esta es la clase que llamaremos desde nuestra capa de recursos, sin importar lo que está subyacente. Es por eso que tenemos esta capa en particular entre capas de recursos y DAO. Ésta es nuestra clase de servicio:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.util.List;
import java.util.Objects;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;

import org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException;
import org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException;
import org.skife.jdbi.v2.sqlobject.CreateSqlObject;

import com.toptal.blog.dao.PartsDao;
import com.toptal.blog.model.Part;

public abstract class PartsService {
 private static final String PART_NOT_FOUND = &quot;Part id %s not found.&quot;;
 private static final String DATABASE_REACH_ERROR =
     &quot;Could not reach the MySQL database. The database may be down or there may be network connectivity issues. Details: &quot;;
 private static final String DATABASE_CONNECTION_ERROR =
     &quot;Could not create a connection to the MySQL database. The database configurations are likely incorrect. Details: &quot;;
 private static final String DATABASE_UNEXPECTED_ERROR =
     &quot;Unexpected error occurred while attempting to reach the database. Details: &quot;;
 private static final String SUCCESS = &quot;Success...&quot;;
 private static final String UNEXPECTED_ERROR = &quot;An unexpected error occurred while deleting part.&quot;;

 @CreateSqlObject
 abstract PartsDao partsDao();

 public List&amp;lt;Part&amp;gt; getParts() {
   return partsDao().getParts();
 }

 public Part getPart(int id) {
   Part part = partsDao().getPart(id);
   if (Objects.isNull(part)) {
     throw new WebApplicationException(String.format(PART_NOT_FOUND, id), Status.NOT_FOUND);
   }
   return part;
 }

 public Part createPart(Part part) {
   partsDao().createPart(part);
   return partsDao().getPart(partsDao().lastInsertId());
 }

 public Part editPart(Part part) {
   if (Objects.isNull(partsDao().getPart(part.getId()))) {
     throw new WebApplicationException(String.format(PART_NOT_FOUND, part.getId()),
         Status.NOT_FOUND);
   }
   partsDao().editPart(part);
   return partsDao().getPart(part.getId());
 }

 public String deletePart(final int id) {
   int result = partsDao().deletePart(id);
   switch (result) {
     case 1:
       return SUCCESS;
     case 0:
       throw new WebApplicationException(String.format(PART_NOT_FOUND, id), Status.NOT_FOUND);
     default:
       throw new WebApplicationException(UNEXPECTED_ERROR, Status.INTERNAL_SERVER_ERROR);
   }
 }

 public String performHealthCheck() {
   try {
     partsDao().getParts();
   } catch (UnableToObtainConnectionException ex) {
     return checkUnableToObtainConnectionException(ex);
   } catch (UnableToExecuteStatementException ex) {
     return checkUnableToExecuteStatementException(ex);
   } catch (Exception ex) {
     return DATABASE_UNEXPECTED_ERROR + ex.getCause().getLocalizedMessage();
   }
   return null;
 }

 private String checkUnableToObtainConnectionException(UnableToObtainConnectionException ex) {
   if (ex.getCause() instanceof java.sql.SQLNonTransientConnectionException) {
     return DATABASE_REACH_ERROR + ex.getCause().getLocalizedMessage();
   } else if (ex.getCause() instanceof java.sql.SQLException) {
     return DATABASE_CONNECTION_ERROR + ex.getCause().getLocalizedMessage();
   } else {
     return DATABASE_UNEXPECTED_ERROR + ex.getCause().getLocalizedMessage();
   }
 }

 private String checkUnableToExecuteStatementException(UnableToExecuteStatementException ex) {
   if (ex.getCause() instanceof java.sql.SQLSyntaxErrorException) {
     return DATABASE_CONNECTION_ERROR + ex.getCause().getLocalizedMessage();
   } else {
     return DATABASE_UNEXPECTED_ERROR + ex.getCause().getLocalizedMessage();
   }
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La última parte de ésta es en realidad una implementación de control de salud, de la que hablaremos más adelante.&lt;/div&gt;
&lt;h2 id=&quot;capa-dao-jdbi-y-mapper&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Capa DAO, JDBI y Mapper&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dropwizard es compatible con JDBI e Hibernate. Es un módulo Maven separado, por lo que primero vamos a agregarlo como una dependencia, así como el conector MySQL&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;dropwizard-jdbi&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${mysql.connector.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para un simple servicio CRUD, personalmente prefiero JDBI, ya que es más sencillo y mucho más rápido de implementar. He creado un esquema simple de MySQL con una tabla solamente para ser utilizada en nuestro ejemplo. Puedes encontrar el script&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;init&lt;/em&gt;&amp;nbsp;para el esquema dentro del origen. JDBI ofrece escritura simple de preguntas, usando anotaciones tales como @SqlQuery para la lectura y @SqlUpdate para escribir data. Aquí está nuestra interfaz DAO:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.util.List;

import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.BindBean;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;
import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;

import com.toptal.blog.mapper.PartsMapper;
import com.toptal.blog.model.Part;

@RegisterMapper(PartsMapper.class)
public interface PartsDao {

 @SqlQuery(&quot;select * from parts;&quot;)
 public List&amp;lt;Part&amp;gt; getParts();

 @SqlQuery(&quot;select * from parts where id = :id&quot;)
 public Part getPart(@Bind(&quot;id&quot;) final int id);

 @SqlUpdate(&quot;insert into parts(name, code) values(:name, :code)&quot;)
 void createPart(@BindBean final Part part);

 @SqlUpdate(&quot;update parts set name = coalesce(:name, name), code = coalesce(:code, code) where id = :id&quot;)
 void editPart(@BindBean final Part part);

 @SqlUpdate(&quot;delete from parts where id = :id&quot;)
 int deletePart(@Bind(&quot;id&quot;) final int id);

 @SqlQuery(&quot;select last_insert_id();&quot;)
 public int lastInsertId();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como puedes ver, es bastante simple. Sin embargo, necesitamos asignar nuestros conjuntos de resultados de SQL a un modelo, lo cual se hace mediante el registro de una clase&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mapper&lt;/em&gt;. Aquí está nuestra clase&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mapper&lt;/em&gt;:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.sql.ResultSet;
import java.sql.SQLException;

import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;

import com.toptal.blog.model.Part;

public class PartsMapper implements ResultSetMapper&amp;lt;Part&amp;gt; {
 private static final String ID = &quot;id&quot;;
 private static final String NAME = &quot;name&quot;;
 private static final String CODE = &quot;code&quot;;

 public Part map(int i, ResultSet resultSet, StatementContext statementContext)
     throws SQLException {
   return new Part(resultSet.getInt(ID), resultSet.getString(NAME), resultSet.getString(CODE));
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Y nuestro modelo:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import org.hibernate.validator.constraints.NotEmpty;

public class Part {
 private int id;
 @NotEmpty
 private String name;
 @NotEmpty
 private String code;

 public int getId() {
   return id;
 }

 public void setId(int id) {
   this.id = id;
 }

 public String getName() {
   return name;
 }

 public void setName(String name) {
   this.name = name;
 }

 public String getCode() {
   return code;
 }

 public void setCode(String code) {
   this.code = code;
 }

 public Part() {
   super();
 }

 public Part(int id, String name, String code) {
   super();
   this.id = id;
   this.name = name;
   this.code = code;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;chequeo-de-salud-de-dropwizard&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Chequeo de Salud de Dropwizard&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dropwizard ofrece soporte nativo para la comprobación de la salud. En nuestro caso, probablemente vamos a comprobar si la base de datos está funcionando antes de decir que nuestro servicio es saludable. Lo que hacemos es realizar alguna acción sencilla de Base de Datos, como obtener partes de la Base de Datos y manejar los resultados potenciales (exitosos o excepciones).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí está nuestra implementación de chequeo de salud en Dropwizard:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import com.codahale.metrics.health.HealthCheck;
import com.toptal.blog.service.PartsService;

public class DropwizardBlogApplicationHealthCheck extends HealthCheck {
 private static final String HEALTHY = &quot;The Dropwizard blog Service is healthy for read and write&quot;;
 private static final String UNHEALTHY = &quot;The Dropwizard blog Service is not healthy. &quot;;
 private static final String MESSAGE_PLACEHOLDER = &quot;{}&quot;;

 private final PartsService partsService;

 public DropwizardBlogApplicationHealthCheck(PartsService partsService) {
   this.partsService = partsService;
 }

 @Override
 public Result check() throws Exception {
   String mySqlHealthStatus = partsService.performHealthCheck();

   if (mySqlHealthStatus == null) {
     return Result.healthy(HEALTHY);
   } else {
     return Result.unhealthy(UNHEALTHY + MESSAGE_PLACEHOLDER, mySqlHealthStatus);
   }
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;adicin-de-autenticacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Adición de Autenticación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dropwizard admite la autenticación básica y&amp;nbsp;&lt;a href=&quot;https://oauth.net/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;OAuth&lt;/a&gt;. Aquí, te mostraré cómo proteger tu servicio con OAuth. Sin embargo, debido a la complejidad, he omitido una estructura de Base de Datos subyacente y sólo mostraré cómo se desarrolla. Implementar a escala completa no debería ser un problema a partir de aquí. Dropwizard tiene dos interfaces importantes que necesitamos implementar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El primero es&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Authenticator&lt;/em&gt;. Nuestra clase debe implementar el método&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;authenticate&lt;/code&gt;, que debe comprobar si el identificador de acceso dado es válido. Así que yo llamaría esto como una primera puerta a la aplicación. Si se da con éxito, debería dar como resultado un principal. Este principal es nuestro usuario real con su rol. Éste es importante para otra interfaz de Dropwizard que necesitamos implementar. Éste es el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Authorizer&lt;/em&gt;&amp;nbsp;y es responsable de comprobar si el usuario tiene suficientes permisos para acceder a un determinado recurso. Por lo tanto, si regresas y revisas nuestra clase de recursos, verás que requiere el rol de administrador para acceder a sus&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoints&lt;/em&gt;. Estas anotaciones también pueden ser por método. El soporte de autorización Dropwizard es un módulo Maven separado, por lo que debemos agregarlo a dependencias:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;dropwizard-auth&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí están las clases de nuestro ejemplo que realmente no hacen nada inteligente pero es un esqueleto para una autorización de OAuth a gran escala:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.util.Optional;

import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;

public class DropwizardBlogAuthenticator implements Authenticator&amp;lt;String, User&amp;gt; {
 @Override
 public Optional&amp;lt;User&amp;gt; authenticate(String token) throws AuthenticationException {
   if (&quot;test_token&quot;.equals(token)) {
     return Optional.of(new User());
   }
   return Optional.empty();
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.util.Objects;

import io.dropwizard.auth.Authorizer;

public class DropwizardBlogAuthorizer implements Authorizer&amp;lt;User&amp;gt; {
 @Override
 public boolean authorize(User principal, String role) {
   // Allow any logged in user.
   if (Objects.nonNull(principal)) {
     return true;
   }
   return false;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import java.security.Principal;

public class User implements Principal {
 private int id;
 private String username;
 private String password;

 public int getId() {
   return id;
 }

 public void setId(int id) {
   this.id = id;
 }

 public String getUsername() {
   return username;
 }

 public void setUsername(String username) {
   this.username = username;
 }

 public String getPassword() {
   return password;
 }

 public void setPassword(String password) {
   this.password = password;
 }

 @Override
 public String getName() {
   return username;
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pruebas-de-unidad-en-dropwizard&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Pruebas de Unidad en DropWizard&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Vamos a agregar algunas pruebas de unidad a nuestra aplicación. Me atengo a probar partes específicas del código de Dropwizard, en nuestro caso: Representación y Recurso. Necesitaremos agregar las siguientes dependencias a nuestro archivo Maven:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;dropwizard-testing&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${mockito.version}&amp;lt;/version&amp;gt;
 &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Para probar la representación, también necesitaremos un archivo JSON de ejemplo para probar contra éste. Así que vamos a crear&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;fixtures/part.json&lt;/code&gt;&amp;nbsp;bajo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;src/test/resources&lt;/code&gt;:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;{
 &quot;id&quot;: 1,
 &quot;name&quot;: &quot;testPartName&quot;,
 &quot;code&quot;: &quot;testPartCode&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Y aquí está la clase de prueba JUnit:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;import static io.dropwizard.testing.FixtureHelpers.fixture;
import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.toptal.blog.model.Part;

import io.dropwizard.jackson.Jackson;

public class RepresentationTest {
 private static final ObjectMapper MAPPER = Jackson.newObjectMapper();
 private static final String PART_JSON = &quot;fixtures/part.json&quot;;
 private static final String TEST_PART_NAME = &quot;testPartName&quot;;
 private static final String TEST_PART_CODE = &quot;testPartCode&quot;;

 @Test
 public void serializesToJSON() throws Exception {
   final Part part = new Part(1, TEST_PART_NAME, TEST_PART_CODE);

   final String expected =
       MAPPER.writeValueAsString(MAPPER.readValue(fixture(PART_JSON), Part.class));

   assertThat(MAPPER.writeValueAsString(part)).isEqualTo(expected);
 }

 @Test
 public void deserializesFromJSON() throws Exception {
   final Part part = new Part(1, TEST_PART_NAME, TEST_PART_CODE);

   assertThat(MAPPER.readValue(fixture(PART_JSON), Part.class).getId()).isEqualTo(part.getId());
   assertThat(MAPPER.readValue(fixture(PART_JSON), Part.class).getName())
       .isEqualTo(part.getName());
   assertThat(MAPPER.readValue(fixture(PART_JSON), Part.class).getCode())
       .isEqualTo(part.getCode());
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Cuando se trata de probar los recursos, el punto principal de la prueba de Dropwizard es que realmente se está comportando como un cliente HTTP, enviando solicitudes HTTP contra los recursos. Por lo tanto, no estás probando métodos como lo harías normalmente en un caso común. Aquí está el ejemplo de nuestra clase&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;PartsResource&lt;/code&gt;:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;public class PartsResourceTest {
 private static final String SUCCESS = &quot;Success...&quot;;
 private static final String TEST_PART_NAME = &quot;testPartName&quot;;
 private static final String TEST_PART_CODE = &quot;testPartCode&quot;;
 private static final String PARTS_ENDPOINT = &quot;/parts&quot;;

 private static final PartsService partsService = mock(PartsService.class);

 @ClassRule
 public static final ResourceTestRule resources =
     ResourceTestRule.builder().addResource(new PartsResource(partsService)).build();

 private final Part part = new Part(1, TEST_PART_NAME, TEST_PART_CODE);

 @Before
 public void setup() {
   when(partsService.getPart(eq(1))).thenReturn(part);
   List&amp;lt;Part&amp;gt; parts = new ArrayList&amp;lt;&amp;gt;();
   parts.add(part);
   when(partsService.getParts()).thenReturn(parts);
   when(partsService.createPart(any(Part.class))).thenReturn(part);
   when(partsService.editPart(any(Part.class))).thenReturn(part);
   when(partsService.deletePart(eq(1))).thenReturn(SUCCESS);
 }

 @After
 public void tearDown() {
   reset(partsService);
 }

 @Test
 public void testGetPart() {
   Part partResponse = resources.target(PARTS_ENDPOINT + &quot;/1&quot;).request()
       .get(TestPartRepresentation.class).getData();
   assertThat(partResponse.getId()).isEqualTo(part.getId());
   assertThat(partResponse.getName()).isEqualTo(part.getName());
   assertThat(partResponse.getCode()).isEqualTo(part.getCode());
   verify(partsService).getPart(1);
 }

 @Test
 public void testGetParts() {
   List&amp;lt;Part&amp;gt; parts =
       resources.target(PARTS_ENDPOINT).request().get(TestPartsRepresentation.class).getData();
   assertThat(parts.size()).isEqualTo(1);
   assertThat(parts.get(0).getId()).isEqualTo(part.getId());
   assertThat(parts.get(0).getName()).isEqualTo(part.getName());
   assertThat(parts.get(0).getCode()).isEqualTo(part.getCode());
   verify(partsService).getParts();
 }

 @Test
 public void testCreatePart() {
   Part newPart = resources.target(PARTS_ENDPOINT).request()
       .post(Entity.entity(part, MediaType.APPLICATION_JSON_TYPE), TestPartRepresentation.class)
       .getData();
   assertNotNull(newPart);
   assertThat(newPart.getId()).isEqualTo(part.getId());
   assertThat(newPart.getName()).isEqualTo(part.getName());
   assertThat(newPart.getCode()).isEqualTo(part.getCode());
   verify(partsService).createPart(any(Part.class));
 }

 @Test
 public void testEditPart() {
   Part editedPart = resources.target(PARTS_ENDPOINT + &quot;/1&quot;).request()
       .put(Entity.entity(part, MediaType.APPLICATION_JSON_TYPE), TestPartRepresentation.class)
       .getData();
   assertNotNull(editedPart);
   assertThat(editedPart.getId()).isEqualTo(part.getId());
   assertThat(editedPart.getName()).isEqualTo(part.getName());
   assertThat(editedPart.getCode()).isEqualTo(part.getCode());
   verify(partsService).editPart(any(Part.class));
 }

 @Test
 public void testDeletePart() {
   assertThat(resources.target(PARTS_ENDPOINT + &quot;/1&quot;).request()
       .delete(TestDeleteRepresentation.class).getData()).isEqualTo(SUCCESS);
   verify(partsService).deletePart(1);
 }

 private static class TestPartRepresentation extends Representation&amp;lt;Part&amp;gt; {

 }

 private static class TestPartsRepresentation extends Representation&amp;lt;List&amp;lt;Part&amp;gt;&amp;gt; {

 }

 private static class TestDeleteRepresentation extends Representation&amp;lt;String&amp;gt; {

 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;construye-tu-aplicacin-dropwizard&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Construye tu Aplicación Dropwizard&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
La mejor práctica es crear el archivo único FAR JAR que contenga todos los archivos .class necesarios para ejecutar la aplicación. El mismo archivo JAR puede implementarse en un entorno diferente desde la prueba a la producción, sin ningún cambio en las bibliotecas de dependencias. Para comenzar a construir nuestra aplicación de ejemplo como un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;fat&lt;/em&gt;&amp;nbsp;JAR, necesitamos configurar un complemento de Maven llamado&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;maven-shade&lt;/em&gt;. Debes agregar las siguientes entradas en la sección de complementos de tu archivo pom.xml.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Aquí está la configuración Maven de ejemplo para construir el archivo JAR.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
 &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
 &amp;lt;groupId&amp;gt;com.endava&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;dropwizard-blog&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;
 &amp;lt;name&amp;gt;Dropwizard Blog example&amp;lt;/name&amp;gt;

 &amp;lt;properties&amp;gt;
   &amp;lt;dropwizard.version&amp;gt;1.1.0&amp;lt;/dropwizard.version&amp;gt;
   &amp;lt;mockito.version&amp;gt;2.7.12&amp;lt;/mockito.version&amp;gt;
   &amp;lt;mysql.connector.version&amp;gt;6.0.6&amp;lt;/mysql.connector.version&amp;gt;
   &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt;
   &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt;
 &amp;lt;/properties&amp;gt;

 &amp;lt;dependencies&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;dropwizard-core&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;dropwizard-jdbi&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;dropwizard-auth&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;io.dropwizard&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;dropwizard-testing&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${dropwizard.version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${mockito.version}&amp;lt;/version&amp;gt;
     &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
   &amp;lt;/dependency&amp;gt;
   &amp;lt;dependency&amp;gt;
     &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;${mysql.connector.version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
 &amp;lt;/dependencies&amp;gt;

 &amp;lt;build&amp;gt;
   &amp;lt;plugins&amp;gt;
     &amp;lt;plugin&amp;gt;
       &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
       &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
       &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;
       &amp;lt;configuration&amp;gt;
         &amp;lt;createDependencyReducedPom&amp;gt;true&amp;lt;/createDependencyReducedPom&amp;gt;
         &amp;lt;filters&amp;gt;
           &amp;lt;filter&amp;gt;
             &amp;lt;artifact&amp;gt;*:*&amp;lt;/artifact&amp;gt;
             &amp;lt;excludes&amp;gt;
               &amp;lt;exclude&amp;gt;META-INF/*.SF&amp;lt;/exclude&amp;gt;
               &amp;lt;exclude&amp;gt;META-INF/*.DSA&amp;lt;/exclude&amp;gt;
               &amp;lt;exclude&amp;gt;META-INF/*.RSA&amp;lt;/exclude&amp;gt;
             &amp;lt;/excludes&amp;gt;
           &amp;lt;/filter&amp;gt;
         &amp;lt;/filters&amp;gt;
       &amp;lt;/configuration&amp;gt;
       &amp;lt;executions&amp;gt;
         &amp;lt;execution&amp;gt;
           &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
           &amp;lt;goals&amp;gt;
             &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
           &amp;lt;/goals&amp;gt;
           &amp;lt;configuration&amp;gt;
             &amp;lt;transformers&amp;gt;
               &amp;lt;transformer
                 implementation=&quot;org.apache.maven.plugins.shade.resource.ServicesResourceTransformer&quot; /&amp;gt;
               &amp;lt;transformer
                 implementation=&quot;org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&quot;&amp;gt;
                 &amp;lt;mainClass&amp;gt;com.endava.blog.DropwizardBlogApplication&amp;lt;/mainClass&amp;gt;
               &amp;lt;/transformer&amp;gt;
             &amp;lt;/transformers&amp;gt;
           &amp;lt;/configuration&amp;gt;
         &amp;lt;/execution&amp;gt;
       &amp;lt;/executions&amp;gt;
     &amp;lt;/plugin&amp;gt;
   &amp;lt;/plugins&amp;gt;
 &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ejecucin-de-la-aplicacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Ejecución de la Aplicación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Ahora deberíamos poder ejecutar el servicio. Si construiste correctamente tu archivo JAR, lo que necesitas hacer es abrir el símbolo del sistema y ejecutar el siguiente comando para ejecutar tu archivo JAR:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;java -jar target/dropwizard-blog-1.0.0.jar server configuration.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Si todo salió bien, deberías ver algo como esto:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;INFO  [2017-04-23 22:51:14,471] org.eclipse.jetty.util.log: Logging initialized @962ms to org.eclipse.jetty.util.log.Slf4jLog
INFO  [2017-04-23 22:51:14,537] io.dropwizard.server.DefaultServerFactory: Registering jersey handler with root path prefix: /
INFO  [2017-04-23 22:51:14,538] io.dropwizard.server.DefaultServerFactory: Registering admin handler with root path prefix: /
INFO  [2017-04-23 22:51:14,681] io.dropwizard.server.DefaultServerFactory: Registering jersey handler with root path prefix: /
INFO  [2017-04-23 22:51:14,681] io.dropwizard.server.DefaultServerFactory: Registering admin handler with root path prefix: /
INFO  [2017-04-23 22:51:14,682] io.dropwizard.server.ServerFactory: Starting DropwizardBlogApplication
INFO  [2017-04-23 22:51:14,752] org.eclipse.jetty.setuid.SetUIDListener: Opened application@7d57dbb5{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
INFO  [2017-04-23 22:51:14,752] org.eclipse.jetty.setuid.SetUIDListener: Opened admin@630b6190{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
INFO  [2017-04-23 22:51:14,753] org.eclipse.jetty.server.Server: jetty-9.4.2.v20170220
INFO  [2017-04-23 22:51:15,153] io.dropwizard.jersey.DropwizardResourceConfig: The following paths were found for the configured resources:

   GET     /parts (com.toptal.blog.resource.PartsResource)
   POST    /parts (com.toptal.blog.resource.PartsResource)
   DELETE  /parts/{id} (com.toptal.blog.resource.PartsResource)
   GET     /parts/{id} (com.toptal.blog.resource.PartsResource)
   PUT     /parts/{id} (com.toptal.blog.resource.PartsResource)

INFO  [2017-04-23 22:51:15,154] org.eclipse.jetty.server.handler.ContextHandler: Started i.d.j.MutableServletContextHandler@58fa5769{/,null,AVAILABLE}
INFO  [2017-04-23 22:51:15,158] io.dropwizard.setup.AdminEnvironment: tasks = 

   POST    /tasks/log-level (io.dropwizard.servlets.tasks.LogConfigurationTask)
   POST    /tasks/gc (io.dropwizard.servlets.tasks.GarbageCollectionTask)

INFO  [2017-04-23 22:51:15,162] org.eclipse.jetty.server.handler.ContextHandler: Started i.d.j.MutableServletContextHandler@3fdcde7a{/,null,AVAILABLE}
INFO  [2017-04-23 22:51:15,176] org.eclipse.jetty.server.AbstractConnector: Started application@7d57dbb5{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
INFO  [2017-04-23 22:51:15,177] org.eclipse.jetty.server.AbstractConnector: Started admin@630b6190{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
INFO  [2017-04-23 22:51:15,177] org.eclipse.jetty.server.Server: Started @1670ms
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Ahora tienes tu propia aplicación Dropwizard escuchando en puertos 8080 para solicitudes de aplicación y 8081 para solicitudes de administración.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Ten en cuenta que&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;server configuration.yml&lt;/code&gt;&amp;nbsp;se utiliza para iniciar el servidor HTTP y pasar la ubicación del archivo de configuración YAML al servidor.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
¡Excelente! Finalmente hemos implementado un microservicio usando el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framework&lt;/em&gt;&amp;nbsp;Dropwizard. Ahora vamos a tomar un descanso y tomar una taza de té. Hiciste un buen trabajo.&lt;/div&gt;
&lt;h2 id=&quot;acceso-a-los-recursos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Acceso a los Recursos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Puedes utilizar cualquier cliente HTTP como POSTMAN o cualquier otro. Deberías poder acceder a tu servidor presionando&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;http://localhost:8080/parts&lt;/code&gt;. Debes recibir un mensaje indicando que las credenciales son necesarias para acceder al servicio. Para autenticar, agrega el encabezado&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Authorization&lt;/code&gt;&amp;nbsp;con el valor&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;support_test_token&lt;/code&gt;. Si se realiza correctamente, deberías ver algo como:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;{
 &quot;code&quot;: 200,
 &quot;data&quot;: []
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Lo que significa que tu base de datos está vacía. Crea tu primera parte cambiando el método HTTP de GET a POST y suministra esta carga útil:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;{
 &quot;name&quot;:&quot;My first part&quot;,
 &quot;code&quot;:&quot;code_of_my_first_part&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Todos los demás&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;endpoints&lt;/em&gt;&amp;nbsp;funcionan de la misma manera, así que sigue jugando y disfruta.&lt;/div&gt;
&lt;h2 id=&quot;cmo-cambiar-la-ruta-del-contexto&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Cómo Cambiar la Ruta del Contexto&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
La aplicación Dropwizard, de forma predeterminada, se iniciará y se ejecutará en&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;/&lt;/code&gt;. Por ejemplo, si no menciona nada sobre la ruta de contexto de la aplicación de forma predeterminada, se puede acceder a la aplicación desde la URL&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;http://localhost: 8080/&lt;/code&gt;. Si deseas configurar tu propia ruta de contexto para tu aplicación, añade las siguientes entradas a tu archivo YAML. ~~~ server: applicationContextPath: /application ~~~&lt;/div&gt;
&lt;h2 id=&quot;finiquitando-nuestro-tutorial-dropwizard&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Finiquitando Nuestro Tutorial Dropwizard&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Ahora, cuando tengas instalado el servicio REST de Dropwizard, es momento de resumir algunas de las ventajas o desventajas clave de utilizar Dropwizard como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framework&lt;/em&gt;&amp;nbsp;REST. Es absolutamente obvio, por este post, que Dropwizard ofrece un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;bootstrap&lt;/em&gt;&amp;nbsp;extremadamente rápido de tu proyecto. Y eso es probablemente la mayor ventaja de usar Dropwizard.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
Además incluirá todas las bibliotecas/herramientas de vanguardia que necesitarás para desarrollar tu servicio. Así que definitivamente no necesitas preocuparte por eso. También te da una gestión de configuración muy agradable. Por supuesto, Dropwizard tiene algunas desventajas también. Usando Dropwizard estás restringido a usar lo que Dropwizard ofrece o apoya. Pierdes parte de la libertad a la que puedes estar acostumbrado cuando desarrollas. Pero aun así ni siquiera lo llamaría una desventaja ya que esto es exactamente lo que hace que Dropwizard sea lo que es—fácil de configurar, fácil de desarrollar, pero aún un marco REST muy robusto y de alto rendimiento.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; white-space: normal;&quot;&gt;
En mi opinión, la adición de complejidad al&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framework&lt;/em&gt;&amp;nbsp;mediante el apoyo de más y más bibliotecas de terceras partes también introduciría una complejidad innecesaria en el desarrollo.&lt;/div&gt;
&lt;div class=&quot;post_key_learnings&quot; style=&quot;background: rgb(245, 247, 250); border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: rgb(207, 217, 232); border-top-style: solid; border-width: 1px 0px; box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px -37px 45px; min-height: 0px; min-width: 0px; padding: 35px 37px 20px; vertical-align: baseline; white-space: normal;&quot;&gt;
&lt;h2 class=&quot;post_key_learnings-heading&quot; data-disable_subscribe_placement=&quot;true&quot; style=&quot;border: 0px; box-sizing: border-box; line-height: 1.3em; margin: 0px 0px 25px; min-height: 0px; min-width: 0px; padding: 0px; text-transform: uppercase; vertical-align: baseline;&quot;&gt;
UNDERSTANDING THE BASICS&lt;/h2&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;expanded&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-expanded&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-expanded&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is the meaning of representational state transfer (REST)?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
Representational State Transfer (REST) is a style of architecture (not to be mixed with the set of standards) based on a set of principles that describe how networked resources are defined and addressed.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is a REST end point?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is a REST web service?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom: none; border-image: initial; border-left: 0px; border-right: 0px; border-top: 0px; box-sizing: border-box; margin: 0px -37px; min-height: 0px; min-width: 0px; padding: 0px 37px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is a microservice architecture?&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/resume/dusan-simonovic&quot;&gt;Dusan Simonovic&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/java/un-comienzo-con-microservicios-un-tutorial-de-dropwizard/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/4031259488959117334/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/un-comienzo-con-microservicios-un-tutorial-de-dropwizard.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4031259488959117334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4031259488959117334'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/un-comienzo-con-microservicios-un-tutorial-de-dropwizard.html' title='Un Comienzo con Microservicios: Un Tutorial de Dropwizard'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-1660304744156081924</id><published>2017-09-05T18:38:00.000-03:00</published><updated>2017-09-05T18:38:22.111-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ProductDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="SiteMaps"/><category scheme="http://www.blogger.com/atom/ns#" term="Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="UIDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="Wireframing"/><title type='text'>Mapeo Wireframe: Cómo Evitar El Atraso de los Scope</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Imagina esta situación: Estás trabajando en un nuevo sitio web y en el proceso de creación de los wireframes. En tus reuniones de revisión, recibes comentarios de su cliente y equipo, prefaciando la generación inevitable de solicitudes de cambios, sugerencias de mejoras y actualizaciones. Después de varias reuniones de revisión, te sientes como si estuvieras atrapado en un bucle sin fin, los cambios se están haciendo y revirtiendo, la demanda de tu cliente para más características parece seguir para siempre, y llegar a un acuerdo parece imposible.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
O, tal vez, ocurre lo contrario: presentas tus wireframes, todo el mundo asiente con la cabeza de acuerdo, y los wireframes están bien para pasar a la siguiente etapa. Pero, a medida que el trabajo avanza, te das cuenta de que no refleja tu intención-más características están siendo abarrotadas y el flujo se siente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Que pasó? La respuesta es simple: falta de comunicación.&lt;/div&gt;
&lt;h3 id=&quot;comuncate-ms-eficazmente-con-tus-wireframes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comunícate más Eficazmente con tus Wireframes&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una de nuestras principales herramientas de comunicación como diseñadores de UX son los wireframes, los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“blueprints”&lt;/em&gt;&amp;nbsp;en blanco y negro que nos convierten en los arquitectos del diseño web. Aunque los wireframes carecen de los detalles coloridos del diseño visual, son la base para el diseño del producto, del mismo modo que los planos arquitectónicos son la base para la construcción final de un edificio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los wireframes son más que un mapa estático. Usando la analogía de una casa, no sólo muestran una habitación, sino más bien toda la casa y todas las diferentes maneras que un usuario puede mover a su alrededor. También incluyen el interior, definiendo el propósito principal de cada habitación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, los wireframes muestran más que sólo habitaciones. Ayudan a planificar los viajes y definir la experiencia que un visitante tendrá en un paseo por la casa. Puedes usar wireframes para muchas cosas, y son muchas cosas que tu equipo y cliente necesitarán entender a medida que un proyecto evoluciona. Parte del trabajo de&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñador de UX&lt;/a&gt;&amp;nbsp;es ser traductor, asegurando que todos los involucrados comprendan la visión prevista.&lt;/div&gt;
&lt;h3 id=&quot;llevando-tus-wireframes-al-siguiente-nivel-con-un-mapa-de-wireframes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Llevando tus Wireframes al Siguiente Nivel con un Mapa de Wireframes&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Entonces, ¿cómo&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/product-design/effective-design-communication-strategies&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;comunicamos&lt;/a&gt;&amp;nbsp;el viaje del usuario? ¿Cómo se puede mapear la experiencia del usuario de una manera que sea fácil de leer para que tu equipo y tu cliente pueda visualizarlo? ¿Cómo puedes asegurarte de que el viaje siga siendo sencillo y ofrezca todos los elementos necesarios para cada habitación sin crear&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/interactive/interaction-design-principles&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;barreras frustrantes&lt;/a&gt;?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí hay una herramienta útil para comunicar y organizar tus wireframes con mayor eficacia:&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;un mapa wireframe&lt;/span&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un mapa wireframe es una forma de hacer coincidir tus wireframes con el sitemap de tu sitio web (o con los flujos de usuario de tu producto). Para este proceso de asignación, necesitas plantillas de estructura de wireframes que representen un tipo de página específico (por ejemplo, página de formulario vs. página de destino vs. página de lista de productos vs. página de detalles del producto). Es como decidir el propósito de cada habitación en una casa primero, que luego determina los elementos dentro de cada habitación. Una plantilla sería un cuarto de baño con un inodoro y un fregadero como elementos de contenido común.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La creación de un mapa wireframe le beneficiará de varias maneras:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ayuda a estimar el alcance del proyecto (¿Cuántas plantillas de wireframe necesito?)&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Proporcionar una visión general de todas las plantillas diferentes que deben crearse (que también puede ser valioso como un índice para un&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux/why-startups-need-a%20-styleguide&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;estilo&lt;/a&gt;, o una simple lista de verificación para identificar plantillas que pueden ser reutilizadas para otras páginas)&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mejorar la comunicación con respecto al objetivo de sus wireframes y ayudar a sus clientes a entender mejor el viaje del usuario&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cmo-crear-un-mapa-de-wireframe&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo Crear un Mapa de Wireframe?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay tres pasos involucrados en la creación de un mapa wireframe.&lt;/div&gt;
&lt;h3 id=&quot;paso-1-identificar-elementos-de-contenido&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Paso 1: Identificar Elementos de Contenido&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Antes de empezar a bucear en wireframes, es útil pensar en todas las diferentes piezas que necesitan vivir en un wireframe, como los elementos que desea tener en cada habitación para decidir cuán grande debe ser su habitación. Para un sitio de comercio electrónico, los ejemplos pueden ser: barra de búsqueda, filtrado de productos, descripción del producto, imagen del producto, precio, selector de cantidad, botón ‘añadir al carrito’, productos recomendados, icono del carrito de compras … Considerando los componentes de IU necesarios.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comienza a enumerar todos los elementos de contenido (componentes) en los que puedas pensar: piensa en la funcionalidad que desea ofrecer para ayudar al usuario a avanzar y cumplir con los requisitos del negocio.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Agrega otra columna para el tipo de página (por ejemplo, la página de detalles del producto, el carrito de la compra, la página de destino, etc.) para agrupar los elementos de contenido.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En una tercera columna, clasifica sus artículos de contenido por importancia (es decir, bajo, medio, alto).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si tienes historias de usuarios, puedes agregar otra columna para referirte a los números de historia relacionados.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Lista de elementos de contenido para un mapa wireframe&quot; height=&quot;366&quot; src=&quot;https://uploads.toptal.io/blog/image/123541/toptal-blog-image-1499440000757-f2108d4ccbca719ff16cd37b6360cd25.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Un ejemplo de una lista de elementos de contenido&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Por qué es útil la clasificación de los elementos de contenido? Tiene dos propósitos principales:&lt;/div&gt;
&lt;ol style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Creación de una jerarquía:&lt;/span&gt;&amp;nbsp;El ranking define la jerarquía de contenido de cada página y le da una guía para sus wireframes (qué contenido debe estar en la parte superior).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Evitar el desorden:&lt;/span&gt;&amp;nbsp;Priorizar los elementos de contenido ayudará a mantener el enfoque minimalista, así como ayudarte a tomar decisiones con ty equipo sobre qué contenido realmente necesita.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los elementos de contenido definen el ámbito del trabajo. Tener una lista de elementos de contenido te ayudará a pasar a la fase de planificación más fácilmente y se puede utilizar para definir el proceso y estimar el trabajo de los wireframes. (Por ejemplo, ¿cómo estructuramos nuestros sprints?, ¿qué contenido abordamos primero?)&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La lista de contenido también es muy útil durante cualquier discusión con respecto a los requisitos. Puede identificar fácilmente los elementos de contenido que acordó y qué elementos adicionales se solicitan y se consideran una solicitud de cambio.&lt;/div&gt;
&lt;h3 id=&quot;paso-2-definir-el-mapa-del-sitio-y-los-flujos-de-usuario&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Paso 2: Definir el Mapa del Sitio y los Flujos de Usuario&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tienes los elementos de contenido que necesitas proporcionar y los agrupas en páginas. Echemos un vistazo a una visión general por ponerlos fuera. ¿Cómo están interconectados? ¿Cómo navega un usuario a través de ellos para lograr sus objetivos?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Llega a este nivel creando un sitemap (para sitios web) o un flujo de usuario (para aplicaciones):&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mapa del sitio:&lt;/span&gt;&amp;nbsp;Muestra una visión general de todas las páginas y su jerarquía.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Flujos de usuario:&lt;/span&gt;&amp;nbsp;Visualiza cómo se interconectan las páginas para los escenarios clave de casos de uso.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Mapa de sitio y flujo de usuario&quot; height=&quot;366&quot; src=&quot;https://uploads.toptal.io/blog/image/123542/toptal-blog-image-1499440014534-b62d0fedb0988edd5c48a29c0436dae0.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Versión simplificada de un mapa del sitio y del flujo de usuario&lt;/div&gt;
&lt;h3 id=&quot;paso-3-mapea-tus-wireframes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Paso 3: Mapea tus Wireframes&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora que ya sabes qué contenido debe proporcionar, en qué páginas debe proporcionarlos y cómo están conectados, puedes empezar a trabajar en tus wireframes.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Define las plantillas de página que necesitan wireframes basadas en el mapa del sitio y los flujos de usuario. (Cada página que requiera funcionalidad única va a ser una plantilla diferente).&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Plantillas de wireframe&quot; height=&quot;366&quot; src=&quot;https://uploads.toptal.io/blog/image/123543/toptal-blog-image-1499440028368-0f137a7bf8739e801675ddc49a9fa244.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Plantillas de alambre que representan páginas únicas&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si encuentras variaciones menores para determinadas plantillas (por ejemplo, una página de contenido con un control deslizante en el encabezado o no), trabaja en páginas maestras y omite estas variaciones menores. Tus wireframes deben incluir todos los componentes principales que vivirían en esta plantilla de página maestra.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora traza sus wireframes al mapa del sitio y los flujos de usuario. Puedes actualizar tu sitemap con miniaturas de wireframes para cada tipo de página. La codificación de colores o la numeración mantendrán las cosas en sincronía, ayudarán a dar una mejor visión general y ayudarán a los clientes a entender qué wireframes necesitan.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;A color-coded sitemap&quot; height=&quot;430&quot; src=&quot;https://uploads.toptal.io/blog/image/123544/toptal-blog-image-1499440038609-1f88830ce698dc1f11ffea9b83858545.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Un ejemplo de mapa de sitio con código de color&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Plantillas de wireframe con código de colores&quot; height=&quot;518&quot; src=&quot;https://uploads.toptal.io/blog/image/123545/toptal-blog-image-1499440050990-3aa05c243711da460f06dad92f6e53c4.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Un ejemplo de mapa de sitio con código de color&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Plan de sitio con códigos de colores y plantillas de wireframes&quot; height=&quot;261&quot; src=&quot;https://uploads.toptal.io/blog/image/123546/toptal-blog-image-1499440063506-b7763e80375f19f5d2c515af33cb20d1.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Un ejemplo de un mapa de plantilla wireframe. El mapa del sitio está a la izquierda y los wireframes están a la derecha con los códigos de color correspondientes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Mapa del sitio numerado y wireframe&quot; height=&quot;343&quot; src=&quot;https://uploads.toptal.io/blog/image/123547/toptal-blog-image-1499440078467-15ec2a218e21112d0994c1e427b87c07.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; margin: 0px auto 7px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Para sitios muy complejos, un sistema de numeración puede tener sentido frente a la codificación de color&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Por qué es útil este proceso de mapeo? Es una gran herramienta para usar al crear la visión general de alto nivel de un proyecto. En lugar de simplemente mirar los wireframes autónomos página por página, el mapa wireframe le permitirá a ti y a tu equipo ver los wireframes en su contexto. ¿De dónde vienen los usuarios? ¿A dónde van ahora?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para volver a la analogía de la casa, es el plano que se crea para visualizar la estructura de la casa, en consecuencia pasar a mirar las primeras representaciones de cada habitación (que son los wireframes para cada plantilla de página), y luego para compartir el resultado final y la visión general.&lt;/div&gt;
&lt;h2 id=&quot;llevando-el-flujo-de-trabajo-de-wireframe-al-siguiente-nivel&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Llevando el Flujo de Trabajo de Wireframe al Siguiente Nivel&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En resumen, aquí es por qué los mapas de wireframe son una comunicación útil y una herramienta de organización:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ayudarán con la planificación. (¿Qué contenido tenemos y qué wireframes necesitamos?).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Serán útiles como una lista de verificación durante el proceso de creación del proyecto. (¿Qué componentes puedo reutilizar para mantenerme constante?).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ayudarán con la estimación de costo y tiempo del proyecto, así como para reducir las ineficiencias.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Te ayudarán a rastrear tus tareas (trabajo completado vs. trabajo todavía en el backlog).&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Te ayudarán a comunicar mejor el propósito y el objetivo de sus wireframes durante las revisiones (como los wireframes se están utilizando para el proyecto en general).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un mapa de wireframes es una herramienta útil para estimar el alcance del trabajo al principio de un proyecto, y como una lista de verificación a través de su proceso de trabajo. Ayudará a mejorar el proceso de toma de decisiones de tu equipo, mantendrá a todos en la misma página y periódicamente los reenfocará en la visión general de alto nivel del proyecto. ¡Feliz mapeo!&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por:&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;DejaVu Sans Mono&amp;quot;;&quot;&gt;&lt;a href=&quot;https://www.toptal.com/designers/resume/frauke-seewald&quot;&gt;Frauke Seewald&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Articulo Vía: &lt;a href=&quot;https://www.toptal.com/designers/wireframing/mapeo-wireframe-c%C3%B3mo-evitar-el-atraso-de-los-scope/es&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/1660304744156081924/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/mapeo-wireframe-como-evitar-el-atraso-de-los-scope.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1660304744156081924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1660304744156081924'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/09/mapeo-wireframe-como-evitar-el-atraso-de-los-scope.html' title='Mapeo Wireframe: Cómo Evitar El Atraso de los Scope'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-7098230363207387257</id><published>2017-08-28T07:38:00.000-03:00</published><updated>2017-08-28T17:40:44.655-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="P3DGraphics"/><category scheme="http://www.blogger.com/atom/ns#" term="Programación"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="WebGL"/><title type='text'>Gráficos 3D: Un Tutorial de WebGL</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El mundo de los gráficos 3D puede ser muy intimidante al principio. Ya sea que sólo desee crear un logotipo 3D interactivo o diseñar un juego completo, si no conoces los principios de la representación en 3D, te puedes quedar atrapado en una biblioteca que abstrae un montón de cosas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usar una biblioteca puede ser la herramienta adecuada y&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/javascript&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;JavaScript&lt;/a&gt;&amp;nbsp;tiene una increíble fuente abierta en forma de&amp;nbsp;&lt;a href=&quot;https://threejs.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;three.js&lt;/a&gt;. Hay algunas desventajas en el uso de soluciones pre-hechas, aunque:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Pueden tener muchas características que no planeas utilizar. El tamaño de las características base minificadas tres.js es alrededor de 500kB, y cualquier característica adicional (cargar archivos de modelo real es una de ellas) hacen que la carga útil sea aún más grande. Transferir esa cantidad de datos sólo para mostrar un logotipo giratorio en su sitio web sería un desperdicio.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Una capa extra de abstracción puede hacer modificaciones que normalmente son fáciles, difíciles de hacer. Su forma creativa de sombrear un objeto en la pantalla puede ser sencilla de implementar o requerir decenas de horas de trabajo para incorporar en las abstracciones de la biblioteca.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mientras que la biblioteca se optimiza muy bien en la mayoría de los escenarios, se pueden eliminar adornos extras para tu caso de uso particular. El renderizador puede hacer que ciertos procedimientos se ejecuten millones de veces en la tarjeta gráfica. Cada instrucción eliminada de tal procedimiento significa que una tarjeta gráfica más débil puede manejar tu contenido sin problemas.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Incluso si decides utilizar una biblioteca de gráficos de alto nivel, tener conocimientos básicos de las cosas más escondidas te permite utilizarla con mayor eficacia. Las bibliotecas también pueden tener funciones avanzadas, como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;ShaderMaterial&lt;/code&gt;&amp;nbsp;en&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;three.js&lt;/code&gt;. El conocer los principios de representación gráfica te permite utilizar tales características.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Ilustración de un logotipo de Toptal en 3D en un lienzo WebGL&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123058/toptal-blog-image-1495084866696-180483b59090966c2ab593a0f173c704.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nuestro objetivo es dar una breve introducción a todos los conceptos clave detrás de la prestación de gráficos 3D y el uso de WebGL para su aplicación. Verás que lo más común que se hace es mostrar y mover objetos 3D en un espacio vacío.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El&amp;nbsp;&lt;a href=&quot;https://github.com/adnanademovic/webgl-example&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;código final&lt;/a&gt;&amp;nbsp;está disponible para que experimentes y juegues con él.&lt;/div&gt;
&lt;h2 id=&quot;representando-modelos-3d&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Representando Modelos 3D&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo primero que tendrías que entender es cómo se representan los modelos 3D. Un modelo está hecho de una malla de triángulos. Cada triángulo está representado por tres vértices para cada una de las esquinas del triángulo. Hay tres propiedades unidas a los vértices que son las más comunes.&lt;/div&gt;
&lt;h3 id=&quot;posicin-del-vrtice&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Posición del Vértice&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La posición es la propiedad más intuitiva de un vértice. Es la posición en el espacio 3D, representada por un vector 3D de coordenadas. Si conoces las coordenadas exactas de tres puntos en el espacio, tendrías toda la información que necesita para dibujar un triángulo simple entre ellos. Para que los modelos parezcan realmente buenos cuando se procesan, hay un par de cosas más que deben proporcionarse al renderizador.&lt;/div&gt;
&lt;h3 id=&quot;vrtice-normal&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Vértice Normal&lt;/h3&gt;
&lt;div&gt;
&lt;img alt=&quot;Esferas con el mismo wireframe, con un sombreado plano y suave aplicado&quot; height=&quot;376&quot; src=&quot;https://uploads.toptal.io/blog/image/123059/toptal-blog-image-1495084885188-a07e85153b3a5899d826418ecd8c6619.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Considera los dos modelos anteriores. Consisten en las mismas posiciones del vértice aunque se ven totalmente diferente cuando son representadas. ¿Cómo es eso posible?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además de decirle al&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;renderer&lt;/em&gt;&amp;nbsp;donde queremos que se encuentre un vértice, también podemos darle una pista sobre cómo la superficie está inclinada en esa posición exacta. La pista está en la forma del vector normal de la superficie en ese punto específico del modelo, representado con un vector 3D. La siguiente imagen debe darte un aspecto más descriptivo de cómo se maneja.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Comparación entre vectores normales para sombreado plano y liso&quot; height=&quot;344&quot; src=&quot;https://uploads.toptal.io/blog/image/123060/toptal-blog-image-1495084895659-179bd81b9004564bd46115e952527bae.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las superficies de la izquierda y derecha corresponden a la bola izquierda y derecha de la imagen anterior, respectivamente. Las flechas rojas representan los vectores normales que se especifican para un vértice, mientras que las flechas azules representan los cálculos del procesador de cómo un vector normal debe buscar todos los puntos entre los vértices. La imagen muestra una demostración para el espacio 2D, pero el mismo principio se aplica en 3D.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El vector normal es un indicio de cómo las luces iluminarán la superficie. Cuanto más cerca está la dirección de un rayo de luz al vector normal, más brillante es el punto. Tener cambios graduales en dirección al vector normal causa gradientes ligeros, mientras que tener cambios abruptos sin cambios entre estos, da como resultado superficies con iluminación constante a través de ellos, al igual que cambios repentinos en la iluminación.&lt;/div&gt;
&lt;h3 id=&quot;coordenadas-de-textura&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Coordenadas de Textura&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La última propiedad significativa son las coordenadas de textura, comúnmente referidas como mapeo UV. Tienes un modelo y una textura que deseas aplicarle. La textura tiene varias áreas y éstas representan las imágenes que queremos aplicar a diferentes partes del modelo. Debe haber una manera de marcar qué triángulo debe representarse con qué parte de la textura. Ahí es donde entra el mapeo de textura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para cada vértice, marcamos dos coordenadas, U y V. Estas coordenadas representan una posición en la textura, con U representando el eje horizontal y V el eje vertical. Los valores no están en píxeles sino en una posición porcentual dentro de la imagen. La esquina inferior izquierda de la imagen se representa con dos ceros, mientras que la parte superior derecha se representa con dos unos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un triángulo se pinta tomando las coordenadas UV de cada vértice en el triángulo y aplicando la imagen que se captura entre esas coordenadas en la textura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Demostración del mapeo UV, con un parche destacado y costuras visibles en el modelo&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123061/toptal-blog-image-1495084908950-f737e3385caf955c77d9a45a1e47c666.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes ver una demostración de mapeo UV en la imagen de arriba. El modelo esférico fue tomado y cortado en partes que son lo suficientemente pequeñas para ser aplanadas en una superficie 2D. Las costuras donde se realizaron los cortes están marcadas con líneas más gruesas. Uno de los parches ha sido resaltado, así que puedes ver bien cómo las cosas coinciden. También puedes ver cómo una costura a través de la mitad de la sonrisa coloca partes de la boca en dos parches diferentes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los wireframes no forman parte de la textura, pero se superponen sobre la imagen para que puedas ver cómo se correlacionan las cosas.&lt;/div&gt;
&lt;h3 id=&quot;cargando-un-modelo-obj&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cargando un modelo OBJ&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo creas o no, esto es todo lo que necesitas saber para crear tu propio cargador de modelos simple. El&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Wavefront_.obj_file#File_format&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;formato de archivo OBJ&lt;/a&gt;&amp;nbsp;es lo suficientemente simple para implementar un analizador en unas pocas líneas de código.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El archivo enlista las posiciones de los vértices en un formato&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;v &amp;lt;float&amp;gt; &amp;lt;float&amp;gt; &amp;lt;float&amp;gt;&lt;/code&gt;, con un cuarto&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/em&gt;opcional, que ignoraremos, para mantener las cosas simples. Los vértices se representan de forma similar con&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vn &amp;lt;float&amp;gt; &amp;lt;float&amp;gt; &amp;lt;float&amp;gt;&lt;/code&gt;. Finalmente, las coordenadas de textura se representan con&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vt &amp;lt;float&amp;gt; &amp;lt;float&amp;gt;&lt;/code&gt;, con un tercer&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/em&gt;&amp;nbsp;opcional que seguiremos ignorando. En los tres casos, los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/em&gt;&amp;nbsp;representan las respectivas coordenadas. Estas tres propiedades se acumulan en tres matrices.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los rostros se representan con grupos de vértices. Cada vértice se representa con el índice de cada una de las propiedades, por lo que los índices comienzan en 1. Hay varias maneras de cómo esto está representado, pero nos adheriremos a la ‘v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3`, requiriendo que las tres propiedades sean proporcionadas y limitando a tres el número de vértices por cada cara. Todas estas limitaciones se están haciendo para mantener el cargador tan simple como sea posible, ya que todas las demás opciones requieren algún procesamiento extra trivial antes de que puedan estar en un formato que a WebGL le guste.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hemos puesto muchos requisitos para nuestro cargador de archivos. Eso puede sonar limitante, pero las aplicaciones de modelado 3D tienden a darle la capacidad de establecer esas limitaciones al exportar un modelo como un archivo OBJ.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El siguiente código analiza una cadena que representa un archivo OBJ y crea un modelo en forma de una matriz de rostros.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Geometry&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(faces)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.faces = faces || []
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Parses an OBJ file, passed as a string&lt;/span&gt;
Geometry.parseOBJ = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(src)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; POSITION = &lt;span class=&quot;hljs-regexp&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;/^v\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)/&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; NORMAL = &lt;span class=&quot;hljs-regexp&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;/^vn\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)/&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; UV = &lt;span class=&quot;hljs-regexp&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;/^vt\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)/&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; FACE = &lt;span class=&quot;hljs-regexp&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;/^f\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+)\/(-?\d+))?/&lt;/span&gt;

 lines = src.split(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;\n&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; positions = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; uvs = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; normals = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; faces = []
 lines.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(line)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Match each line of the file against various RegEx-es&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; result
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; ((result = POSITION.exec(line)) != &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;) {
     &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Add new vertex position&lt;/span&gt;
     positions.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector3(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;]), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;])))
   } &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; ((result = NORMAL.exec(line)) != &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;) {
     &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Add new vertex normal&lt;/span&gt;
     normals.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector3(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;]), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;])))
   } &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; ((result = UV.exec(line)) != &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;) {
     &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Add new texture mapping point&lt;/span&gt;
     uvs.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector2(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]), &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; - &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseFloat&lt;/span&gt;(result[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;])))
   } &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; ((result = FACE.exec(line)) != &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;) {
     &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Add new face&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; vertices = []
     &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Create three vertices from the passed one-indexed indices&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; i = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;; i &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;; i += &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;) {
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; part = result.slice(i, i + &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;)
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; position = positions[&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseInt&lt;/span&gt;(part[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;]) - &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; uv = uvs[&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseInt&lt;/span&gt;(part[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]) - &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; normal = normals[&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;parseInt&lt;/span&gt;(part[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;]) - &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]
       vertices.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vertex(position, normal, uv))
     }
     faces.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Face(vertices))
   }
 })

 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Geometry(faces)
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Loads an OBJ file from the given URL, and returns it as a promise&lt;/span&gt;
Geometry.loadOBJ = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(url)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Promise(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(resolve)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; xhr = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; XMLHttpRequest()
   xhr.onreadystatechange = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (xhr.readyState == XMLHttpRequest.DONE) {
       resolve(Geometry.parseOBJ(xhr.responseText))
     }
   }
   xhr.open(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;GET&#39;&lt;/span&gt;, url, &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;true&lt;/span&gt;)
   xhr.send(&lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;)
 })
}

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Face&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(vertices)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vertices = vertices || []
}

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Vertex&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(position, normal, uv)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position = position || &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector3()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normal = normal || &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector3()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uv = uv || &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector2()
}

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Vector3&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(x, y, z)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.x = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(x) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.y = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(y) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.z = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(z) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
}

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Vector2&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(x, y)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.x = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(x) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.y = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(y) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La estructura&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Geometry&lt;/code&gt;&amp;nbsp;contiene los datos exactos necesarios para enviar un modelo a la tarjeta gráfica para ser procesados. Antes de hacer eso, es probable que quieras tener la capacidad de mover el modelo en la pantalla.&lt;/div&gt;
&lt;h2 id=&quot;realizacin-de-transformaciones-espaciales&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Realización de Transformaciones Espaciales&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todos los puntos en el modelo que cargamos son relativos a su sistema de coordenadas. Si queremos traducir, rotar y escalar el modelo, lo que debemos hacer es realizar esa operación en su sistema de coordenadas. El sistema de coordenadas A, relativo al sistema de coordenadas B, está definido por la posición de su centro como vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p_ab&lt;/code&gt;&amp;nbsp;y el vector para cada uno de sus ejes&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;x_ab&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;y_ab&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;z_ab&lt;/code&gt;, representando la dirección de ese eje. Así que si un punto se mueve por 10 en el eje&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;x&lt;/code&gt;&amp;nbsp;del sistema de coordenadas A, entonces — en el sistema de coordenadas B — se moverá en la dirección de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;x_ab&lt;/code&gt;, multiplicado por 10.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Toda esta información se almacena en el siguiente formulario matriz:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;x_ab.x  y_ab.x  z_ab.x  p_ab.x
x_ab.y  y_ab.y  z_ab.y  p_ab.y
x_ab.z  y_ab.z  z_ab.z  p_ab.z
    0       0       0       1
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si queremos transformar el vector 3D&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;q&lt;/code&gt;, sólo tenemos que multiplicar la matriz de transformación con el vector:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;q.x
q.y
q.z
1
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto hace que el punto se mueva por&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;q.x&lt;/code&gt;&amp;nbsp;a lo largo del nuevo eje&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;x&lt;/code&gt;, por&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;q.y&lt;/code&gt;&amp;nbsp;a lo largo del nuevo eje&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;y&lt;/code&gt;, y por&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;q.z&lt;/code&gt;&amp;nbsp;a lo largo del nuevo eje&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;z&lt;/code&gt;. Finalmente hace que el punto se mueva adicionalmente por el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p&lt;/code&gt;, que es la razón por la que usamos un uno como el elemento final de la multiplicación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La gran ventaja de utilizar estas matrices es el hecho de que si tenemos múltiples transformaciones a realizar en el vértice, podemos fusionarlas en una transformación, multiplicando sus matrices antes de transformar el vértice mismo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay varias transformaciones que se pueden realizar, y echaremos un vistazo a las principales.&lt;/div&gt;
&lt;h3 id=&quot;sin-transformacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin Transformación&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si no ocurre ninguna transformación, entonces el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p&lt;/code&gt;&amp;nbsp;es un vector cero, el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;x&lt;/code&gt;&amp;nbsp;es&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[1, 0, 0]&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;y&lt;/code&gt;&amp;nbsp;es&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[0, 1, 0]&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;z&lt;/code&gt;&amp;nbsp;es&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;[0, 0, 1]&lt;/code&gt;. A partir de ahora nos referiremos a estos valores como valores por defecto para estos vectores. La aplicación de estos valores nos da una matriz de identidad:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Éste es un buen punto de partida para encadenar transformaciones.&lt;/div&gt;
&lt;h3 id=&quot;traduccin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Traducción&lt;/h3&gt;
&lt;div&gt;
&lt;img alt=&quot;Colocar la Transformación para la Traducción&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123062/toptal-blog-image-1495084948239-41895b3da97fc0af330df281b276e906.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al momento de realizar la traducción todos los vectores, excepto el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p&lt;/code&gt;, tienen sus valores por defecto. Esto da lugar a la siguiente matriz:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;1 0 0 p.x
0 1 0 p.y
0 0 1 p.z
0 0 0   1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ajuste&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ajuste&lt;/h3&gt;
&lt;div&gt;
&lt;img alt=&quot;Colocar la Transformación para el Ajuste&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123063/toptal-blog-image-1495084957755-1ebf8264f0cb6c59069c38c38a6bdc13.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ajustar un modelo significa reducir la cantidad que cada coordenada contribuye a la posición de un punto. No existe un desplazamiento uniforme causado por el ajuste, por lo que el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p&lt;/code&gt;&amp;nbsp;mantiene su valor predeterminado. Los vectores de eje predeterminados deben multiplicarse por sus respectivos factores de escala, lo que da como resultado la siguiente matriz:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;s_x   0   0 0
 0 s_y   0 0
 0   0 s_z 0
 0   0   0 1
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;s_x&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;s_y&lt;/code&gt;, y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;s_z&lt;/code&gt;&amp;nbsp;representan el ajuste aplicado a cada eje.&lt;/div&gt;
&lt;h3 id=&quot;rotacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Rotación&lt;/h3&gt;
&lt;div&gt;
&lt;img alt=&quot;Transformación del Marco para la Rotación Alrededor del Eje Z&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123064/toptal-blog-image-1495084970031-4888caafe353322a5fd273801b190548.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La imagen anterior muestra lo que sucede cuando giramos el marco de coordenadas alrededor del eje Z.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La rotación no da lugar a un desplazamiento uniforme, por lo que el vector&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;p&lt;/code&gt;&amp;nbsp;mantiene su valor por defecto. Ahora las cosas se ponen un poco más complicadas. Las rotaciones causan que el movimiento a lo largo de cierto eje en el sistema de coordenadas original se mueva en una dirección diferente. Por lo tanto, si giramos un sistema de coordenadas 45 grados alrededor del eje Z, moviéndonos a lo largo del eje x del sistema de coordenadas original, se produce un movimiento en una dirección diagonal entre el eje x y el eje y en el nuevo sistema de coordenadas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para simplificar las cosas, le mostraremos cómo las matrices de transformación buscan rotaciones alrededor de los ejes principales.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Around X:
       1         0         0 0
       0  cos(phi)  sin(phi) 0
       0 -sin(phi)  cos(phi) 0
       0         0         0 1

Around Y:
cos(phi)         0  sin(phi) 0
       0         1         0 0
-sin(phi)         0  cos(phi) 0
       0         0         0 1

Around Z:
cos(phi) -sin(phi)         0 0
sin(phi)  cos(phi)         0 0
       0         0         1 0
       0         0         0 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;implementacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Implementación&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todo esto se puede implementar como una clase que almacena 16 números, almacenando matrices en un&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Row-_and_column-major_order&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;orden de columna mayor&lt;/a&gt;.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Transformation&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Create an identity transformation&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.fields = [&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;]
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply matrices, to chain transformations&lt;/span&gt;
Transformation.prototype.mult = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(t)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; output = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; row = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;; row &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;; ++row) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; col = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;; col &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;; ++col) {
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; sum = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; k = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;; k &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;; ++k) {
       sum += &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.fields[k * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt; + row] * t.fields[col * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt; + k]
     }
     output.fields[col * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt; + row] = sum
   }
 }
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; output
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply by translation matrix&lt;/span&gt;
Transformation.prototype.translate = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(x, y, z)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mat = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;12&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(x) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;13&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(y) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;14&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(z) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.mult(mat)
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply by scaling matrix&lt;/span&gt;
Transformation.prototype.scale = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(x, y, z)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mat = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(x) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(y) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(z) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.mult(mat)
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply by rotation matrix around X axis&lt;/span&gt;
Transformation.prototype.rotateX = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(angle)&lt;/span&gt; {&lt;/span&gt;
 angle = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(angle) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; c = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.cos(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; s = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.sin(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mat = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;9&lt;/span&gt;] = -s
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;6&lt;/span&gt;] = s
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.mult(mat)
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply by rotation matrix around Y axis&lt;/span&gt;
Transformation.prototype.rotateY = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(angle)&lt;/span&gt; {&lt;/span&gt;
 angle = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(angle) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; c = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.cos(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; s = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.sin(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mat = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;] = -s
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;8&lt;/span&gt;] = s
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.mult(mat)
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Multiply by rotation matrix around Z axis&lt;/span&gt;
Transformation.prototype.rotateZ = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(angle)&lt;/span&gt; {&lt;/span&gt;
 angle = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(angle) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; c = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.cos(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; s = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.sin(angle)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mat = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;] = c
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;] = -s
 mat.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;] = s
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.mult(mat)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;mira-a-travs-de-una-cmara&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mira a Través de una Cámara&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí viene la parte clave de la presentación de objetos en la pantalla: la cámara. Hay dos componentes clave para una cámara; Su posición, y cómo proyecta objetos observados en la pantalla.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La posición de la cámara se maneja con un simple truco. No hay diferencia visual entre mover la cámara un metro adelante y mover el mundo entero un metro hacia atrás. Así que naturalmente, hacemos esto último aplicando la inversa de la matriz como una transformación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El segundo componente clave es la forma en que los objetos observados se proyectan sobre el lente. En WebGL, todo lo visible en la pantalla se encuentra en una caja. La caja se extiende entre -1 y 1 en cada eje. Todo lo visible está dentro de esa caja. Podemos utilizar el mismo enfoque de matrices de transformación para crear una matriz de proyección.&lt;/div&gt;
&lt;h3 id=&quot;proyeccin-ortogrfica&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Proyección Ortográfica&lt;/h3&gt;
&lt;div&gt;
&lt;img alt=&quot;Espacio rectangular que se transforma en las dimensiones apropiadas del *framebuffer* usando la proyección ortográfica&quot; height=&quot;329&quot; src=&quot;https://uploads.toptal.io/blog/image/123065/toptal-blog-image-1495084995719-868e69aa8b0e92b1d701170ed78a6e47.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La proyección más simple es la [proyección ortográfica] (https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographical-projection-matrix/orthographic-projection-matrix). Se toma una caja en el espacio que indica el ancho, la altura y la profundidad con la suposición de que su centro está en la posición cero. A continuación, la proyección redimensiona la caja para que se ajuste a la caja previamente descrita dentro de la cual WebGL observa objetos. Dado que queremos cambiar el tamaño de cada dimensión a dos, ajustamos cada eje a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;2/size&lt;/code&gt;, donde&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;size&lt;/code&gt;&amp;nbsp;es la dimensión del eje respectivo. Una pequeña advertencia es el hecho de que estamos multiplicando el eje Z con un negativo. Esto se hace porque queremos voltear la dirección de esa dimensión. La matriz final tiene esta forma:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;2/width        0        0 0
     0 2/height        0 0
     0        0 -2/depth 0
     0        0        0 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;proyeccin-perspectiva&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Proyección Perspectiva&lt;/h3&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://uploads.toptal.io/blog/image/123066/toptal-blog-image-1495085006601-de2a16ef30226972736b23d0f630210d.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Frustum siendo transformado a las dimensiones apropiadas del *framebuffer* usando la proyección perspectiva&quot; border=&quot;0&quot; height=&quot;261&quot; src=&quot;https://uploads.toptal.io/blog/image/123066/toptal-blog-image-1495085006601-de2a16ef30226972736b23d0f630210d.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No vamos a pasar por los detalles de cómo se diseña esta proyección, pero sólo usa la&amp;nbsp;&lt;a href=&quot;https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/opengl-perspective-proyection-matrix&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;fórmula final&lt;/a&gt;, que es bastante estándar por ahora. Podemos simplificarlo colocando la proyección en la posición cero en los ejes x e y, haciendo los límites derecho/izquierdo y superior/inferior iguales a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;width/2&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;height/2&lt;/code&gt;, respectivamente. Los parámetros&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;n&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;f&lt;/code&gt;&amp;nbsp;representan los planos de recorte&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;near&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;far&lt;/code&gt;, que son la distancia más pequeña y más grande que un punto puede ser para poder ser capturado por la cámara. Están representados por los lados paralelos del&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Frustum&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;frustum&lt;/a&gt;&amp;nbsp;en la imagen anterior.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una proyección de perspectiva suele estar representada con un&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Field_of_view&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;campo de visión&lt;/a&gt;&amp;nbsp;(we’ll use the vertical one),&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Aspect_ratio_(image)&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;relación de aspecto&lt;/a&gt;, y las distancias de plano cercano y lejano. Esa información se puede utilizar para calcular&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;width&lt;/code&gt;&amp;nbsp;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;height&lt;/code&gt;, y entonces la matriz se puede crear a partir de la siguiente plantilla:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;2*n/width          0           0           0
       0 2*n/height           0           0
       0          0 (f+n)/(n-f) 2*f*n/(n-f)
       0          0          -1           0
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para calcular el ancho y la altura, se pueden usar las siguientes fórmulas:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;height = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt; * near * &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.tan(fov * &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.PI / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;360&lt;/span&gt;)
width = aspectRatio * height
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El FOV (campo de visión) representa el ángulo vertical que la cámara captura con su lente. La relación de aspecto representa la relación entre el ancho y la altura de la imagen y se basa en las dimensiones de la pantalla que estamos mostrando.&lt;/div&gt;
&lt;h3 id=&quot;implementacin-1&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Implementación&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora podemos representar una cámara como una clase, la cual almacena la posición de la cámara y la matriz de proyección. También necesitamos saber cómo calcular las transformaciones inversas. Resolver las inversiones de matriz generales puede ser problemático, pero existe un&amp;nbsp;&lt;a href=&quot;http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/teche53.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;enfoque simplificado&lt;/a&gt;&amp;nbsp;para nuestro caso en especial.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Camera&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
}

Camera.prototype.setOrthographic = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(width, height, depth)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt; / width
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt; / height
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt; / depth
}

Camera.prototype.setPerspective = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(verticalFov, aspectRatio, near, far)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; height_div_2n = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.tan(verticalFov * &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.PI / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;360&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; width_div_2n = aspectRatio * height_div_2n
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; / height_div_2n
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; / width_div_2n
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = (far + near) / (near - far)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;] = -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;14&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt; * far * near / (near - far)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.fields[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;15&lt;/span&gt;] = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
}

Camera.prototype.getInversePosition = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; orig = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position.fields
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; dest = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; x = orig[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;12&lt;/span&gt;]
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; y = orig[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;13&lt;/span&gt;]
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; z = orig[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;14&lt;/span&gt;]
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Transpose the rotation matrix&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; i = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;; ++i) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; j = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;; j &amp;lt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;; ++j) {
     dest.fields[i * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt; + j] = orig[i + j * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;]
   }
 }

 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Translation by -p will apply R^T, which is equal to R^-1&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; dest.translate(-x, -y, -z)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta es la pieza final que necesitamos antes de que podamos empezar a dibujar en la pantalla.&lt;/div&gt;
&lt;h2 id=&quot;dibujar-un-objeto-con-el-canal-de-grficos-webgl&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dibujar un objeto con el canal de Gráficos WebGL&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La superficie más simple que puedes dibujar es un triángulo. De hecho, la mayoría de las cosas que dibujas en el espacio 3D consisten en un gran número de triángulos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Una mirada básica a que hacen los pasos del canal de gráficos&quot; height=&quot;293&quot; src=&quot;https://uploads.toptal.io/blog/image/123067/toptal-blog-image-1495085021068-a4d55b068b01701b61c596a16e374c6b.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo primero que debes entender es cómo se representa la pantalla en WebGL. Es un espacio 3D, que abarca entre -1 y 1 en el eje&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;x&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;y&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;. De forma predeterminada, este eje&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;&amp;nbsp;no se utiliza, pero estás interesado en gráficos 3D, por lo que deberás habilitarlo de inmediato.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Teniendo esto en cuenta, lo que sigue son tres pasos necesarios para dibujar un triángulo sobre esta superficie.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes definir tres vértices que representarían el triángulo que deseas dibujar. Los datos se serializan y se envían a la GPU (unidad de procesamiento gráfico). Con un modelo entero disponible, puedes hacer eso para todos los triángulos en el modelo. Las posiciones de vértice que das están en el espacio de coordenadas local del modelo que cargaste. Puesto de manera más simple, las posiciones que proporcionas son las exactas del archivo y no las que consigues después de realizar transformaciones de la matriz.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora que le has dado los vértices a la GPU, le dices a la GPU qué lógica usar cuando colocas los vértices en la pantalla. Este paso se utilizará para aplicar nuestras transformaciones de matriz. La GPU es muy buena para multiplicar muchas matrices 4x4, por lo que pondremos esa característica a buen uso.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En el último paso, la GPU rasterizará ese triángulo. La rasterización es el proceso de tomar gráficos vectoriales y determinar qué píxeles de la pantalla necesitan ser pintados, para que el objeto gráfico vectorial se muestre. En nuestro caso, la GPU está tratando de determinar qué píxeles se encuentran dentro de cada triángulo. Para cada píxel, la GPU te preguntará de qué color deseas que esté pintado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estos son los cuatro elementos necesarios para dibujar lo que quieras y son el ejemplo más simple de un&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Graphics_pipeline&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;canal de gráficos&lt;/a&gt;. Lo que sigue es una mirada a cada uno de ellos y una implementación simple.&lt;/div&gt;
&lt;h3 id=&quot;el-framebuffer-predeterminado&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framebuffer&lt;/em&gt;&amp;nbsp;Predeterminado&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El elemento más importante para una aplicación WebGL es el contexto WebGL. Puedes acceder a éste con&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl = canvas.getContext (&#39;webgl&#39;)&lt;/code&gt;, o usar&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;’experimental-webgl&#39;&lt;/code&gt;&amp;nbsp;como alternativa, en caso de que el navegador utilizado actualmente no soporte todas las funciones de WebGL. El ‘lienzo’ al que nos referimos es el elemento DOM del lienzo en el que queremos dibujar. El contexto contiene muchas cosas, entre las cuales está el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framebuffer&lt;/em&gt;&amp;nbsp;predeterminado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Podría describir un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framebuffer&lt;/em&gt;&amp;nbsp;como cualquier buffer (objeto) en el que puedas dibujar. De forma predeterminada, el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framebuffer&lt;/em&gt;&amp;nbsp;predeterminado almacena el color de cada píxel del lienzo al que está vinculado el contexto de WebGL. Como se describe en la sección anterior, cuando dibujamos sobre el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;framebuffer&lt;/em&gt;, cada píxel está situado entre -1 y 1 en el eje&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;x&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;y&lt;/span&gt;. Algo que también mencionamos es el hecho de que, por defecto, WebGL no utiliza el eje&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;. Esa funcionalidad se puede habilitar al ejecutar&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl.enable (gl.DEPTH_TEST)&lt;/code&gt;. Genial, pero ¿qué es una prueba de profundidad?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Habilitar la prueba de profundidad permite que un píxel almacene tanto el color como la profundidad. La profundidad es la coordenada&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;&amp;nbsp;de ese píxel. Después de dibujar un píxel a una cierta profundidad&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;, para actualizar el color de ese píxel debes dibujar en una posición&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;z&lt;/span&gt;&amp;nbsp;que esté más cerca de la cámara. De lo contrario, el intento de dibujo será ignorado. Esto permite la ilusión de 3D ya que dibujar objetos que están detrás de otros objetos hará que los objetos sean ocluidos por otros objetos delante de ellos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cualquier dibujo que realices permanecerá en la pantalla hasta que les digas que se despejen. Para ello, tienes que llamar a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl.clear (gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)&lt;/code&gt;. Esto borra tanto el color como el buffer de profundidad. Para elegir el color al cual se ajustan los píxeles borrados, usa&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl.clearColor (rojo, verde, azul, alfa)&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Vamos a crear un procesador que utiliza un lienzo y lo borra a petición:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Renderer&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(canvas)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = canvas.getContext(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;webgl&#39;&lt;/span&gt;) || canvas.getContext(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;experimental-webgl&#39;&lt;/span&gt;)
 gl.enable(gl.DEPTH_TEST)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
}

Renderer.prototype.setClearColor = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(red, green, blue)&lt;/span&gt; {&lt;/span&gt;
 gl.clearColor(red / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;255&lt;/span&gt;, green / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;255&lt;/span&gt;, blue / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;255&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;)
}

Renderer.prototype.getContext = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl
}

Renderer.prototype.render = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
}

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; renderer = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Renderer(document.getElementById(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;webgl-canvas&#39;&lt;/span&gt;))
renderer.setClearColor(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;100&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;149&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;237&lt;/span&gt;)

loop()

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 renderer.render()
 requestAnimationFrame(loop)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Adjuntar esta secuencia de comandos al siguiente HTML dará un rectángulo azul brillante en la pantalla&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-html hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-doctype&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;canvas&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;webgl-canvas&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;width&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;800&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;height&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;500&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;canvas&lt;/span&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;hljs-attribute&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;src&lt;/span&gt;=&lt;span class=&quot;hljs-value&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;script.js&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;javascript&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hljs-tag&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El llamado&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;requestAnimationFrame&lt;/code&gt;&amp;nbsp;hace que el nudo sea llamado nuevamente tan pronto como se haya hecho el renderizado anterior y se haya terminado todo el manejo del evento.&lt;/div&gt;
&lt;h3 id=&quot;objetos-de-vrtices-buffer&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Objetos de Vértices Buffer&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo primero que debes hacer es definir los vértices que deseas dibujar. Puedes hacer esto describiéndolos a través de vectores en el espacio 3D. Después de eso, debes mover esos datos a la memoria RAM de la GPU, creando un nuevo Buffer&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Vertex Buffer&lt;/span&gt;&amp;nbsp;(VBO).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Objeto Buffer&lt;/span&gt;&amp;nbsp;en general es un objeto que almacena una matriz de fragmentos de memoria en la GPU. Al ser un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;, éste sólo denota para lo que la GPU puede utilizar la memoria. La mayoría de las veces, los objetos de buffer que crees serán&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes llenar el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;&amp;nbsp;tomando todos los vértices&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;N&lt;/code&gt;&amp;nbsp;que tenemos y creando una matriz de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floats&lt;/em&gt;&amp;nbsp;con elementos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;3N&lt;/code&gt;&amp;nbsp;para la posición de vértice y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;&amp;nbsp;normales de vértice, y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;2N&lt;/code&gt;&amp;nbsp;para las coordenadas de textura&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;. Cada grupo de tres&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floats&lt;/em&gt;, o dos&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floats&lt;/em&gt;&amp;nbsp;para coordenadas UV, representa coordenadas individuales de un vértice. Luego pasamos estas matrices a la GPU, y nuestros vértices están listos para el resto del canal.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dado que la data está ahora en la RAM de la GPU, puedes eliminarla de la memoria RAM de uso general. Es decir, a menos que desees modificarla más tarde y volver a cargarla. Cada modificación debe ser seguida por una subida ya que las modificaciones en nuestras matrices JS no se aplican a&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;&amp;nbsp;en la memoria RAM real de la GPU.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación se muestra un ejemplo de código, el cual proporciona toda la funcionalidad descrita. Una nota importante es el hecho de que las variables almacenadas en la GPU no son recolectadas de la basura. Eso significa que tenemos que eliminarlas manualmente, una vez que no queremos usarlas más. Sólo te daremos un ejemplo de cómo se hace aquí y no nos centrará más en ese concepto. La supresión de variables de la GPU sólo es necesaria si piensa dejar de usar cierta geometría en todo el programa.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También añadimos serialización a nuestra clase&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Geometry&lt;/code&gt;&amp;nbsp;y elementos dentro de ella.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Geometry.prototype.vertexCount = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.faces.length * &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;
}

Geometry.prototype.positions = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; answer = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.faces.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(face)&lt;/span&gt; {&lt;/span&gt;
   face.vertices.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(vertex)&lt;/span&gt; {&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; v = vertex.position
     answer.push(v.x, v.y, v.z)
   })
 })
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; answer
}

Geometry.prototype.normals = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; answer = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.faces.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(face)&lt;/span&gt; {&lt;/span&gt;
   face.vertices.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(vertex)&lt;/span&gt; {&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; v = vertex.normal
     answer.push(v.x, v.y, v.z)
   })
 })
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; answer
}

Geometry.prototype.uvs = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; answer = []
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.faces.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(face)&lt;/span&gt; {&lt;/span&gt;
   face.vertices.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(vertex)&lt;/span&gt; {&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; v = vertex.uv
     answer.push(v.x, v.y)
   })
 })
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; answer
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;////////////////////////////////&lt;/span&gt;

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, data, count)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Creates buffer object in GPU RAM where we can store anything&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; bufferObject = gl.createBuffer()
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Tell which buffer object we want to operate on as a VBO&lt;/span&gt;
 gl.bindBuffer(gl.ARRAY_BUFFER, bufferObject)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Write the data, and set the flag to optimize&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// for rare changes to the data we&#39;re writing&lt;/span&gt;
 gl.bufferData(gl.ARRAY_BUFFER, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Float32Array&lt;/span&gt;(data), gl.STATIC_DRAW)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.size = data.length / count
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.count = count
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.data = bufferObject
}

VBO.prototype.destroy = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Free memory that is occupied by our buffer object&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.deleteBuffer(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El tipo de datos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;VBO&lt;/code&gt;&amp;nbsp;genera el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;&amp;nbsp;en el contexto WebGL pasado, basado en la matriz pasada como segundo parámetro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes ver tres llamadas al contexto&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl&lt;/code&gt;. La llamada&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createBuffer&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;createBuffer ()&lt;/code&gt;&lt;/a&gt;&amp;nbsp;crea el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;buffer&lt;/em&gt;. La llamada&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindBuffer&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;bindBuffer ()&lt;/code&gt;&lt;/a&gt;&amp;nbsp;indica a la máquina de estado WebGL que utilice esta memoria específica como la actual&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;&amp;nbsp;(&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;ARRAY_BUFFER&lt;/code&gt;) para todas las operaciones futuras, hasta que se indique lo contrario. Después de eso, establecemos el valor de la&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;&amp;nbsp;actual a los datos proporcionados, con&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;bufferData ()&lt;/code&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También proporcionamos un método de destrucción que elimina nuestro objeto de memoria intermedia de la GPU RAM, usando&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/deleteBuffer&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;deleteBuffer()&lt;/code&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes utilizar tres&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;&amp;nbsp;y una transformación para describir todas las propiedades de una malla, junto a su posición.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mesh&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, geometry)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; vertexCount = geometry.vertexCount()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.positions(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.normals(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.uvs(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vertexCount = vertexCount
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
}

Mesh.prototype.destroy = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions.destroy()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals.destroy()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs.destroy()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como ejemplo, aquí se ve cómo podemos cargar un modelo, almacenar sus propiedades en la malla (&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mesh&lt;/em&gt;) y luego destruirlo:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Geometry.loadOBJ(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/assets/model.obj&#39;&lt;/span&gt;).then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(geometry)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; mesh = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Mesh(gl, geometry)
 console.log(mesh)
 mesh.destroy()
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;shaders&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Shaders&lt;/em&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo que sigue es el proceso de dos pasos previamente descrito, que se trata de mover puntos en las posiciones deseadas y pintar todos los píxeles individuales. Para ello, escribimos un programa que se ejecuta en la tarjeta gráfica muchas veces. Este programa normalmente consta de al menos dos partes. La primera parte es un&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Shader de Vértices&lt;/span&gt;, que se ejecuta para cada vértice, y las salidas donde debemos colocar el vértice en la pantalla, entre otras cosas. La segunda parte es el&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Fragmento de Shader&lt;/span&gt;, que se ejecuta para cada píxel que cubre un triángulo en la pantalla, y produce el color en el cual el píxel debe ser pintado.&lt;/div&gt;
&lt;h3 id=&quot;shaders-de-vrtices&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Shaders&lt;/em&gt;&amp;nbsp;de Vértices&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Digamos que quieres tener un modelo que se mueve de izquierda y derecha en la pantalla. En un enfoque ingenuo, puedes actualizar la posición de cada vértice y volver a enviarlo a la GPU. Ese proceso es costoso y lento. Alternativamente, darías un programa para que la GPU se ejecute para cada vértice y hacer todas esas operaciones en paralelo con un procesador que está construido para hacer exactamente ese trabajo. Ése es el papel de un&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader de vértices&lt;/span&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;de vértices es la parte de la canalización de procesamiento que procesa vértices individuales. Una llamada al&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;de vértices recibe un único vértice y genera un único vértice después de aplicar todas las transformaciones posibles al vértice.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Shaders&lt;/em&gt;&amp;nbsp;están escritos en GLSL. Hay muchos elementos únicos en este lenguaje, pero la mayoría de la sintaxis es muy similar a C, por lo que debe ser comprensible para la mayoría de las personas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay tres tipos de variables que entran y salen de un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;de vértices, y todas ellas sirven a un uso específico:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;atributo&lt;/code&gt;&lt;/span&gt;&amp;nbsp;— Estas son entradas que contienen propiedades específicas de un vértice. Anteriormente describimos la posición de un vértice como un atributo en forma de un vector de tres elementos. Puedes ver a los atributos como valores que describen un vértice.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;uniforme&lt;/code&gt;&lt;/span&gt;&amp;nbsp;— Estas son entradas que son las mismas para cada vértice dentro de la misma llamada de renderizado. Digamos que queremos mover nuestro modelo, definiendo una matriz de transformación. Puedes usar una variable&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;uniforme&lt;/code&gt;&amp;nbsp;para describir eso. También puedes usar recursos de la GPU, como texturas. Puedes ver estos uniformes como valores que describen un modelo o una parte de un modelo.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;variaciones&lt;/code&gt;&lt;/span&gt;&amp;nbsp;— Estas son las salidas que pasamos al fragmento de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;. Puesto que hay potencialmente miles de píxeles para un triángulo de vértices, cada píxel recibirá un valor interpolado para esta variable, dependiendo de la posición. Así que si un vértice envía 500 como una salida, y en otro 100, un píxel que está en el medio de estos recibirá 300 como entrada para esa variable. Puedes ver las variaciones como valores que describen superficies entre vértices.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por lo tanto, digamos que deseas crear un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;de vértices que reciba una posición normal y coordenadas uv para cada vértice, y una posición vista (posición de cámara inversa) y una matriz de proyección para cada objeto representado. Digamos que también quieres pintar píxeles individuales basados ​​en sus coordenadas uv y sus normales. Te preguntarás “¿Cómo se vería ese código?”.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; position;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; normal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; uv;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mat4&lt;/span&gt; model;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mat4&lt;/span&gt; view;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;mat4&lt;/span&gt; projection;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   vUv = uv;
   vNormal = (model * &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(normal, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;)).xyz;
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_Position&lt;/span&gt; = projection * view * model * &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(position, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayoría de estos elementos deben ser auto-explicativos. Lo más importante es notar que no hay valores de retorno en la función&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;main&lt;/code&gt;. Todos los valores que quisiéramos retornar se asignan, ya sea a variables&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;variantes&lt;/code&gt;&amp;nbsp;o a variables especiales. Aquí asignamos a&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl_Position&lt;/code&gt;, que es un vector de cuatro dimensiones, por lo que la última dimensión siempre debe estar en uno. Otra cosa extraña que podrías notar es la forma en que construimos un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vec4&lt;/code&gt;&amp;nbsp;fuera del vector de posición. Puedes construir un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vec4&lt;/code&gt;&amp;nbsp;usando cuatro&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;float&lt;/code&gt;s, dos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vec2&lt;/code&gt;s, o cualquier otra combinación que resulte en cuatro elementos. Hay un muchos tipos de castings, aparentemente, extraños que tienen sentido una vez que estés familiarizado con las matrices de transformación.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También puedes ver que aquí podemos realizar transformaciones de matriz fácilmente. GLSL está específicamente diseñado para este tipo de trabajo. La posición de salida se calcula multiplicando la proyección, la vista y la matriz del modelo y aplicándola a la posición. La salida normal se acaba de transformar en el espacio mundial. Más adelante explicaremos por qué nos hemos detenido allí con las transformaciones normales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ahora, lo mantendremos sencillo y pasaremos a pintar píxeles individuales.&lt;/div&gt;
&lt;h3 id=&quot;fragmento-de-shaders&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Fragmento de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Shaders&lt;/em&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;fragmento shader&lt;/span&gt;&amp;nbsp;es el paso después de la rasterización en el canal de gráficos. Genera color, profundidad y otros datos para cada píxel del objeto que se está pintando&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los principios detrás de la implementación de shaders de fragmentos son muy similares a los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shaders&lt;/em&gt;&amp;nbsp;de vértices. Sin embargo, hay tres grandes diferencias:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;No hay más salidas&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;variables&lt;/code&gt;, y las entradas&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;atributos&lt;/code&gt;&amp;nbsp;han sido reemplazadas con entradas `variadas’. Acabamos de pasar a nuestro canal, y las cosas que son la salida en el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;vértice son ahora entradas en el fragmento de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Nuestra única salida ahora es&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;gl_FragColor&lt;/code&gt;, que es un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;vec4&lt;/code&gt;. Los elementos representan rojo, verde, azul y alfa (RGBA), respectivamente, con variables en el rango de 0 a 1. Debes mantener alfa en 1, a menos que estés haciendo la transparencia. Sin embargo, la transparencia es un concepto bastante avanzado, por lo que nos atenemos a los objetos opacos.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Al principio del fragmento de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;, es necesario establecer la precisión del flotador, que es importante para las interpolaciones. En casi todos los casos, sólo se adhieren a las líneas del siguiente&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con esto en mente, puedes escribir fácilmente un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;que pinta el canal rojo basado en la posición U, canal verde basado en la posición V, y fija el canal azul al máximo.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; clampedUv = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(vUv, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(clampedUv, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La función&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;clamp&lt;/code&gt;&amp;nbsp;sólo limita todos los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floats&lt;/em&gt;&amp;nbsp;en un objeto para estar dentro de los límites dados. El resto del código debe ser bastante sencillo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con todo esto en mente, lo que queda por hacer es implementar esto en WebGL.&lt;/div&gt;
&lt;h3 id=&quot;combinacin-de-shaders-en-un-programa&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Combinación de Shaders en un Programa&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El siguiente paso es combinar los shaders en un programa:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ShaderProgram&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, vertSrc, fragSrc)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; vert = gl.createShader(gl.VERTEX_SHADER)
 gl.shaderSource(vert, vertSrc)
 gl.compileShader(vert)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!gl.getShaderParameter(vert, gl.COMPILE_STATUS)) {
   console.error(gl.getShaderInfoLog(vert))
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Error&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Failed to compile shader&#39;&lt;/span&gt;)
 }

 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; frag = gl.createShader(gl.FRAGMENT_SHADER)
 gl.shaderSource(frag, fragSrc)
 gl.compileShader(frag)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!gl.getShaderParameter(frag, gl.COMPILE_STATUS)) {
   console.error(gl.getShaderInfoLog(frag))
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Error&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Failed to compile shader&#39;&lt;/span&gt;)
 }

 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; program = gl.createProgram()
 gl.attachShader(program, vert)
 gl.attachShader(program, frag)
 gl.linkProgram(program)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
   console.error(gl.getProgramInfoLog(program))
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Error&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;Failed to link program&#39;&lt;/span&gt;)
 }

 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position = gl.getAttribLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;position&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normal = gl.getAttribLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;normal&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uv = gl.getAttribLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;uv&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.model = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;model&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.view = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;view&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;projection&#39;&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vert = vert
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.frag = frag
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.program = program
}

&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Loads shader files from the given URLs, and returns a program as a promise&lt;/span&gt;
ShaderProgram.load = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, vertUrl, fragUrl)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; Promise.all([loadFile(vertUrl), loadFile(fragUrl)]).then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(files)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; ShaderProgram(gl, files[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;], files[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;])
 })

 &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loadFile&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(url)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Promise(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(resolve)&lt;/span&gt; {&lt;/span&gt;
     &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; xhr = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; XMLHttpRequest()
     xhr.onreadystatechange = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (xhr.readyState == XMLHttpRequest.DONE) {
         resolve(xhr.responseText)
       }
     }
     xhr.open(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;GET&#39;&lt;/span&gt;, url, &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;true&lt;/span&gt;)
     xhr.send(&lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;null&lt;/span&gt;)
   })
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No hay mucho que decir sobre lo que está sucediendo aquí. A cada&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;se le asigna una cadena como fuente y se compila, después de lo cual verificamos si hay errores de compilación. Entonces, creamos un programa enlazando estos dos&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shaders&lt;/em&gt;. Finalmente, almacenamos punteros para todos los atributos y uniformes relevantes para la posteridad.&lt;/div&gt;
&lt;h3 id=&quot;realmente-dibujando-el-modelo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Realmente dibujando el modelo&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por último, pero no menos importante, dibuja el modelo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero escoge el programa de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;que deseas usar&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;ShaderProgram.prototype.use = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.useProgram(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.program)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación, envía todos los uniformes relacionados con la cámara a la GPU. Estos uniformes cambian sólo una vez por cada cambio de cámara o movimiento.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Transformation.prototype.sendToGpu = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, uniform, transpose)&lt;/span&gt; {&lt;/span&gt;
 gl.uniformMatrix4fv(uniform, transpose || &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Float32Array&lt;/span&gt;(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.fields))
}

Camera.prototype.use = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shaderProgram)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.projection.sendToGpu(shaderProgram.gl, shaderProgram.projection)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.getInversePosition().sendToGpu(shaderProgram.gl, shaderProgram.view)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por último, se toman las transformaciones y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;&amp;nbsp;y se asignan a uniformes y atributos, respectivamente. Dado que esto tiene que hacerse a cada&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBO&lt;/em&gt;, puede crear su vinculación de datos como un método.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;VBO.prototype.bindToAttribute = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(attribute)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Tell which buffer object we want to operate on as a VBO&lt;/span&gt;
 gl.bindBuffer(gl.ARRAY_BUFFER, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.data)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Enable this attribute in the shader&lt;/span&gt;
 gl.enableVertexAttribArray(attribute)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Define format of the attribute array. Must match parameters in shader&lt;/span&gt;
 gl.vertexAttribPointer(attribute, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.size, gl.FLOAT, &lt;span class=&quot;hljs-literal&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A continuación, se asigna una matriz de tres&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;floats&lt;/em&gt;&amp;nbsp;para el uniforme. Cada tipo de uniforme tiene una firma diferente, por lo que la&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniform&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;documentación&lt;/a&gt;&amp;nbsp;y más&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/javascript/gr%C3%A1ficos-3d-un-tutorial-de-webgl/%20//developer.mozilla%20.org%20/%20es-US%20/%20docs%20/%20Web%20/%20API%20/%20WebGLRenderingContext%20/%20uniformMatrix&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;documentación&lt;/a&gt;&amp;nbsp;son tus amigos aquí. Finalmente, dibuja la matriz triangular en la pantalla. Le dice a la llamada de dibujo [&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;drawArrays ()&lt;/code&gt;] (https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays) desde que vértice puede iniciar, y cuántos vértices dibujar. El primer parámetro pasado le dice a WebGL cómo interpretará la matriz de vértices. El uso de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;TRIÁNGULOS&lt;/code&gt;&amp;nbsp;toma tres por tres vértices y dibuja un triángulo para cada triplete. Usar&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;PUNTOS&lt;/code&gt;&amp;nbsp;sólo dibujaría un punto para cada vértice pasado. Hay muchas más opciones, pero no hay necesidad de descubrir todo al mismo tiempo. A continuación se muestra el código para dibujar un objeto:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Mesh.prototype.draw = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shaderProgram)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions.bindToAttribute(shaderProgram.position)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals.bindToAttribute(shaderProgram.normal)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs.bindToAttribute(shaderProgram.uv)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position.sendToGpu(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl, shaderProgram.model)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.drawArrays(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.TRIANGLES, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vertexCount)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El renderizador necesita ser extendido un poco, para acomodar todos los elementos adicionales que necesitan ser manejados. Debe ser posible adjuntar un programa de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;y renderizar una matriz de objetos basada en la posición actual de la cámara.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Renderer.prototype.setShader = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shader)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.shader = shader
}

Renderer.prototype.render = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(camera, objects)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; shader = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.shader
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!shader) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt;
 }
 shader.use()
 camera.use(shader)
 objects.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(mesh)&lt;/span&gt; {&lt;/span&gt;
   mesh.draw(shader)
 })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Podemos combinar todos los elementos que tenemos para finalmente dibujar algo en la pantalla:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; renderer = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Renderer(document.getElementById(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;webgl-canvas&#39;&lt;/span&gt;))
renderer.setClearColor(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;100&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;149&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;237&lt;/span&gt;)
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = renderer.getContext()

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; objects = []

Geometry.loadOBJ(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/assets/sphere.obj&#39;&lt;/span&gt;).then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(data)&lt;/span&gt; {&lt;/span&gt;
 objects.push(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Mesh(gl, data))
})
ShaderProgram.load(gl, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/shaders/basic.vert&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/shaders/basic.frag&#39;&lt;/span&gt;)
            .then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shader)&lt;/span&gt; {&lt;/span&gt;
              renderer.setShader(shader)
            })

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; camera = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Camera()
camera.setOrthographic(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;16&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;)

loop()

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 renderer.render(camera, objects)
 requestAnimationFrame(loop)
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objeto dibujado sobre el lienzo, con colores dependiendo de las coordenadas UV&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123068/toptal-blog-image-1495085073881-e0c9e38b8f09507f7f0767a39aa27b3e.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto parece un poco aleatorio, pero se puede ver los diferentes parches de la esfera, en función de dónde están en el mapa UV. Puedes cambiar el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;para pintar el objeto marrón. Simplemente establece el color para cada píxel para que sea el RGBA para marrón:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; brown = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.54&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.27&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.07&lt;/span&gt;);
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(brown, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objeto marrón dibujado en el lienzo&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123069/toptal-blog-image-1495085086515-fa63c55fabbf6329ec7ac805d3094e7b.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No parece muy convincente. Parece que la escena necesita algunos efectos de sombreado.&lt;/div&gt;
&lt;h2 id=&quot;aadiendo-luz&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Añadiendo luz&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las luces y las sombras son las herramientas que nos permiten percibir la forma de los objetos. Las luces vienen en muchas formas y tamaños: focos que brillan en un cono, bombillas que difunden luz en todas direcciones, y lo más interesante, el sol, que está tan lejos que toda la luz que brilla sobre nosotros irradia, para todos los intentos y en la misma dirección.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La luz solar suena como si fuera la más sencilla de implementar ya que todo lo que necesita proporcionar es la dirección en la que se propagan todos los rayos. Para cada píxel que dibujes en la pantalla, comprueba el ángulo bajo el cual la luz golpea el objeto. Aquí es donde entran las normales de superficie.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Demostración de ángulos entre los rayos de luz y las normales de superficie, tanto para sombreado plano como liso&quot; height=&quot;344&quot; src=&quot;https://uploads.toptal.io/blog/image/123070/toptal-blog-image-1495085096912-8842b1a4d90ad60234b6324f0995bd77.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes ver todos los rayos de luz que fluyen en la misma dirección y golpear la superficie bajo diferentes ángulos, los cuales se basan en el ángulo entre el rayo de luz y la normal de superficie. Cuanto más coinciden, más fuerte es la luz.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si realizas un producto de punto entre los vectores normalizados para el rayo de luz y la normal de superficie, obtendrás -1 si el rayo golpea la superficie perfectamente perpendicular, 0 si el rayo es paralelo a la superficie y 1 si lo ilumina desde el lado opuesto. Así que cualquier cosa entre 0 y 1 no debe agregar luz, mientras que los números entre 0 y -1 deben aumentar gradualmente la cantidad de luz que golpea el objeto. Puedes probar esto agregando una luz fija en el código&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; brown = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.54&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.27&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.07&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; sunlightDirection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(-&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; lightness = -&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dot&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(vNormal), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(sunlightDirection)), -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;);
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(brown * lightness, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objeto marrón con luz del sol&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123071/toptal-blog-image-1495085108288-37f364e7e8c92d23aa892bee0baf44e8.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pusimos el sol para que brille en la dirección hacia delante-izquierda-abajo. Puedes ver que tan suave es el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;, aunque el modelo es muy irregular. También se puede notar la oscuridad de la parte inferior izquierda. Podemos añadir un nivel de luz ambiente, lo que hará más brillante el área en la sombra.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; brown = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.54&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.27&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.07&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; sunlightDirection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(-&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; lightness = -&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dot&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(vNormal), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(sunlightDirection)), -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; ambientLight = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.3&lt;/span&gt;;
   lightness = ambientLight + (&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt; - ambientLight) * lightness;
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(brown * lightness, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objeto marrón con luz solar y luz ambiente&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123072/toptal-blog-image-1495085118655-4830ecb97fa3396983846784464da9ea.jpg&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Puedes lograr este mismo efecto introduciendo una clase de luz que almacena la dirección de la luz y la intensidad de la luz ambiental. A continuación, puedes cambiar el fragmento de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;para acomodar esa adición.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;se convierte en:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; lightDirection;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; ambientLight;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; brown = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.54&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.27&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;.07&lt;/span&gt;);
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; lightness = -&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dot&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(vNormal), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(lightDirection)), -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;);
   lightness = ambientLight + (&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt; - ambientLight) * lightness;
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(brown * lightness, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora puedes definir la luz:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Light&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.lightDirection = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Vector3(-&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;, -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.ambientLight = &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.3&lt;/span&gt;
}

Light.prototype.use = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shaderProgram)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; dir = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.lightDirection
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = shaderProgram.gl
 gl.uniform3f(shaderProgram.lightDirection, dir.x, dir.y, dir.z)
 gl.uniform1f(shaderProgram.ambientLight, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.ambientLight)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En la clase del programa&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;, agrega los uniformes necesarios:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.ambientLight = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;ambientLight&#39;&lt;/span&gt;)
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.lightDirection = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;lightDirection&#39;&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En el programa, agrega una llamada a la nueva luz en el renderizador:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Renderer.prototype.render = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(camera, light, objects)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; shader = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.shader
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (!shader) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt;
 }
 shader.use()
 light.use(shader)
 camera.use(shader)
 objects.forEach(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(mesh)&lt;/span&gt; {&lt;/span&gt;
   mesh.draw(shader)
 })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El nudo cambiará un poco:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; light = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Light()

loop()

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 renderer.render(camera, light, objects)
 requestAnimationFrame(loop)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si has hecho todo bien, entonces la imagen renderizada debe ser la misma que en la última imagen.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un último paso a considerar sería añadir una textura real a nuestro modelo. Vamos a hacer eso ahora.&lt;/div&gt;
&lt;h2 id=&quot;aadiendo-texturas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Añadiendo texturas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
HTML5 tiene un gran soporte para cargar imágenes, por lo que no hay necesidad de hacer el análisis de imagen muy intenso. Las imágenes se pasan a GLSL como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;sampler2D&lt;/code&gt;&amp;nbsp;diciéndole al&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;&amp;nbsp;cuál de las texturas enlazadas debe muestrear. Hay un número limitado de texturas que uno podría vincular y el límite se basa en el hardware utilizado. Un&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;sampler2D&lt;/code&gt;&amp;nbsp;puede ser consultado para los colores en ciertas posiciones. Aquí es donde entran las coordenadas UV. Aquí hay un ejemplo en el que reemplazamos el marrón con colores muestreados.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#ifdef GL_ES&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;highp&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt;;
&lt;span class=&quot;hljs-preprocessor&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; lightDirection;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; ambientLight;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;sampler2D&lt;/span&gt; diffuse;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec3&lt;/span&gt; vNormal;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec2&lt;/span&gt; vUv;

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; lightness = -&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dot&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(vNormal), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(lightDirection)), -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;);
   lightness = ambientLight + (&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt; - ambientLight) * lightness;
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;texture2D&lt;/span&gt;(diffuse, vUv).rgb * lightness, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El nuevo uniforme tiene que ser agregado al listado en el programa del&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shader&lt;/em&gt;:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.diffuse = gl.getUniformLocation(program, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;diffuse&#39;&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Finalmente, implementaremos la carga de la textura. Como se dijo anteriormente, HTML5 proporciona facilidades para cargar imágenes. Todo lo que necesitamos hacer es enviar la imagen a la GPU:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Texture&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, image)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; texture = gl.createTexture()
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Set the newly created texture context as active texture&lt;/span&gt;
 gl.bindTexture(gl.TEXTURE_2D, texture)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Set texture parameters, and pass the image that the texture is based on&lt;/span&gt;
 gl.texImage2D(gl.TEXTURE_2D, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Set filtering methods&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Very often shaders will query the texture value between pixels,&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// and this is instructing how that value shall be calculated&lt;/span&gt;
 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.data = texture
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
}

Texture.prototype.use = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(uniform, binding)&lt;/span&gt; {&lt;/span&gt;
 binding = &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Number&lt;/span&gt;(binding) || &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// We can bind multiple textures, and here we pick which of the bindings&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// we&#39;re setting right now&lt;/span&gt;
 gl.activeTexture(gl[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;TEXTURE&#39;&lt;/span&gt; + binding])
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// After picking the binding, we set the texture&lt;/span&gt;
 gl.bindTexture(gl.TEXTURE_2D, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.data)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Finally, we pass to the uniform the binding ID we&#39;ve used&lt;/span&gt;
 gl.uniform1i(uniform, binding)
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// The previous 3 lines are equivalent to:&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// texture[i] = this.data&lt;/span&gt;
 &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// uniform = i&lt;/span&gt;
}

Texture.load = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, url)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Promise(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(resolve)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; image = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Image()
   image.onload = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
     resolve(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Texture(gl, image))
   }
   image.src = url
 })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El proceso no es muy diferente al proceso usado para cargar y enlazar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;VBOs&lt;/em&gt;. La principal diferencia es que ya no estamos vinculados a un atributo, sino que unimos el índice de la textura a un uniforme entero. El tipo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;sampler2D&lt;/code&gt;&amp;nbsp;no es más que un puntero desplazado a una textura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora todo lo que hay que hacer es ampliar la clase&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Mesh&lt;/code&gt;&amp;nbsp;para manejar texturas también:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mesh&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, geometry, texture)&lt;/span&gt; {&lt;/span&gt; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// added texture&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; vertexCount = geometry.vertexCount()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.positions(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.normals(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; VBO(gl, geometry.uvs(), vertexCount)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.texture = texture &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// new&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vertexCount = vertexCount
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Transformation()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl = gl
}

Mesh.prototype.destroy = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions.destroy()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals.destroy()
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs.destroy()
}

Mesh.prototype.draw = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shaderProgram)&lt;/span&gt; {&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.positions.bindToAttribute(shaderProgram.position)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.normals.bindToAttribute(shaderProgram.normal)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.uvs.bindToAttribute(shaderProgram.uv)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.position.sendToGpu(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl, shaderProgram.model)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.texture.use(shaderProgram.diffuse, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// new&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.drawArrays(&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.gl.TRIANGLES, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;this&lt;/span&gt;.vertexCount)
}

Mesh.load = &lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(gl, modelUrl, textureUrl)&lt;/span&gt; {&lt;/span&gt; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// new&lt;/span&gt;
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; geometry = Geometry.loadOBJ(modelUrl)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; texture = Texture.load(gl, textureUrl)
 &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; Promise.all([geometry, texture]).then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(params)&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Mesh(gl, params[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;], params[&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;])
 })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Y el guión final principal se vería de la siguiente manera:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; renderer = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Renderer(document.getElementById(&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;webgl-canvas&#39;&lt;/span&gt;))
renderer.setClearColor(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;100&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;149&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;237&lt;/span&gt;)
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; gl = renderer.getContext()

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; objects = []

Mesh.load(gl, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/assets/sphere.obj&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/assets/diffuse.png&#39;&lt;/span&gt;)
   .then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(mesh)&lt;/span&gt; {&lt;/span&gt;
     objects.push(mesh)
   })

ShaderProgram.load(gl, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/shaders/basic.vert&#39;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;/shaders/basic.frag&#39;&lt;/span&gt;)
            .then(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;(shader)&lt;/span&gt; {&lt;/span&gt;
              renderer.setShader(shader)
            })

&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; camera = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Camera()
camera.setOrthographic(&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;16&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;)
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;var&lt;/span&gt; light = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;new&lt;/span&gt; Light()

loop()

&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 renderer.render(camera, light, objects)
 requestAnimationFrame(loop)
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Objeto texturizado con efectos de iluminación&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123073/toptal-blog-image-1495085145349-557f8bf51d9d0b2f2770c484a661c592.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Incluso animar puede ser fácil en este punto. Si quisieras que la cámara girara alrededor de nuestro objeto, puedes hacerlo con sólo agregando una línea de código:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-js hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
 renderer.render(camera, light, objects)
 camera.position = camera.position.rotateY(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Math&lt;/span&gt;.PI / &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;120&lt;/span&gt;)
 requestAnimationFrame(loop)
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Cabeza girada durante animación de cámara&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123074/toptal-blog-image-1495085154909-0b6965fbcd8a722ed2e8e8d9fe84cea6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tienes libertad de jugar con&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;shaders&lt;/em&gt;. Agregar una línea de código convertirá esta iluminación realista en algo caricaturesco.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-glsl hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;void&lt;/span&gt; main() {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;float&lt;/span&gt; lightness = -&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;clamp&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dot&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(vNormal), &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;normalize&lt;/span&gt;(lightDirection)), -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;);
   lightness = lightness &amp;gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.1&lt;/span&gt; ? &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt; : &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0.&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// new&lt;/span&gt;
   lightness = ambientLight + (&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt; - ambientLight) * lightness;
   &lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;gl_FragColor&lt;/span&gt; = &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;vec4&lt;/span&gt;(&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px; box-sizing: border-box; color: #dc322f; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;texture2D&lt;/span&gt;(diffuse, vUv).rgb * lightness, &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1.&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es tan simple como decirle a la iluminación que vaya a sus extremos, basándose en si cruzó un umbral establecido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Cabeza con iluminación de dibujos animados aplicada&quot; height=&quot;377&quot; src=&quot;https://uploads.toptal.io/blog/image/123075/toptal-blog-image-1495085162446-bbe8e8a1acef27955840b9ccd784bc60.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;h2 id=&quot;a-dnde-ir-despus&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A Dónde ir Después&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay muchas fuentes de información para aprender todos los trucos y complejidades de WebGL. Y la mejor parte es que si no puedes encontrar una respuesta relacionada con WebGL, puedes buscarla en OpenGL, ya que WebGL se basa en un subconjunto de OpenGL con algunos nombres cambiados.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En ningún orden en particular, aquí hay algunas fuentes excelentes para obtener información más detallada, tanto para WebGL como para OpenGL.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://webglfundamentals.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Fundamentos de WebGL&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://learningwebgl.com/blog/?page_id=1217&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;WebGL de aprendizaje&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Un tutorial muy detallado&amp;nbsp;&lt;a href=&quot;https://open.gl/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;OpenGL tutorial&lt;/a&gt;, te guiará a través de todos los principios fundamentales descritos aquí, de una manera muy lenta y detallada.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Y hay&amp;nbsp;&lt;a href=&quot;http://www.opengl-tutorial.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;muchos&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://ogldev.atspace.co.uk/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;muchos&lt;/a&gt;&amp;nbsp;otros sitios dedicados a enseñarte los principios de la computación gráfica.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Documentación de MDN para WebGL&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://www.khronos.org/registry/webgl/specs/latest/1.0/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Especificación de Khronos WebGL 1.0&lt;/a&gt;&amp;nbsp;si estás interesado en comprender los detalles más técnicos de cómo debería funcionar la API WebGL en todos los casos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;post_key_learnings&quot; style=&quot;background: rgb(245, 247, 250); border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: rgb(207, 217, 232); border-top-style: solid; border-width: 1px 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px -37px 45px; min-height: 0px; min-width: 0px; padding: 35px 37px 20px; vertical-align: baseline;&quot;&gt;
&lt;h2 class=&quot;post_key_learnings-heading&quot; data-disable_subscribe_placement=&quot;true&quot; style=&quot;border: 0px; box-sizing: border-box; line-height: 1.3em; margin: 0px 0px 25px; min-height: 0px; min-width: 0px; padding: 0px; text-transform: uppercase; vertical-align: baseline;&quot;&gt;
UNDERSTANDING THE BASICS&lt;/h2&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;expanded&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-expanded&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-expanded&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is WebGL?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
WebGL is a JavaScript API that adds native support for rendering 3D graphics within compatible web browsers, through an API similar to OpenGL.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
How are 3D models represented in memory?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is a vertex shader?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom-color: rgb(207, 217, 232); border-bottom-style: solid; border-image: initial; border-left-color: initial; border-left-style: initial; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 1px; box-sizing: border-box; margin: 0px -37px 25px; min-height: 0px; min-width: 0px; padding: 0px 37px 15px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
What is a fragment shader?&lt;/h3&gt;
&lt;div class=&quot;post_key_learnings-body is-hidden&quot; data-role=&quot;content&quot; style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; height: 0px; line-height: 1.5em; min-height: 0px; min-width: 0px; overflow: hidden; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;post_key_learnings-item&quot; data-animation-speed=&quot;450&quot; data-hide-button=&quot;false&quot; data-initial-state=&quot;collapsed&quot; data-view=&quot;ui#expander&quot; style=&quot;border-bottom: none; border-image: initial; border-left: 0px; border-right: 0px; border-top: 0px; box-sizing: border-box; margin: 0px -37px; min-height: 0px; min-width: 0px; padding: 0px 37px; vertical-align: baseline;&quot;&gt;
&lt;span class=&quot;post_key_learnings-item_arrow is-collapsed&quot; data-role=&quot;button&quot; style=&quot;background: url(&amp;quot;/assets/front/static/public/primitives/icon/arrow_left_grey_22c68a.png&amp;quot;) 0% 0% / 10px 17px no-repeat; border: 0px; box-sizing: border-box; cursor: pointer; display: inline-block; float: right; height: 17px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; transform: rotate(-90deg); transition: transform 0.2s, -webkit-transform 0.2s; vertical-align: baseline; width: 10px;&quot;&gt;&lt;/span&gt;&lt;h3 class=&quot;post_key_learnings-title is-collapsed&quot; data-disable_subscribe_placement=&quot;true&quot; data-role=&quot;button&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3863a0; cursor: pointer; display: inline-block; font-size: 1.3em; line-height: 1.3em; margin: 0px 0px 7px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
How do objects move in a 3D scene?&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por:&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/resume/adnan-ademovic&quot;&gt;Adnan Ademovic&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Artículo vía: &lt;a href=&quot;https://www.toptal.com/javascript/gr%C3%A1ficos-3d-un-tutorial-de-webgl/es&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/7098230363207387257/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/graficos-3d-un-tutorial-de-webgl.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/7098230363207387257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/7098230363207387257'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/graficos-3d-un-tutorial-de-webgl.html' title='Gráficos 3D: Un Tutorial de WebGL'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-7958735345805689499</id><published>2017-08-23T06:30:00.000-03:00</published><updated>2017-08-23T16:02:26.016-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BehavioralDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="Business"/><category scheme="http://www.blogger.com/atom/ns#" term="ProductDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="UIDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><title type='text'>Diseñando Para La Conducta Humana: Definiendo Lo Intangible</title><content type='html'>&lt;h2 id=&quot;utilizando-analtica-de-comportamiento-y-ciencia-de-datos-para-dar-forma-a-la-experiencia-del-usuario&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Utilizando analítica de comportamiento y ciencia de datos para dar forma a la experiencia del usuario:&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñar una experiencia empática requiere inmersión total en las vidas de tu público objetivo. Como implica el precepto del profesional de UX “caminar una milla en los zapatos de tu cliente” supone entrevistas, personajes, casos de uso, flujos de usuarios, mapas de viaje, grupos de enfoque, etc. que están involucrados en un intento educado de involucrar con precisión a las personas que más desean influir .&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pero, ¿qué pasa con los tipos de personalidad individuales? ¿Qué es lo que realmente motiva a una persona? ¿Qué valoran realmente? ¿Qué factores están jugando en su vida que pueden afectar o influir en su capacidad de participar en una experiencia? Estos son todos intangibles que a menudo no tenemos una forma sustantiva de cuantificar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.toptal.com/data-science&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;La ciencia de datos&lt;/a&gt;&amp;nbsp;y análisis de datos nos pueden decir mucho sobre los hábitos en línea de una persona. Interpretar que los datos nos pueden dar una idea de sus vidas. Pero, ¿qué pasa con lo que sucede fuera del mundo en línea y dentro de sus cabezas? Aquí es donde la ciencia del comportamiento puede ayudar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Ciencia del Comportamiento&quot; height=&quot;386&quot; src=&quot;https://uploads.toptal.io/blog/image/123663/toptal-blog-image-1500996041902-046425cecd224923d1269dea9f4dcbdb.jpg&quot; style=&quot;width: 840px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La ciencia del comportamiento es el estudio del comportamiento humano y la toma de decisiones. Implica la observación directa e indirecta de las personas mediante un enfoque cualitativo y cuantitativo. Mediante este método, puedes observar tipos de comportamiento específicos durante el proceso&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/product-design&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;de diseño de producto&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Distinguir los arquetipos ayuda a clasificar a las personas en grupos más grandes. El valor de esta ciencia, sin embargo, se puede encontrar mejor en situaciones en las que una persona se desvía de su norma arquetípica. Cuando las personas se apartan de los típicos patrones de toma de decisiones, podemos implementar codazos y otros motivadores para impactar positivamente en su comportamiento y devolverlos a la experiencia. Esta práctica tiene un gran valor, especialmente en la asistencia sanitaria, donde el comportamiento del paciente es importante para mantener la salud y el bienestar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Veamos un modelo básico para determinar el tipo de personalidad de una persona.&lt;/div&gt;
&lt;h2 id=&quot;arquetipos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Arquetipos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los arquetipos se basan en gran medida en los patrones de comportamiento del usuario o del grupo de usuarios. Se definen mediante el estudio de patrones de acción durante una experiencia: cómo y por qué la gente compra algo — y por qué, y por lo que están motivados a tomar medidas. Sumergiéndose en su comportamiento, ves y experimentas cosas desde su punto de vista. Esto resulta en una estrategia de diseño más precisa en el futuro. También ayuda a marcar con mayor precisión y medir los análisis que se utilizarán más tarde para iterar en la solución de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Arquetipos&quot; height=&quot;640&quot; src=&quot;https://uploads.toptal.io/blog/image/123664/toptal-blog-image-1500996056368-f1fbba748feb4324d2dd374a5236c925.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px; text-align: center;&quot;&gt;Arquetipos (por&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://mateuszgrzesiak.us/5-steps-build-personal-brand/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-size: 18.2px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Mateusz Grzesiak&lt;/a&gt;&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px; text-align: center;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Por qué deberías preocuparte por los arquetipos? Al entender el arquetipo de una persona, puedes “estar en su lugar” más fácilmente. Inmersiéndote en el proceso de aprender para quién estás diseñando provee la invaluable información y autentifica tu comprensión de sus preocupaciones y desafíos. La claridad obtenida al hacer esto te ayudará a diseñar con sus necesidades plenamente en mente.&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;“Los arquetipos son tendencias innatas que configuran el comportamiento humano, un patrón de comportamiento sobre el cual otros son copiados y emulados”&lt;/span&gt;&amp;nbsp;- Carl Jung&lt;/em&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h3 id=&quot;definiendo-arquetipos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Definiendo Arquetipos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El primer paso para determinar el arquetipo de una persona es hacer preguntas durante una serie de entrevistas con los usuarios. A continuación, puedes realizar un seguimiento con preguntas adicionales durante la configuración de su perfil y luego, se dispersarán más preguntas a lo largo de la experiencia del producto a medida que lo utilicen con el tiempo. El objetivo es aclarar la información que le dice lo que les importa, lo que los motiva y lo que valoran.&lt;/div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;Determinar aspectos de su vida fuera de línea — los factores de la vida que influyen en su toma de decisiones — ayuda a identificar su mentalidad. ¿Tienen deuda? ¿Están pasando por un cambio de relación? Y así sucesivamente. Los problemas de la vida como estos impactan a la gente de muchas maneras. Esta información de la vida real se utiliza a menudo en soluciones de atención médica — su uso también tiene valor en los bienes de consumo y otras situaciones en línea basadas en el hábito.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;img alt=&quot;Entrevistar ayuda a definir arquetipos de usuarios&quot; height=&quot;271&quot; src=&quot;https://uploads.toptal.io/blog/image/123665/toptal-blog-image-1500996073112-6dc6fa1132faa4c0185b2aa250fb4cf0.jpg&quot; style=&quot;width: 840px;&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Entrevistando potenciales usuarios ayuda a definir arquetipos de usuarios de producto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En el lado de análisis de datos, observando donde la gente visita en línea — sus hábitos de compra y patrones sociales — también puede darnos una visión de su mundo. Estos datos se vuelven más valiosos a medida que se recopilan e interpretan durante períodos de tiempo más largos. Los patrones cambian lentamente a medida que pasa el tiempo, y al cuantificar su actividad y progresión desde esta perspectiva, empezamos a recoger una historia y un cuadro más profundo de su vida.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Del lado de los datos analíticos, hay muchas maneras diferentes de definir arquetipos. Algunos usuarios pueden estar en el lado competitivo, mientras que otros pueden ser de una mentalidad más del tipo del rebaño. Algunos podrían ser el solista y otros son el tipo de nutrición, más desinteresado y siempre dispuesto a ayudar a las personas necesitadas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para más ejemplos de arquetipos de diseño,&amp;nbsp;&lt;a href=&quot;http://smashingideas.com/behavioral-archetypes/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;mira esto&lt;/a&gt;.&lt;/div&gt;
&lt;h3 id=&quot;son-los-arquetipos-mejores-que-las-personas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Son Los Arquetipos Mejores Que Las Personas?&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las personas son geniales para definir una audiencia general y sus miembros, pero tratan fuertemente con los hechos y las características de una persona y menos sobre cómo piensan. Ellos definen con quién estamos hablando. Los arquetipos se sumergen más profundamente en los patrones de comportamiento con los que opera una persona. Y, como veremos más adelante en este artículo, aún más importante, las cosas que pueden causar una reacción adversa.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Simple modelo para cambio conductual&quot; height=&quot;306&quot; src=&quot;https://uploads.toptal.io/blog/image/123666/toptal-blog-image-1500996087846-9124e31649ec331302ddd6bb3182e84b.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Un simple modelo para cambio de conducta&lt;/div&gt;
&lt;h2 id=&quot;sesgos-cognitivos-que-afectan-a-los-arquetipos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sesgos Cognitivos Que Afectan A Los Arquetipos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando con el tiempo las personas se desvían de lo que usualmente se percibe como su norma conductual, generalmente es causada por alguna forma de sesgo cognitivo. Hay cientos de sesgos cognitivos diferentes que han sido estudiados a fondo en el campo de la psicología humana.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En lo que se refiere a&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ux&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñar&lt;/a&gt;&amp;nbsp;para el comportamiento del usuario, tendemos a pensar que las cosas seguirán siendo las mismas. Es una suposición peligrosa — no hacer un alojamiento para el cambio y el impacto de sesgos puede causar rápidamente a un usuario a perder cualquier motivación para continuar con la experiencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El acoplamiento de los arquetipos con los sesgos cognitivos de los usuarios le da claridad al crear una matriz de contenido estratégico. La matriz indicaría maneras de responder a las desviaciones de la norma en el comportamiento de los usuarios. Echemos un vistazo a algunos de los sesgos más grandes abordados en el diseño de comportamiento.&lt;/div&gt;
&lt;h3 id=&quot;parcialidad-del-status-quo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Parcialidad Del Status Quo&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener un sesgo de status quo por lo general significa que tú eres muy resistente al cambio. Las personas de statu quo deben estar fuertemente motivadas para intentar algo nuevo. Estos no son los nuevos adoptadores de productos nuevos.&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñar para esta tendencia significa lentos objetivos incrementales durante un período de tiempo más largo.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;aversin-a-la-prdida&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aversión A La Pérdida&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La aversión a la pérdida es como suena: la tendencia a temer perder algo o no conseguir lo suficiente con el tiempo. Este sesgo se utiliza a menudo por la comercialización para que pueda comprar un producto&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ahora&lt;/em&gt;.&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñar para este sesgo significa resaltar lo que se perderá al no actuar inmediatamente.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo: un servicio en línea ofrece una prueba gratuita de 30 días. Hacia el final de los días de prueba, recibirás mensajes diciendo: “Sus días de pruebas están a punto de expirar. No pierdas esta oferta especial, ¡compra ahora!” Otro ejemplo común: es mejor que compres los billetes de avión ahora porque sólo quedan “dos asientos”.&lt;/div&gt;
&lt;h3 id=&quot;la-mentalidad-del-rebao-o-el-efecto-de-la-banda&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Mentalidad del Rebaño o el Efecto de la Banda&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta es la tendencia a hacer (o creer) las cosas porque muchas otras personas hacen (o creen) las mismas cosas. Es la tendencia a querer pertenecer a un grupo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo: ¿Alguna vez has ido a un sitio de viajes o productos y visto una frase como “45 otras personas están viendo esto ahora”, o “35 personas buscan reservar una habitación en este hotel?” Esa es una técnica de marketing para intentar hacerte sentir como si te dejaran fuera del grupo si no compras&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ahora&lt;/em&gt;. En muchos casos también se combina con la aversión a la pérdida.&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñar para este sesgo significa destacar lo que otras personas están haciendo en el sitio en este momento.&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;disponibilidad-heurstica&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Disponibilidad Heurística&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Disponibilidad Heurística es la evaluación o decisión rápida sobre un asunto, persona, etc. basada en la opinión actual. Es la tendencia a hacer suposiciones.&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñar para esto significa asegurarse de que la conciencia de la información no se asume como los usuarios se mueven a través del viaje.&lt;/span&gt;&amp;nbsp;Esto también se refiere a la idea de que si escuchas algo repetido largo y con frecuencia debe ser cierto.&lt;/div&gt;
&lt;h3 id=&quot;descuento-hiperblico&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Descuento Hiperbólico&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Piensa en compra de impulso — obtener una recompensa más inmediata con un descuento. Un descuento hiperbólico que lleva a opciones que son inconsistentes en el tiempo: las personas toman decisiones hoy en día que sus futuro yos preferirían no haber hecho a pesar de utilizar el mismo razonamiento.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, digamos que deseas comprar flores en línea. Vas a través de los pasos para conseguir esas rosas hermosas para ser entregadas y, al final, se te ofrece una serie de productos adicionales como chocolates, un osito de peluche, etc., todo a una tasa de descuento, pero sólo si se compran ahora. Puedes decidir obtener los ítems adicionales o no. Es difícil de predecir. Cosas como lo que sientes ese día, cuál es tu razón (positiva o negativa) para obtener las flores, cómo está en tu cuenta bancaria y si hoy era día de pago o no, todos juegan un papel en si agregas o no ese elemento adicional .&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseñar para este sesgo significa trabajar en el diseño una característica conocida como “FOMO” o “temor de perderse” si no actúas ahora.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hay cientos de sesgos diferentes por ahí. Estos son algunos de los más comunes que se utilizan en el diseño. Identifique un grupo de ellos para usarlo para sus necesidades específicas del proyecto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Codex Parcial Cognitivo&quot; height=&quot;511&quot; src=&quot;https://uploads.toptal.io/blog/image/123667/toptal-blog-image-1500996103784-4ab187b9759054ddbd40b88a03734f49.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Por&amp;nbsp;&lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Cognitive_Bias_Codex_-_180%2B_biases,_designed_by_John_Manoogian_III_(jm3).jpg&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Jm3 (Own work)&lt;/a&gt;&amp;nbsp;[&lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;CC BY-SA 4.0&lt;/a&gt;], via Wikimedia Commons&lt;/div&gt;
&lt;h2 id=&quot;ponindolo-todo-junto&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Poniéndolo Todo Junto&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al crear una base para su diseño utilizando la ciencia del comportamiento — definiendo el arquetipo de una persona y comprendiendo estratégicamente cómo diseñar usando sesgos cognitivos, puede dar forma más precisa a las&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/interactive&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;experiencias interactivas&lt;/a&gt;&amp;nbsp;que&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/product-design/anticipatory-design-how-to-create-magical-user-experiences&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;dinámicamente personalice&lt;/a&gt;&amp;nbsp;contenido. Al aprender acerca de la persona, su comportamiento, y los episodios de sesgo en el tiempo, puedes adaptar progresivamente la experiencia del producto con el fin de mantenerlos motivados. Cuando se combinan, estos esfuerzos junto con la analítica de datos y la ciencia de datos son herramientas poderosas que pueden ayudar a influir positivamente en el comportamiento humano.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Otras Lecturas&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dos recursos útiles para explorar aún más la ciencia del comportamiento y el concepto de arquetipo:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://ssir.org/articles/entry/the_new_science_of_designing_for_humans&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;La Nueva Ciencia Del Diseño Para Humanos&lt;/em&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Stanford Social Innovation Review&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.mindtheproduct.com/2014/02/using-behavioural-design-make-engaging-products/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Usando Diseño Conductual Para Crear Productos Más Atractivos&lt;/em&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Mind the Product&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;Por: &lt;a href=&quot;https://www.toptal.com/designers/resume/mike-slone&quot;&gt;Mike Slone&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;i&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-size: 19.2px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/designers/ux/dise%C3%B1ando-para-la-conducta-humana-definiendo-lo-intangible/es&quot;&gt;Toptal&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/7958735345805689499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/disenando-para-la-conducta-humana.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/7958735345805689499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/7958735345805689499'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/disenando-para-la-conducta-humana.html' title='Diseñando Para La Conducta Humana: Definiendo Lo Intangible'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-1968123960270574151</id><published>2017-08-17T06:30:00.000-03:00</published><updated>2017-08-17T16:34:12.500-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Business"/><category scheme="http://www.blogger.com/atom/ns#" term="DesignCommunication"/><category scheme="http://www.blogger.com/atom/ns#" term="DesignPodcast"/><category scheme="http://www.blogger.com/atom/ns#" term="DesignThinking"/><category scheme="http://www.blogger.com/atom/ns#" term="Featured"/><category scheme="http://www.blogger.com/atom/ns#" term="UX"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><title type='text'>13 Podcasts Que Todo Diseñador Debería Escuchar</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cada diseñador tiene una manera diferente de “conectar” cuando empieza a trabajar en un nuevo diseño. Escuchar música es probablemente una de las mejores opciones cuando trabajas en un sprint de diseño. Es posible que prefieras poner un programa de televisión de fondo, de esos que te dan un placer culpable. Pero de vez en cuando, puede ser que desees cambiarlo y aprender algo nuevo mientras que diseñas tu próxima obra maestra.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por eso compilé una lista de cada gran podcast de diseño para ayudar a enfocarte, obtener inspiración y mantenerte entretenido mientras diseñas. Tenemos todo, desde divertidos programas relacionados con la industria hasta los mejores podcasts tecnológicos sobre diseño y podcasts que te ayudarán a ver tus diseños de una nueva forma.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Comencemos…&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://shoptalkshow.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ShopTalk&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de ShopTalk&quot; height=&quot;481&quot; src=&quot;https://uploads.toptal.io/blog/image/123511/toptal-blog-image-1498929037110-baaee5234792f7a8be60e885099f4f3d.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
ShopTalk podcast de diseño y UX en vivo organizado por Chris Coyier y Dave Rupert. Cada semana, el dúo está acompañado por un invitado especial para discutir el diseño y desarrollo de páginas web front-end y para responder a las preguntas enviadas por los oyentes. Hay más de 260 episodios de este podcast, por lo que seguramente te mantendrá ocupado durante un tiempo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.adventuresindesignmarket.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Adventures in Design&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Adventures in Design&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123512/toptal-blog-image-1498929047145-37ea073e5c90351ba564214b703427e9.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si estás buscando algo para comenzar tu mañana todos los días, Adventures in Design tiene un nuevo episodio de lunes a viernes. Con casi 600 episodios hasta la fecha, este podcast cubre “la realidad de tratar de vivir sus sueños creativos”. Los temas son de la rama del diseño, y encontrarás un montón de bromas de diversión con esta dosis diaria de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://designdetails.simplecast.fm/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Design Details&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Design Details&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123513/toptal-blog-image-1498929055577-5acdd300fdb4320d8138554c310f707d.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Presentado por Bryn Jackson y Brian Lovin, este podcast de diseño te permite aprender de los mejores de la industria. Como ellos dicen, los anfitriones hablan con las personas que diseñan sus productos favoritos. Los últimos episodios incluyen entrevistas con un diseñador de producto en Slack, un director creativo de Google, y el líder de diseño en Shopify.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://www.debbiemillman.com/designmatters/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Design Matters con Debbie Millman&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;IImagen para el podcast de Design Matters con Debbie Millman&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123514/toptal-blog-image-1498929067460-17ce615af64ba48e66a3bc1922b52bb4.png&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;Este podcast afirma ser el primer podcast del mundo sobre diseño. Los episodios están compuestos de conversaciones con diseñadores, escritores, artistas, músicos y otros tipos creativos que tienen perspectivas únicas sobre el diseño moderno.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.vanschneider.com/show/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;NTMY the Show&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de NTMY the Show&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123515/toptal-blog-image-1498929078614-42aee022e4bec91566fbdc3b9e4fff93.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Presentado por Tobias van Schneider, NTMY significa “Nice to Meet You”. El programa es un podcast basado en una conversación personal en la que Tobias conoce un nuevo tipo de creatividad cada semana. Los huéspedes anteriores han incluido diseñadores de prendas de vestir, un diseñador convertido en comediante y un artista. Este es un podcast más reciente, con sólo dieciséis episodios hasta ahora.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://www.obsessedshow.com/#design-podcast&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Obsessed with Design&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Obsessed with Design&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123516/toptal-blog-image-1498929091175-e366eebe7d7508667d852a35b57a8b04.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este podcast tiene una visión amplia del diseño, no sólo se centra en el desarrollo web, sino en todo tipo de diseño. El anfitrión Josh Miles entrevista a un diseñador diferente en cada episodio con enfoques que van desde la ilustración, hasta marca y arquitectura.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://hackingui.com/podcast/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;The Hacking UI podcast&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://uploads.toptal.io/blog/image/123517/toptal-blog-image-1498929100523-f3606c4d14b21455d324c56d3fe44d20.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; font-size: 1.2em; letter-spacing: 0.14px; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Imagen para el podcast de Hacking UI&quot; border=&quot;0&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123517/toptal-blog-image-1498929100523-f3606c4d14b21455d324c56d3fe44d20.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En un fragmento de su popular boletín informativo, el podcast de Hacking UI presenta a los creadores Sagi Shrieber y David Tintner discutiendo sus pasiones: diseño, desarrollo, emprendimiento, tiempo de hacking y tecnología. Los episodios regularmente presentan entrevistas con algunos de los mejores diseñadores que trabajan hoy en día.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://uibreakfast.com/category/podcast/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-size: 1.2em; font-weight: 600; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;UI Breakfast: UI/UX Design and Product Strategy&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de UI Breakfast&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123518/toptal-blog-image-1498929110913-c8272d7a8588de5f0379413b7b117748.png&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Uno de los mejores podcasts de UX/UI, UI Breakfast es conducido por la consultora independiente Jane Portman. Originalmente de Rusia, Jane trae a expertos de la industria para compartir sus conocimientos e información sobre las tendencias UI / UX, productos, marketing y mucho más.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://userdefenders.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;User Defenders&lt;/span&gt; &lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de User Defenders&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123519/toptal-blog-image-1498929119830-f909c676b19d44d4a86ba79db724a4d4.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro gran podcast UX. User Defenders es conducido por Jason Ogle. Jason ofrece “entrevistas inspiradoras con superhéroes UX”. La idea detrás del podcast es ayudar a los diseñadores más nuevos a aprender de lo mejor al llegar a qué inspira a estos superhéroes UX, qué los motiva, y cómo obtuvieron éxito.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://thedeependdesign.com/graphic-design-podcast/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;The Deeply Graphic Design Cast&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de The Deeply Graphic Design Cast&quot; height=&quot;482&quot; src=&quot;https://uploads.toptal.io/blog/image/123520/toptal-blog-image-1498929130667-1c1cc9f89171e37cf37671ebcb36d7bd.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este podcast de diseño mantiene su enfoque en el diseño gráfico. Una buena salida de los podcasts anteriores basados en entrevistas, Deeply Graphic se centra en un tema de diseño diferente cada episodio, tomando una profunda inmersión en temas como el diseño con SEO en mente, el trabajo con subcontratistas, y el uso de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;moodboards&lt;/em&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/design-review&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Design Review&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Design Review&quot; height=&quot;480&quot; src=&quot;https://uploads.toptal.io/blog/image/123521/toptal-blog-image-1498929143666-b27302d23fa14c458f492a8fc75be7a5.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Design Review se emite dos veces por semana y se centra en diferentes aspectos del diseño de producto. Chris Liu y Jonathan Shariat hablan sobre el pensamiento del diseño, las herramientas, la experiencia del usuario y más. Ya hay 53 episodios, y todavía están haciendo nuevos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/podcastcode&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Code podcast&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Code&quot; height=&quot;480&quot; src=&quot;https://uploads.toptal.io/blog/image/123522/toptal-blog-image-1498929154889-7505fbd5a76f15038838abd9e3d00fe2.png&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Code Podcast— ¿Suena como algo para los desarrolladores? Lo es, pero también cubren algunos temas de diseño. Este podcast es una gran oportunidad para aprender sobre el diseño desde la perspectiva de un desarrollador con conocimiento de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/user-497137771&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Creative Honey&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Imagen para el podcast de Creative Honey&quot; height=&quot;480&quot; src=&quot;https://uploads.toptal.io/blog/image/123523/toptal-blog-image-1498929169343-3975ababc9010a94fec4432575a97724.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Si estás interesado en los enfoques de otros diseñadores, Creative Honey es definitivamente para ti. Grandes entrevistas, charlas sobre comunidad de diseño, y un poco de psicología. Desafortunadamente no han añadido nuevos episodios últimamente, pero todavía hay mucho contenido valioso en sus archivos.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/designers/resume/michael-abehsera&quot;&gt;Michael Abehsera&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/designers/creative-direction/13-podcasts-que-todo-dise%C3%B1ador-deber%C3%ADa-escuchar/es&quot; style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/1968123960270574151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/13-podcasts-que-todo-disenador-deberia-escuchar.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1968123960270574151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/1968123960270574151'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/13-podcasts-que-todo-disenador-deberia-escuchar.html' title='13 Podcasts Que Todo Diseñador Debería Escuchar'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-6994691243747223257</id><published>2017-08-02T00:30:00.000-03:00</published><updated>2017-08-02T11:12:31.253-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Business"/><category scheme="http://www.blogger.com/atom/ns#" term="Excel"/><category scheme="http://www.blogger.com/atom/ns#" term="PowerBI"/><category scheme="http://www.blogger.com/atom/ns#" term="PowerPivot"/><category scheme="http://www.blogger.com/atom/ns#" term="Solutions"/><title type='text'>Tutorial de Power Pivot para Excel: Los Casos y Ejemplos más Usados</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todo analista financiero es un genio en&amp;nbsp;&lt;a href=&quot;https://products.office.com/en-us/excel&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Excel&lt;/a&gt;. Sin embargo, al hacerse más económico el almacenamiento, nuestras organizaciones van acumulando más data. Y al tener más de esta data se hace más complicado trabajar con Excel—o llegamos al límite de fila 1,048,576, o el documento disminuye la velocidad tratando de procesar todo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A menudo, la decisión se encuentra entre perder detalles organizados cuidadosamente, o trabajar en un libro de trabajo tediosamente lento. A veces, tenemos que ser creativos para poder combinar dos grandes sets de data. Recurrimos a usar fórmulas complejas y esperamos una eternidad para que los cálculos sean resueltos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Afortunadamente, ya no tienes que tomar estas decisiones. La funcionalidad de&amp;nbsp;&lt;a href=&quot;https://support.office.com/en-us/article/Power-Pivot-Add-in-a9c2c6e2-cc49-4976-a7d7-40896795d045&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Power Pivot&lt;/a&gt;&amp;nbsp;de Excel provee una manera de extraer, combinar y analizar grandes sets de data. A pesar del hecho de que fue lanzado con Excel en el año 2010, la mayoría de los analistas financieros que conozco todavía no saben cómo usar Power Pívot, y muchos ni siquiera saben que existe.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, te voy a enseñar cómo usar Power Pívot para sobrellevar algunos problemas comunes de Excel y echaremos un vistazo a las ventajas adicionales clave del software usando algunos ejemplos. Este tutorial de Power Pívot para Excel tiene como finalidad servir de guía para lo que puedes conseguir con esta herramienta y, al final, voy a explorar algunos ejemplos de casos de uso dónde Power Pívot puede ser invaluable.&lt;/div&gt;
&lt;div&gt;
&lt;h2 id=&quot;qu-es-power-pivot-y-por-qu-es-til&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es Power Pivot y Por qué es Útil?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Power Pivot es una característica de Microsoft Excel que fue introducida como un agregado de Excel 2010 y 2013 y es, ahora, una característica nativa para Excel 2016. Como lo&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/gg413497%28v=sql.110%29.aspx&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;explica&lt;/a&gt;&amp;nbsp;Microsoft, Power Pivot para Excel “te permite importar millones de filas de data desde múltiples fuentes de data a un solo libro de trabajo de Excel, crear relaciones entre data heterogénea, crear columnas calculadas y medir usando fórmulas, construir PivotTables y PivotCharts, y luego analizar a profundidad la data para que así puedas tomar decisiones de negocios oportunas sin la asistencia del equipo IT.”&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La expresión de lenguaje principal usada por Microsoft en Power Pivot es&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DAX&lt;/em&gt;&amp;nbsp;(Data Analysis Expressions), aunque otros también pueden usarse en situaciones específicas. De nuevo, como lo explica Microsoft, “DAX es una colección de funciones, operadores y constantes que se pueden usar en una fórmula, o expresión, para calcular y regresar uno o más valores. Puesto de manera más sencilla, DAX te ayuda a crear nueva información desde la data que ya se encuentra en tu modelo.” Afortunadamente, para aquellos ya familiarizados con Excel, las fórmulas DAX les parecerán conocidas, ya que muchas de las fórmulas tienen sintaxis similar (ej.,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;SUM&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;AVERAGE&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;TRUNC&lt;/code&gt;).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para aclarar, los beneficios clave de usar Power Pivot vs. Excel básico se puede resumir así:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Te permite importar y manipular cientos de millones de filas de data donde Excel tiene una fuerte constricción de más de un millón de filas.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Te permite importar data desde múltiples fuentes a un libro de trabajo de fuente único, sin tener que crear múltiples hojas de fuente que sufren de control de versión y problemas de transferibilidad.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Te permite manipular la data importada, analizarla y sacar conclusiones sin bajar la velocidad de tu computadora a la velocidad de un caracol.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Te permite visualizar la data con PivotCharts y Power BI.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En las siguientes secciones, pasaré por cada uno de los beneficios nombrados y te mostraré cómo Power Pivot para Excel te puede ayudar.&lt;/div&gt;
&lt;h2 id=&quot;importar-grandes-sets-de-data&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
1) Importar Grandes Sets De Data&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como ya lo discutimos, una de las limitaciones más grandes de Excel tiene que ver con el trabajo con sets de data extremadamente grandes. Afortunadamente para nosotros, Excel puede subir más del límite de la fila de un millón, directamente a Power Pivot.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para demostrar esto generé una muestra de un set de data de un valor de ventas de dos años, esto para un vendedor de productos de deporte, con nueve categorías de productos diferentes y cuatro regiones. El set de data resultante es de dos millones de filas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando la tabulación&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Data&lt;/span&gt;&amp;nbsp;en la banda, cree una&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Nueva Pregunta&lt;/span&gt;&amp;nbsp;del archivo CSV (Muestra 1). Esta funcionalidad usada antes se llamaba&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PowerQuery&lt;/em&gt;, pero desde Excel 2016, se ha integrado mucho más en la tabulación de Data de Excel.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 1: Creando una Nueva Prueba&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 1 GIF animado&quot; height=&quot;345&quot; src=&quot;https://uploads.toptal.io/blog/image/122591/toptal-blog-image-1490763935175-29d1413a4f0c43f982e19b3129b91ed7.gif&quot; style=&quot;width: 960px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¡Pasar de un libro de trabajo en blanco de Excel a subir las dos millones de filas a Power Pivot tomó más o menos un minuto! Nota que pude formatear un poco de data ligera al ascender la primera fila para que se convirtieran en los nombres de las columnas. En los últimos años, la funcionalidad de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Power Query&lt;/em&gt;&amp;nbsp;ha mejorado enormemente, pasó de un agregado de Excel a parte integrada de la tabulación de Data en la barra de herramientas.&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Power Query&lt;/em&gt;&amp;nbsp;puede girar, aplastar, limpiar y dar forma a tu data a través de una variedad de opciones y su propio idioma, M.&lt;/div&gt;
&lt;h2 id=&quot;importar-data-desde-mltiples-fuentes&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
2) Importar Data desde Múltiples Fuentes&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Uno de los beneficios clave de Power Pivot para Excel, es la habilidad de importar data fácilmente de múltiples fuentes. Previamente, muchos de nosotros creábamos múltiples hojas de trabajo para nuestras distintas fuentes de data. A menudo, este proceso involucraba escribir código VBA y copiar y pegar de estas fuentes dispares. Afortunadamente para nosotros, Power Pívot te permite importar data desde distintas fuentes de data directamente a Excel sin tener que encontrarse con los problemas mencionados anteriormente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al usar la función&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Query&lt;/em&gt;&amp;nbsp;en la Muestra 1, podemos extraer desde cualquiera de las siguientes fuentes:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Microsoft Azure&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;SQL Server&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Teradata&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Facebook&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Salesforce&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Archivos JSON&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Libros de trabajo de Excel&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;…y muchos más&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Más aún, múltiples fuentes de data pueden ser combinadas en la función&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Query&lt;/em&gt;&amp;nbsp;o en la ventana Power Pivot, para integrar data. Por ejemplo, puedes extraer data de costo de producción de un libro de trabajo de Excel y resultados de ventas verdaderos del servidor SQL a través de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Query&lt;/em&gt;&amp;nbsp;hacia Power Pivot. A partir de ahí, puedes combinar los dos sets de data al combinar números de un lote de producción con márgenes brutos por unidad.&lt;/div&gt;
&lt;h2 id=&quot;trabajar-con-grandes-sets-de-data&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
3) Trabajar con Grandes Sets de Data&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otra ventaja clave de Power Pivot para Excel es la habilidad de manipular y trabajar con grandes sets de data para alcanzar conclusiones y análisis relevantes. Pasaré por algunos ejemplos comunes, para darte una apreciación del poder de la herramienta.&lt;/div&gt;
&lt;h4 id=&quot;medidas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Medidas&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los adictos a Excel estarán completamente de acuerdo con que&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTables&lt;/em&gt;&amp;nbsp;son unas de las tareas más útiles pero al mismo tiempo frustrantes de realizar. Particularmente frustrantes cuando se trata de trabajar con grandes sets de data. Afortunadamente, Power Pivot para Excel nos permite crear, rápida y fácilmente,&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTables&lt;/em&gt;&amp;nbsp;cuando se trabaja sets de data más grandes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En la imagen de abajo (Muestra 2), nota como la ventana de Power Pivot está separada en dos cristales. El cristal de arriba tiene la data y el de abajo contiene las medidas. Una medida es un cálculo que se realiza en todo el set de data. He ingresado una medida al ingresar la celda resaltada.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Total Sales:=SUM(&#39;Accounting Data&#39;[Amount])
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto crea una nueva medida que suma a través de la columna de Cantidad. Similarmente, puedo ingresar otra medida en la celda de abajo.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Average Sales:=AVERAGE(&#39;Accounting Data&#39;[Amount])
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 2: Creando Medidas&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 2 imagen estática&quot; height=&quot;372&quot; src=&quot;https://uploads.toptal.io/blog/image/122592/toptal-blog-image-1490764114246-355bb9c734490e670ae16fc1b8eefa5d.png&quot; style=&quot;font-size: 1.2em; font-weight: 600; letter-spacing: 0.14px; width: 605.5px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde ahí, observa lo rápido que es crear una&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;&amp;nbsp;familiar en un gran set de data.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 3: Creando una PivotTable&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 3 GIF animado&quot; height=&quot;346&quot; src=&quot;https://uploads.toptal.io/blog/image/122593/toptal-blog-image-1490764143518-fd8deb0dad4e221407bd37a168306462.gif&quot; style=&quot;width: 956px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;h4 id=&quot;tablas-de-dimensin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tablas de Dimensión&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como analistas financieros que usan Excel, nos convertimos adeptos al usar fórmulas complicadas para doblegar la tecnología a nuestra voluntad. Dominamos&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;VLOOKUP&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;SUMIF&lt;/code&gt;, y hasta el temido&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;INDEX(MATCH())&lt;/code&gt;. Sin embargo, al usar Power Pivot, podemos deshacernos de mucho de esto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 4: Agregar una Tabla Creada por el Usuario a un Modelo Power Pivot&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 4 GIF animado&quot; height=&quot;334&quot; src=&quot;https://uploads.toptal.io/blog/image/122594/toptal-blog-image-1490764218040-b695be8260e97277067e452bb756cadd.gif&quot; style=&quot;width: 956px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para demostrar esta funcionalidad, creé una pequeña tabla de referencia en la que asigné cada Categoría a un Tipo. Al escoger “Agregar a Modelo de Data”, esta tabla es cargada a Power Pivot (Muestra 4 arriba).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También creé una tabla de fecha para ser usada con nuestro set de data (Muestra 5). Power Pivot para Excel hace más fácil crear una tabla de fecha rápidamente, para así consolidar por meses, trimestres y días de la semana. El usuario puede también crear una tabla de fecha más a la medida para analizar por semanas, años fiscales, o cualquier agrupamiento específico de la organización.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 5: Crear una Tabla de Fecha&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 5 GIF animado&quot; height=&quot;338&quot; src=&quot;https://uploads.toptal.io/blog/image/122595/toptal-blog-image-1490764268191-82eb796c6a1d0f86b2fe2bd6f3a7f4cc.gif&quot; style=&quot;width: 959px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 id=&quot;columnas-de-clculo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Columnas de Cálculo&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aparte de las medidas, hay otro tipo de cálculo: las columnas de cálculo. Los usuarios de Excel se sentirán cómodos escribiendo estas fórmulas, ya que son muy similares a escribir fórmulas en tablas de fecha. Creé una nueva columna de cálculo abajo (Muestra 6) la cual organiza la tabla de Data de Contabilidad por Cantidad. Las ventas por debajo de 50 dólares se marcan como “Pequeñas” y el resto se marcan como “Grandes”. ¿No se siente intuitiva la fórmula?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 6: Creando una Columna de Cálculo&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 6 GIF animado&quot; height=&quot;340&quot; src=&quot;https://uploads.toptal.io/blog/image/122596/toptal-blog-image-1490764305722-28739e8a08eb329baaa14a98dafae8d1.gif&quot; style=&quot;width: 956px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;relaciones&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Relaciones&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Luego, podemos crear una relación entre el campo de la Categoría de la tabla de Data de Contabilidad y el campo de Categoría de la tabla de Categoría, usando la Vista de Diagrama. Adicionalmente, podemos definir una relación entre el campo Fecha de Ventas de la tabla de Data de Contabilidad y el campo de Fecha de la tabla de Calendario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 7: Definiendo Relaciones&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 7 GIF animado&quot; height=&quot;338&quot; src=&quot;https://uploads.toptal.io/blog/image/122597/toptal-blog-image-1490764353085-8df6e7fc2f0ae86f79e240e86135fd61.gif&quot; style=&quot;width: 960px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora, sin necesidad de ninguna función&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;SUMIF&lt;/code&gt;&amp;nbsp;o&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;VLOOKUP&lt;/code&gt;, podemos crear una&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;&amp;nbsp;que calculó Ventas Totales por año y tipo, con un cortador para el Tamaño de la Transacción.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 8: PivotTable Usando Relaciones&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 8 GIF animado&quot; height=&quot;340&quot; src=&quot;https://uploads.toptal.io/blog/image/122598/toptal-blog-image-1490764382802-66b4b2ee378ee940d6a80a9606170f37.gif&quot; style=&quot;width: 956px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
O, podemos crear una gráfica de Ventas Regulares para cada día de la semana usando la nueva tabla de Calendario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 9: PivotChart Usando Relaciones&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 9 imagen estática&quot; src=&quot;https://uploads.toptal.io/blog/image/122599/toptal-blog-image-1490764447216-f439f7f41ffdaf9fd0a32e609769851b.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras esta gráfica parece simple, es impresionante que haya tomado menos de 10 segundos crear una consolidación de más de dos millones de filas de data, sin agregar una nueva columna a la data de ventas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras podemos llevar a cabo estos escenarios de reportaje consolidados, también podemos adentrarnos en los ítems de línea individuales. Retenemos nuestra data altamente granular.&lt;/div&gt;
&lt;h3 id=&quot;funciones-avanzadas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Funciones Avanzadas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hasta ahora, la mayoría de los análisis que he mostrado son, relativamente, cálculos directos. Ahora, quiero demostrar algunas de las capacidades más avanzadas de esta plataforma.&lt;/div&gt;
&lt;h4 id=&quot;inteligencia-de-tiempo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Inteligencia de Tiempo&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A menudo, cuando examinamos los resultados financieros, queremos compararlos a un periodo de tiempo comparable del año anterior. Power Pivot tiene unas funciones de inteligencia de tiempo integradas.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Same Period Last Year Sales:=CALCULATE([Total Sales],SAMEPERIODLASTYEAR(&#39;Calendar&#39;[Date]))
 
YOY Sales Growth:=if(not(ISBLANK([Same Period Last Year Sales])),([Total Sales]/[Same Period Last Year Sales])-1,BLANK())
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, agregar solo dos medidas sobre la tabla de Data de Contabilidad en Power Pivot me permite producir la siguiente&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;&amp;nbsp;en solo un par de clics.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 10: Inteligencia de Tiempo PivotTable&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 10 imagen estática&quot; height=&quot;464&quot; src=&quot;https://uploads.toptal.io/blog/image/122600/toptal-blog-image-1490764550039-a3faa0ded6dd5530962f78ed81bf72f1.png&quot; style=&quot;width: 681.5px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 id=&quot;granularidades-disparejas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Granularidades Disparejas&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como analista financiero, un problema que tengo que resolver a menudo es las granularidades disparejas. En nuestro ejemplo, la data exacta de ventas se muestra en el nivel de categoría, pero preparemos un presupuesto que está solo en un nivel de temporada. Para extender esta disparidad, vamos a preparar un presupuesto trimestral, aunque la data de ventas sea diaria.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 11: Granularidades - Tabla de Presupuesto&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 11 imagen estática&quot; height=&quot;88&quot; src=&quot;https://uploads.toptal.io/blog/image/122601/toptal-blog-image-1490764572044-4c63e023bcc5f71520fd09209d20fb63.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con Power Pivot para Excel, esta inconsistencia se resuelve fácilmente. Al crear dos tablas de referencia adicionales, o tablas de dimensión en nomenclatura de base de datos, podemos crear las relaciones apropiadas para analizar nuestras ventas verdaderas en comparación con las cantidades presupuestadas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 12: Granularidades - Relaciones Disparejas&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 12 imagen estática&quot; height=&quot;315&quot; src=&quot;https://uploads.toptal.io/blog/image/122602/toptal-blog-image-1490764598471-6bf92dd7157eb94d6b68a24388d40aa7.png&quot; style=&quot;font-size: 1.2em; font-weight: 600; letter-spacing: 0.14px; width: 538px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En Excel, la siguiente&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;&amp;nbsp;está lista rápidamente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 13: Granularidades - Presupuesto Disparejos vs. Resultados Verdaderos&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 13 imagen estática&quot; height=&quot;263&quot; src=&quot;https://uploads.toptal.io/blog/image/122603/toptal-blog-image-1490764619044-bdc8e3b2dca2ef7abf89c02fd90fae6e.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, podemos definir nuevas medidas que calculan la divergencia entre ventas verdaderas y ventas presupuestadas, como se muestra abajo:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Actual-to-Budget Variance:=if(ISBLANK([Total Budgeted Sales]),BLANK(),[Total Sales]/[Total Budgeted Sales]-1)
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al usar esta medida, podemos mostrar la divergencia en una&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 14: Granularidad es Disparejas - Resultados Divergentes&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 14 imagen estática&quot; height=&quot;308&quot; src=&quot;https://uploads.toptal.io/blog/image/122604/toptal-blog-image-1490764654395-088dde1b8a5acf78f3de5d411cb7341a.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 id=&quot;porcentaje-total&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Porcentaje Total&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Finalmente, examinemos las ventas en una categoría en particular como porcentaje de todas las ventas (ej., contribución de categoría a ventas generales), y ventas en una categoría en particular como porcentaje de todas las ventas de un mismo tipo (ej., contribución de categoría a ventas por temporadas). Creé las dos medidas que se muestran abajo:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Total Sales as Percent of All Sales:=[Total Sales]/CALCULATE([Total Sales],ALL(&#39;Accounting Data&#39;))
Total Sales as Percent of Type:=[Total Sales]/CALCULATE([Total Sales],ALL(&#39;Accounting Data&#39;[Category]))
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esas medidas ahora se pueden implementar en una nueva&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTable&lt;/em&gt;:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 15: Porcentaje Total&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 15 imagen estática&quot; height=&quot;217&quot; src=&quot;https://uploads.toptal.io/blog/image/122605/toptal-blog-image-1490764688578-3ba6e6f5dc2398e09596ff2e87ff17b2.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nota como se realizan los cálculos en&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ambos&lt;/em&gt;&amp;nbsp;tipos de niveles, el de categoría y el de tipo temporal. Me encanta como se realizan estos cálculos, tan rápido y sin esfuerzo, sobre todo en un set de data tan grande. Estos son solo unos pocos ejemplos de la elegancia y el claro poder computacional de Power Pivot.&lt;/div&gt;
&lt;h3 id=&quot;compresin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Compresión&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro beneficio es que los tamaños de los archivos se minimizan. El tamaño original del archivo era de 91MB y ahora es menos de 4MB. Eso es una compresión de 96% del archivo original.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 16: Tamaños de Archivo&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 16 imagen estática&quot; height=&quot;41&quot; src=&quot;https://uploads.toptal.io/blog/image/122606/toptal-blog-image-1490764713028-4239e3218ed968997127f2c114770d12.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo sucede esto? Power Pivot usa el motor&amp;nbsp;&lt;a href=&quot;https://technet.microsoft.com/en-us/library/hh922900(v=sql.110).aspx&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;xVelocity&lt;/a&gt;&amp;nbsp;para comprimir la data. En términos más sencillos, la data está almacenada en columnas en vez de filas. Este método de almacenamiento permite a la computadora comprimir valores duplicados. En nuestro ejemplo de set de data, hay solo cuatro regiones que se repiten en los dos millones de filas. Power Pivot para Excel puede almacenar eficientemente esta data. El resultado es que para la data que tiene muchos valores repetitivos, cuesta mucho menos almacenar esta data.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algo importante a resaltar es que yo usé cantidades de dólares completas en este set de data de muestra. Si hubiese incluido dos puntos decimales para reflejar céntimos, el efecto de compresión disminuiría a un impresionante 80% del tamaño del archivo original.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 id=&quot;tabular-ssas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tabular SSAS&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los modelos Power Pivot también pueden ser expansibles a toda la empresa. Digamos que construyes un modelo Power Pivot que comienza a ganar usuarios en la organización, o la data crece a 10 millones de filas, o ambas. En ese momento, puede que no quieras treinta usuarios distintos actualizando el modelo o haciendo cambios. El modelo puede ser convertido en una Tabular SSAS, sin mayores inconvenientes. Todas las tablas y relaciones son retenidas, pero ahora puedes controlar la frecuencia de actualización, asignar roles (ej., solo lectura, lectura y procesar) a varios usuarios, e implementar un pequeño front-end de Excel, el cual se conecta al modelo Tabular. El resultado es que tus usuarios podrían acceder al modelo tabular implementado, con un pequeño libro de trabajo, pero no accederían a las fórmulas y medidas.&lt;/div&gt;
&lt;h2 id=&quot;anlisis-y-visualizacin-de-data&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
4) Análisis y Visualización de Data&lt;/h2&gt;
&lt;h3 id=&quot;frmulas-cube&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Fórmulas CUBE&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una de las peticiones más comunes de mis clientes es que cree reportes que conformen diseños estrictamente definidos. Tengo clientes que piden anchos de columna específicos, códigos de color RGB y nombres y tamaños de letras predeterminados. Considera el siguiente panel de instrumentos:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 17: Fórmulas CUBE empotradas&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 17 imagen estática&quot; height=&quot;387&quot; src=&quot;https://uploads.toptal.io/blog/image/122607/toptal-blog-image-1490764742852-202826a54afc0c60692e2997055fa81d.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo poblamos los números de ventas sin generar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PivotTables&lt;/em&gt;, si todas nuestras ventas son almacenadas con Power Pivot para Excel? Usando fórmulas CUBE! Podemos escribir fórmulas CUBE dentro de cualquier celda Excel y realizará el cálculo con el modelo Power Pivot que ya hemos construido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, la siguiente fórmula está escrita en la celda bajo el nombre “Ventas Totales 2016:”&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=CUBEVALUE(&quot;&lt;mark style=&quot;background-color: lemonchiffon; border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;ThisWorkbookDataModel&lt;/mark&gt;&quot;,&quot;&lt;mark style=&quot;background-color: mediumseagreen; border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;[Measures].[Total Sales]&lt;/mark&gt;&quot;,&quot;&lt;mark style=&quot;background-color: slateblue; border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;[Calendar].[Year].[2016]&lt;/mark&gt;&quot;)
&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La primera parte de la fórmula, resaltada en amarillo, se refiere al nombre del modelo Power Pivot. En general, se usa ThisWorkbookDataModel para versiones más nuevas de Power Pivot para Excel. La porción en verde define que queremos usar la medida Ventas Totales. La parte en azul instruye a Excel a filtrar solo para filas que tengan una Fecha de Ventas con un año igual a 2016.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Detrás de escena, Power Pivot ha construido un&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;cube&lt;/em&gt;&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Online Analytical Processing&lt;/em&gt;&amp;nbsp;(OLAP) con la data, columnas calculadas y medidas. Este diseño permite al usuario Excel poder acceder a la data con solo traerla directamente con las funciones de CUBE. Al usar las fórmulas CUBE, he podido construir declaraciones financieras que conforman diseños predeterminados. Esta habilidad es uno de los beneficios de usar Power Pivot para Excel para análisis financieros.&lt;/div&gt;
&lt;h3 id=&quot;power-bi&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Power BI&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otra ventaja de Power Pivot para Excel es que puedes tomar rápidamente cualquier libro de trabajo de Power Pivot que construyas y convertirlo en un modelo Power BI. Al importar el libro de trabajo de Excel directamente a una aplicación de escritorio Power BI o Power BI online, puedes analizar, visualizar y compartir tu data con cualquier persona en tu organización. Esencialmente, Power BI es Power Pivot, PowerQuery, y SharePoint, todos en uno. Debajo, creé un tablero al importar el libro de trabajo de Power Pivot para Excel a la aplicación de escritorio Power BI. Nota lo interactiva que es la interfaz:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 18: Power BI&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Exhibit 18 GIF animado&quot; height=&quot;420&quot; src=&quot;https://uploads.toptal.io/blog/image/122608/toptal-blog-image-1490764801214-691a1a79e1d28ee78030176b4db14916.gif&quot; style=&quot;width: 595px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;Algo genial sobre Power BI son las Preguntas y Respuestas en Idioma Natural. Para demostrarlo, cargué el modelo Power BI a mi cuenta en línea de Power BI. Desde la página web puedo hacer preguntas y Power BI construye el análisis apropiado mientras escribo:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 19: Preguntas y Respuestas en Idioma Natural&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Muestra 19 GIF animado&quot; height=&quot;401&quot; src=&quot;https://uploads.toptal.io/blog/image/122609/toptal-blog-image-1490764828159-2a32d53dc9ebdd5ff9c5c9a01b3cde14.gif&quot; style=&quot;width: 703px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este tipo de habilidad de preguntar le permite al usuario hacer preguntas del modelo de data e interactuar con la data en una manera más sencilla que en Excel.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro beneficio de Power BI es que los desarrolladores de Microsoft están lanzando actualizaciones constantemente. Nuevas características, que han sido pedidas por los usuarios, se lanzan mensualmente. Lo mejor de todo, es una transición sin inconvenientes de Power Pivot para Excel. Así que, ¡el tiempo que invertiste aprendiendo las fórmulas DAX se puede implementar en Power BI! Para el analista que necesita compartir sus análisis con muchos usuarios en varios dispositivos, valdría la pena explorar Power BI.&lt;/div&gt;
&lt;h2 id=&quot;las-mejores-prcticas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las Mejores Prácticas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una vez que comienzas, hay un par de mejores prácticas que deberías seguir.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La primera es decidir conscientemente que importa en primer lugar. ¿En algún momento usarás la dirección de la casa del vendedor? ¿Necesito saber la dirección de correo electrónico de mi cliente en el contexto de este libro de trabajo? Si la meta es agregar la data al tablero, entonces parte de la data disponible no será necesaria para esos cálculos. Dedicarle tiempo a limpiar la data entrante permitirá aligerar la carga de problemas y uso de memoria más tarde cuando se expanda tu set de data.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otra de las mejores prácticas es recordar que Power Pivot no es Excel. En Excel, estamos acostumbrados a crear cálculos al expandir, constantemente, nuestras hojas de cálculo a la derecha. Power Pivot para Excel procesa efectivamente la data si limitamos esto a lo deseado. En vez de crear constantemente columnas de cálculo a la derecha de tu data, aprende a escribir medidas en el cristal inferior. Este hábito asegurará archivos más pequeños y computaciones más rápidas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Finalmente, sugeriría usar nombres comunes en inglés para las medidas. Me tomó algo de tiempo adaptarme a esto. Pasé los primeros años inventando nombres como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;SumExpPctTotal&lt;/code&gt;, pero una vez que otras personas comenzaron a usar los mismos libros de trabajo, tuve mucho que explicar. Ahora, cuando comienzo un nuevo libro de trabajo, uso nombres como&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Ítem de Línea de Gastos como Porcentaje de Gastos Totales&lt;/code&gt;. A pesar de que el nombre es más largo, es mucho más fácil de usar por otra persona.&lt;/div&gt;
&lt;h2 id=&quot;casos-de-uso-en-el-mundo-real&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Casos de Uso en el Mundo Real&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, presenté solo parte de las maneras en que Power Pivot para Excel te permite tomar un paso importante, más allá de lo común de Excel. Pensé que sería útil resaltar algunos casos de la vida real en los que Power Pivot para Excel me ha sido extremadamente útil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí hay algunos:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Analiza el rendimiento de un gran portafolio de valores en distintos rangos de tiempo:&lt;/span&gt;&amp;nbsp;Ya que Power Pivot para Excel nos permite definir medidas que comparan un período de tiempo con uno previo, rápidamente podemos tener rendimiento trimestre tras trimestre, año tras año y mes tras mes, todos de manera continua, al escribir un par de medidas.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Resalta la data de contabilidad usando niveles de agregación a la medida:&lt;/span&gt;&amp;nbsp;Al identificar por nombre, categoría y estado financiero cada ítem de línea de un libro mayor de contabilidad, los reportes se pueden crear rápidamente, incluyendo los ítems de línea apropiados.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Las cadenas pueden identificar ventas de la misma tienda:&lt;/span&gt;&amp;nbsp;Al usar una tabla que mapea cuando las tiendas están en línea, los resultados financieros pueden compararse en una base de la misma tienda.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Señala los que han estado por encima y por debajo de las ventas:&lt;/span&gt;&amp;nbsp;PivotTables se puede crear para resaltar el top 5 de los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;SKU&lt;/em&gt;&amp;nbsp;al igual que los 5 más bajos por ventas, márgenes generales, período de producción, etc.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Los minoristas pueden definir tablas de calendario que usan una configuración 4-4-5:&lt;/span&gt;&amp;nbsp;Usando una tabla de fecha hecha a la medida, un minorista puede asignar cada día a un mes específico 4-4-5 fácilmente, luego los resultados de las ventas diarias se pueden pasar al mes correspondiente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;de-hojas-de-trabajo-torpes-a-libros-de-trabajo-modernos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
De Hojas de Trabajo Torpes a Libros de Trabajo Modernos&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como analistas financieros, se nos pide realizar cálculos complejos en sets de data que siguen creciendo. Ya que Excel es la herramienta analítica por defecto, la curva de aprendizaje de Power Pivot es fácil y muchas de las funciones imitan las funciones nativas de Excel.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con el uso de las funciones CUBE, Power Pivot para Excel se integra fácilmente a tus libros de trabajo ya existentes en Excel. La ganancia de eficiencia computacional no se puede negar. Asumiendo una rapidez de procesamiento de 20% más velocidad, lo cual es conservador, el analista financiero que pase seis horas al día en Excel se puede ahorrar 300 horas al año.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Adicionalmente, ahora podemos analizar sets de data que son más largos comparados con los que analizábamos anteriormente con nuestro Excel tradicional. Con modelos diseñados eficientemente, podemos tener más de 10 veces la data que se nos permitía anteriormente con Excel tradicional, mientras mantenemos una agilidad analítica. Con la habilidad de convertir los modelos desde Power Pivot al Tabular SSAS, la cantidad de data que se puede procesar es de 100–1,000 veces lo que podemos alcanzar en Excel.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La habilidad de Power Pivot para Excel de realizar cálculos con extrema rapidez, en grandes cantidades de data y todavía retener la habilidad de sumergirse en los detalles, puede transformar los análisis financieros de torpes hojas de cálculo a libros de trabajo modernos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si te interesa probar Power Pivot para Excel, debajo hay algunos materiales que te pueden ser útil para comenzar.&lt;/div&gt;
&lt;h3 id=&quot;referencias-y-guas-tiles&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Referencias y Guías Útiles&lt;br /&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Collie, R., &amp;amp; Singh, A. (2016). Power Pivot and Power BI: The Excel user’s guide to DAX, Power Query, Power BI &amp;amp; Power Pivot in Excel 2010-2016. United States: Holy Macro! Books.&lt;/li&gt;
&lt;li&gt;Ferrari, A., &amp;amp; Russo, M. (2015). The definitive guide to DAX: Business intelligence with Microsoft Excel, SQL Server Analysis Services, and Power BI. United States: Microsoft Press, USA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-weight: 600; letter-spacing: 0.14px;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/finance/resume/ellen-su&quot;&gt;Ellen Su&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 600; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/finance/excel-experts/tutorial-de-power-pivot-para-excel-los-casos-y-ejemplos-m%C3%A1s-usados/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/6994691243747223257/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/tutorial-power-pivot-para-excel-casos-y-ejemplos-mas-usados.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/6994691243747223257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/6994691243747223257'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/08/tutorial-power-pivot-para-excel-casos-y-ejemplos-mas-usados.html' title='Tutorial de Power Pivot para Excel: Los Casos y Ejemplos más Usados'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Unquillo, Córdoba, Argentina</georss:featurename><georss:point>-31.2341309 -64.316711400000031</georss:point><georss:box>-31.3427484 -64.478072900000029 -31.1255134 -64.155349900000033</georss:box></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-2565833645920759528</id><published>2017-07-16T22:31:00.002-03:00</published><updated>2017-07-16T22:31:13.505-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Design"/><category scheme="http://www.blogger.com/atom/ns#" term="DesignPsychology"/><category scheme="http://www.blogger.com/atom/ns#" term="PersuasiveDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="ProductDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="UIDesign"/><category scheme="http://www.blogger.com/atom/ns#" term="UXDesign"/><title type='text'>Diseño Persuasivo: Usando Psicología Avanzada Efectivamente</title><content type='html'>&lt;span style=&quot;background-color: white; color: #505050; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;b&gt;&lt;i&gt;“Las emociones forman toda actividad en formas adaptativas. En la ausencia de componentes emocionales, la toma de decisiones es virtualmente imposible.” —Saver &amp;amp; Damasio (1991)&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #505050; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los sitios web han avanzado mucho en poco tiempo–es realmente increíble cómo muchos de estos sitios que pertenecen a las marcas más establecidas de la última década, han cambiado desde su primera iteración.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando los sitios web fueron usados por primera vez por propósitos comerciales, no le prestaron mucha atención a la experiencia de usuario; el punto era poner la mayor cantidad de contenido posible en una página. Ahora ponen un peso mayor en investigación, con una mina de datos, y optimizados para tomar tu atención y ofrecerte el contenido exacto, junto a funcionalidades y opciones al mismo tiempo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Más y más compañías están usando investigación psicológica avanzada y para empujar a más compras y fidelidad de parte de los usuarios, han transformado lo que era arte en ciencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;338&quot; src=&quot;https://uploads.toptal.io/blog/image/122711/toptal-blog-image-1491888448254-433c406607abb8b5f84283ba864e5aa6.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; letter-spacing: 0.14px; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;El sitio web de Apple de 1997&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #3863a0; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #3863a0; letter-spacing: 0.14px;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Diseño Persuasivo&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En adición a muchos elementos esenciales, el buen diseño siempre tendrá en mente las necesidades psicológicas y emocionales. Miremos al diseño persuasivo y exploremos cómo los procesos mentales que influenciaron cómo los humanos se comportan puede ser aplicado al diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La palabra&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;”persuación”&lt;/span&gt;&amp;nbsp;es muchas veces asociada con la manipulación, engaños, y—especialmente para un diseñador–el uso de&amp;nbsp;&lt;a href=&quot;https://darkpatterns.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;patrones oscuros&lt;/a&gt;. Se ha ganado una reputación particular; sin embargo, seamos claros en que no es eso lo que estamos debatiendo. El diseño persuasivo puede mejorar la experiencia de usuario al hacer un sitio web fácil de usar—entiende de disparadores psicológicos, la conducta de los usuarios y las entabla.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por ejemplo, Amazon persuade a los usuarios para que sigan comprando más al recomendar productos alternativos y accesorios, y emplea patrones miméticos y persuasivos al mostrar opciones como “clientes que vieron este objeto también compraron…”. Para cerrar una venta rápidamente, también le ofrecen a los compradores la habilidad de comprar con un sólo click.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;416&quot; src=&quot;https://uploads.toptal.io/blog/image/122712/toptal-blog-image-1491888881430-cc46091c030b363f233c3041bc3e3743.jpeg&quot; style=&quot;width: 840px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todos estamos gastando mucho más tiempo en un mundo online, y los&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores&lt;/a&gt;&amp;nbsp;pueden usar lo que han aprendido de conductas&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;offline&lt;/em&gt;&amp;nbsp;para crear mejores experiencias de usuario. Así quieras modificar un sitio web existente o construir una app, el diseño persuasivo guiará y apoyará la experiencia online del usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo puede un diseñador usar lo último en investigación de psicología para mejorar el impacto de sus diseños?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Entender los principios de la psicología te provee con la habilidad de explicar la racionalidad subyacente de tu trabajo. Puede:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Servir como fuente de investigación y justificación en déficit de investigación de usuario.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Ayudar a validar tu diseño y razonar con un cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Debatamos algunas teorías.&lt;/div&gt;
&lt;h3 id=&quot;la-percepcin-del-control&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La Percepción Del Control&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como humanos, tenemos una necesidad innata de control. Esto nos lleva hacia nuestros humildes comienzos. En ponerle un precio a la&amp;nbsp;&lt;a href=&quot;https://www.psychologytoday.com/blog/hide-and-seek/201205/our-hierarchy-needs&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;jerarquía de las necesidades&lt;/a&gt;, el psicólogo Abraham Maslow nombró las más básicas: salud, comida, y sueño. Todas estas requieren un nivel de control sobre nuestro ambiente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;480&quot; src=&quot;https://uploads.toptal.io/blog/image/122713/toptal-blog-image-1491888899241-0a942659e662bbecb820019dd91d8935.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; letter-spacing: 0.14px; text-align: center;&quot;&gt;La Jerarquía De Las Necesidades De Maslow (cortesía de&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.psychologytoday.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; text-align: center; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;psychologytoday.com&lt;/a&gt;&lt;span style=&quot;background-color: #fafafa; color: #505050; letter-spacing: 0.14px; text-align: center;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ui&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores UI&lt;/a&gt;, necesitamos asegurarnos que nuestros usuarios tendrán una experiencia positiva dentro del ambiente que creamos para ellos. Esto significa hacerlos sentir poderosos al ofrecerles herramientas que los harán sentir como si estuvieran en control de su travesía.&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;https://www.linkedin.com/pulse/user-control-cognitive-overload-how-ux-methods-can-help-kintscher&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Consultor UX Nadine Kintscher&lt;/a&gt;&amp;nbsp;dice, “Hoy, puedes ajustar el brillo de tus pantallas, desactivar notificaciones, y decidir si quieres que tu teléfono se conecte a datos y una red de teléfono o no…Incluso si estos ajustes sólo amplian la batería de tu dispositivo por sólo unos minutos, te da un sentimiento cálido de logro. TÚ estás a cargo.”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Necesitamos crear interfaces que son un balance entre ser funcional y visualmente cautivantes,&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;y&lt;/em&gt;&amp;nbsp;darle a los usuarios un poco de control para que tengan una experiencia satisfactoria.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.realestate.com.au/rent/in-thornbury%2c+vic+3071%3b+northcote%2c+vic+3070%3b/list-1&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Realestate&lt;/a&gt;, un sitio web Australiano de búsqueda de inmuebles, tiene éxito en hacer lo mencionado con anterioridad al dejar que sus usuarios filtren las propiedades de acuerdo a sus preferencias, y al darles la opción de ordenar por una norma limitada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;309&quot; src=&quot;https://uploads.toptal.io/blog/image/122714/toptal-blog-image-1491888916185-b2478f4d41a1e963b3b56c53b9ef64ef.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;h3 id=&quot;motivacin-habilidad-y-disparador&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Motivación, Habilidad Y Disparador&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cómo&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/user-experience&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñas una experiencia digital&lt;/a&gt;&amp;nbsp;que le permita a los usuarios entablar conductas deseadas que ocurrirán en el momento exacto?&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Motivación, habilidad, y disparadores&lt;/span&gt;—una simple teoría basada en el&amp;nbsp;&lt;a href=&quot;http://www.behaviormodel.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Modelo Conductual de Fogg&lt;/a&gt;—es ideal para cualquiera intentando entender la psicología persuasiva. De acuerdo con el principio de la motivación, habilidad, y disparadores, la conducta ocurre cuando una persona es motivada, tiene la habilidad de tomar parte en la conducta, y es presentado con un disparador. Cuando estos tres elementos se unen en el mismo momento es cuando una conducta deseada puede ocurrir.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un buen ejemplo es&amp;nbsp;&lt;a href=&quot;https://turbotax.intuit.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;TurboTax&lt;/a&gt;, debatido en el libro&amp;nbsp;&lt;a href=&quot;https://www.manning.com/books/design-for-the-mind&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseño Para La Mente: Siete Principios Psicológicos Del Diseño Persuasivo&lt;/em&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque no lo disfrutemos, estamos altamente&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;motivados&lt;/span&gt;&amp;nbsp;para archivar nuestros impuestos. Sin embargo, el sistema impositivo de Estados Unidos es, como el de cualquier otro país, muy complejo para comprender fácilmente. TurboTax ha aumentado la&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;habilidad&lt;/span&gt;&amp;nbsp;al permitirle a sus usuarios completar más fácilmente sus impuestos al hacer preguntas básicas. Lejos se han ido los largos documentos—y en cambio, TurboTax ha creado un proceso de trabajo donde los usuarios son guiados a través de un proceso paso a paso. El valor final propuesto es la habilidad de fácilmente archivar impuestos de forma electrónica y enviar un pago–el&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;disparador&lt;/span&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;338&quot; src=&quot;https://uploads.toptal.io/blog/image/122715/toptal-blog-image-1491888940365-4cee9db46ec1aee8531fedbec56af35f.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Encontrar situaciones exactamente con la combinación perfecta y la habilidad para un disparador perfecta podría sentirse artificial o no natural. Está bien si uno sobrepasa el otro; un buen ejemplo es twittear—la motivación podría ser baja, pero el disparador podría estar ahí y su habilidad ser muy alta.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;diseñadores&lt;/a&gt;, podemos usar esta teoría para examinar cómo estamos construyendo las motivaciones de nuestros usuarios y la habilidad antes de que les pidamos que se comprometan con una conducta determinada.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Motivación&lt;/span&gt;&amp;nbsp;provee una razón para que alguien se involucre en la tarea.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Habilidad&lt;/span&gt;&amp;nbsp;provee a las personas con la oportunidad de completar la tarea.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Disparadores&lt;/span&gt;&amp;nbsp;ocurren en nuestro ambiente o cerebro y dan pie a que una persona haga algo.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ambas teorías requieren un poco de investigación pero son altamente útiles cuando se diseñan interfaces.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Alternativamente, hay algunas teorías psicológicas más simples que requieren menos investigación y pueden ser implementadas en tus diseños de forma inmediata, como los conceptos de escasez y&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Fear_of_missing_out&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;el miedo de perderse algo&lt;/a&gt;&amp;nbsp;(FOMO).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;318&quot; src=&quot;https://uploads.toptal.io/blog/image/122716/toptal-blog-image-1491888954693-589f9de77b184c83b6e4592945174aea.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Amazon usa el FOMO efectivamente al añadir una nota de urgencia a un producto (resaltado)&lt;/div&gt;
&lt;div class=&quot;embeddable_form-wrapper for-post&quot; data-role=&quot;blog_subscribe&quot; data-view=&quot;blog_subscribe#form&quot; style=&quot;background-color: white; border-radius: 6px; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 30px 0px; vertical-align: baseline;&quot;&gt;
&lt;form action=&quot;https://www.toptal.com/blog/subscription&quot; class=&quot;embeddable_form&quot; data-entity=&quot;blog_subscription&quot; data-remote=&quot;&quot; data-view=&quot;form#form&quot; method=&quot;post&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;div class=&quot;embeddable_form-step is-email_form is-current&quot; style=&quot;border: 0px; box-sizing: border-box; display: flex; flex-wrap: wrap; height: auto; margin: 0px; min-height: 0px; min-width: 0px; overflow: visible; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/div&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;h3 id=&quot;captura-la-atencin-de-tu-audiencia&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Captura La Atención De Tu Audiencia&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por décadas, los psicólogos han estado obsesionados con nuestra decreciente habilidad de prestar atención.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Rastrear eso mide cuándo y por cuánto tiempo un usuario puede encontrarse en un punto y ha estado cerca por un tiempo determinado. Muestra que el período de concentración promedio en internet es menos que un par de segundos—tomamos decisiones inmediatas sobre un sitio y, si no es para nosotros, nos vamos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;393&quot; src=&quot;https://uploads.toptal.io/blog/image/122717/toptal-blog-image-1491888968840-73c3aec3f713459314699ac3e4ff813c.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;a href=&quot;http://www.eyequant.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;EyeQuant&lt;/a&gt;&amp;nbsp;ha tomado esta idea un paso más allá al construir un algoritmo predictivo usando datos de rastreo del movimiento de nuestros ojos. En vez de usar un programa para eso en tu propio sitio, puedes subir un diseño a su sitio web y te dirán cómo las personas perciben y se concentran en tu sitio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando participantes Alemanes, construyeron una base de datos masiva sobre qué atrae la atención del usuario y lo que no—los contrastes de color, por ejemplo, atraen la vista, y así también lo hacen las tipografías y texto en negrita.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Software de seguimiento de ojos puede ser costoso, y en vez de eso, software de análisis como&amp;nbsp;&lt;a href=&quot;https://sumo.com/app/heat-maps&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Sumo Heat Maps&lt;/a&gt;&amp;nbsp;son útiles para mostrar qué y cómo tus visitantes están haciendo click, y qué les llama más la atención. Sin embargo, es esencial recordar que mientras estemos capturando la atención del cerebro, podríamos empujar a los usuarios lejos de algo más importante.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Usando software de seguimiento de ojos o mapas de calor les permite a los diseñadores tener una devolución inmediata y objetiva de sus diseños. Como diseñador, puede servir como validación para tus ideas de UX y proveer datos para tus decisiones de diseño, además de permitirte optimizar dichos diseños al realizar tests inteligentes A/B.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;324&quot; src=&quot;https://uploads.toptal.io/blog/image/122718/toptal-blog-image-1491888982144-e04fe8b4aecb03cf4d89f786673f447b.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; letter-spacing: 0.14px; text-align: center;&quot;&gt;Sumo Heat Map&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;deseo-mimtico&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Deseo Mimético&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Te has dado cuenta que los seres humanos naturalmente imitan los deseos de otros seres humanos? El deseo humano es, de lejos, deseo arbitrario. Esta teoría, originada por Rene Girard, sugiere que si alguien muestra deseo por un objeto, también desearás ese objeto. Los publicistas amarán esto–ya que ha demostrado ser exitosos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tú y yo somos criaturas miméticas.&amp;nbsp;&lt;a href=&quot;https://www.amazon.com/Neuro-Design-Neuromarketing-Engagement-Profitability/dp/0749478888&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Diseño Neuronal&lt;/em&gt;&amp;nbsp;por Darren Bridger&lt;/a&gt;&amp;nbsp;exploró esta teoría y encontró que tenemos un sistema de neuronas espejo. En otras palabras, el sólo ver a alguien hacer algo como recoger un objeto puede causar que tu cerebro copie esa acción.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;304&quot; src=&quot;https://uploads.toptal.io/blog/image/122719/toptal-blog-image-1491888998521-5ca4512992c75f6ad463a9be15a33602.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;La teoría del deseo mimético&lt;/span&gt;&amp;nbsp;significa que queremos algo más si vemos que alguien más lo posee—un diseñador puede emplear esto al usar prueba social.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un ejemplo de la técnica de “prueba de usuario” son los testimoniales. Los testimonios funcionan porque vienen de personas que comparten sus deseos de usuarios y valores. Por ejemplo,&amp;nbsp;&lt;a href=&quot;https://foundrmag.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Foundrmag&lt;/a&gt;&amp;nbsp;no sólo usa la voz del usuario sino que también les muestra rostros, disparando el sistema de neuronas espejo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;492&quot; src=&quot;https://uploads.toptal.io/blog/image/122720/toptal-blog-image-1491889009648-8994f8456992981d9de2ca96b7e72df2.png&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; letter-spacing: 0.14px; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;Foundrmag&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Otra implementación es “prueba social experta”, donde tu producto recibe una “estampa de aprobación” de un experto con credibilidad, como un blogger de industria. Esto puede aparecer como una mención de Twitter, una cita textual de prensa, o inclusive un artículo de blog. Google usa esta técnica en su última campaña para el smartphone&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://madeby.google.com/phone/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Pixel&lt;/a&gt;&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;340&quot; src=&quot;https://uploads.toptal.io/blog/image/122721/toptal-blog-image-1491889043502-5d290eb72285fae205663034123b4462.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;psicologa-en-el-diseo-de-hoy-y-ms-all&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Psicología En El Diseño De Hoy Y Más Allá&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es un momento emocionante para los diseñadores—tenemos los recursos e investigación para apoyar todo nuestro trabajo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tendencias de diseño suelen moverse al tacto, voz, realidad virtual (VR), realidad aumentada (AR), realidad mixta (MR), y el Internet De Las Cosas (IoT); mientras nos movemos hacia estas tecnologías de interacción, las personas requerirán formas más intuitivas de usar sus interfaces.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Veremos muchas nuevas oportunidades de diseño, y de psicología en general tendrá un rol directo y esencial en estos desarrollos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El siguiente gran cambio será cómo interactuemos con nuestros dispositivos día a día—moviéndonos de lo táctil a auriculares que leerán nuestras ondas cerebrales. Esta tecnología está ya disponible y le da a las personas la habilidad de controlar sus dispositivos directamente con su pensamiento.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A medida que nos acercamos a los pensamientos reales de las personas, la psicología en el diseño–y la responsabilidad moral del diseñador–tendrán un rol muy importante e que incluso será aún mayor.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además de usar analíticas, investigación de usuario, mapas de empatía y otros acercamientos para ayudar a tomar decisiones de diseño e iterar en un producto, los diseñadores deberían considerar juntar sus “bolsas de trucos” con los métodos de diseño persuasivo anteriormente mencionados.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;El diseño persuasivo no es malo.&lt;/span&gt;&amp;nbsp;Es una herramienta, y como cualquier herramienta esta puede ser mal usada. Sin embargo, con la investigación correcta y su aplicación bien pensada, puede ser una valiosa incorporación al juego de herramientas de cualquier diseñador.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: helvetica neue, helvetica, arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/designers/resume/bronwen-rees&quot;&gt;Bronwen Rees&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #303030; font-family: helvetica neue, helvetica, arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/designers/ux/dise%C3%B1o-persuasivo-usando-psicolog%C3%ADa-avanzada-efectivamente/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/2565833645920759528/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/07/diseno-persuasivo-usando-psicologia-avanzada-efectivamente.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2565833645920759528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2565833645920759528'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/07/diseno-persuasivo-usando-psicologia-avanzada-efectivamente.html' title='Diseño Persuasivo: Usando Psicología Avanzada Efectivamente'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-4107675414963034398</id><published>2017-07-02T15:34:00.001-03:00</published><updated>2017-07-11T08:54:38.504-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="Onboarding"/><category scheme="http://www.blogger.com/atom/ns#" term="ProjectManagement"/><title type='text'>Guarda la Calma y Transiciona a un Nuevo Equipo de Desarrollo</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es común que un producto de software haga una transición de un equipo de desarrollo a otro en el curso de su vida. Las diferentes etapas del producto pueden requerir un equipo de desarrollo diferente: una consultaría para construir la versión inicial, un&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/freelance&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;desarrollador independiente&lt;/a&gt;&amp;nbsp;para mantenerla, un equipo interno para llevarlo a escala, o un diseñador profesional para hacerlo visualmente llamativo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A pesar de que esto ocurre con frecuencia, muchos fundadores no técnicos y los propietarios de los productos no se encuentran preparados y luchan cuando llega el momento de traer al próximo equipo. Esto a menudo da como resultado una incapacidad para que el nuevo equipo pueda avanzar rápidamente, una pérdida de tiempo, y una frustración que incluye a todos los miembros.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si esto suena como que podrías ser tú, ya sea ahora o en el futuro, entonces deberías estar algo preocupado. Por suerte, voy a guiarte a través de los pasos a seguir para prepararte para esta eventualidad y hacer la transición lo más sencilla posible.&lt;/div&gt;
&lt;h2 id=&quot;pasar-la-antorcha-abordando-un-nuevo-equipo-de-desarrollo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pasar la Antorcha: Abordando un Nuevo Equipo de Desarrollo&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, voy a ofrecerte una lista de verificación que te ayudarán a prepararte para un cambio de este tipo. Comenzarás a conocer tu producto en un nivel más íntimo y obtendrás un mayor control sobre los diversos servicios y tecnologías que conlleva el hacerlo, lo cual te ayudará a abordar un nuevo equipo con tranquilidad relativa y confianza.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Passing the torch to new developers? Make sure the new team doesn’t get burned and you don’t waste time firefighting.&quot; src=&quot;https://uploads.toptal.io/blog/image/92641/toptal-blog-image-1465890854355-a89487c7ae7f26f14fa65e6257f8a140.jpg&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 15.4px; font-style: italic; letter-spacing: 0.14px; text-align: center;&quot;&gt;Al pasar la antorcha a los nuevos desarrolladores, asegúrese de que el nuevo equipo no se queme.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Pero si no estás reemplazando todo el equipo? ¿Deberías tomarte el tiempo de leer esto?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Incluso si algunos miembros del equipo anterior permanecen a bordo, puede ser que no tengan todas las respuestas e información necesaria para una transición sin problemas. A pesar de que pueden proporcionar continuidad y ayuda en el proceso de transferencia de conocimiento del antiguo equipo al nuevo, depender de los miembros del equipo titular no reemplaza el hecho que el dueño del producto se haga cargo y facilite la transferencia. Además, no poder hacerse cargo podría causar fricción entre los nuevos y antiguos miembros del equipo, o responsabilizar a antiguos miembros del equipo con tareas innecesarias, obligándolos a perder demasiado tiempo comunicándose con los nuevos miembros del equipo y resolviendo distintos problemas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, si algunos miembros del equipo se quedan a bordo, pueden ser de gran valor en tus esfuerzos de transición. Consulta con ellos, mantenlos informados y trata de aprovechar su experiencia sin inundarlos con demasiadas tareas relacionadas con la transición. ¡No esperes que ellos hagan todo el trabajo pesado! Ese es tu trabajo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que sin más preámbulos, ¡metámonos de lleno en esto!&lt;/div&gt;
&lt;h2 id=&quot;reunir-documentacin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Reunir Documentación&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A los desarrolladores independientes a menudo se les pide saltar en una base de código existente que nunca han visto antes. Esto es especialmente cierto con respecto a los ingenieros de software de Toptal. Nuestro objetivo es siempre ponernos en marcha tan pronto como sea posible para que podamos empezar a tener un impacto positivo para nuestros clientes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener acceso a una documentación clara e íntegra sobre el proyecto puede acelerar dramáticamente el proceso de incorporación, y ayudar a los desarrolladores a evitar errores que pueden impedir el progreso.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una buena documentación debe cubrir al menos los siguientes temas:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Creación de un entorno de desarrollo&lt;/span&gt;&amp;nbsp;- La primera tarea para cualquier nuevo empleado es instalar la aplicación y ponerla en funcionamiento en sus propias computadoras. El proceso para hacer esto varía entre las tecnologías. En general, requiere tareas tales como obtener el código fuente, la creación de la base de datos, la instalación de dependencias, configurar el entorno con claves de la API y las credenciales, la importación de datos de muestra, y así sucesivamente. Los desarrolladores tienen una buena idea de todo lo relacionado con este proceso dentro de sus respectivos campos, y deben tener la capacidad de ajustar los detalles conformemente.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Ejecutar el conjunto de pruebas automatizadas&lt;/span&gt;&amp;nbsp;- Al ver pasar las pruebas de una aplicación nos aseguramos que todo se ha configurado correctamente y que los próximos cambios no rompen ninguna de las características actuales.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Implementar en los servidores de ensayo y producción&lt;/span&gt;&amp;nbsp;- Actualizar la aplicación en vivo con los nuevos cambios es un proceso altamente estructurado, y el orden de esas operaciones se debe esbozar paso a paso lo más detallado posible.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Cualquier otra información que sea relevante para un nuevo desarrollador a bordo&lt;/span&gt;&amp;nbsp;- Cada aplicación tiene su propio conjunto de peculiaridades. Al escribir estas peculiaridades, se le ahorra a futuros equipos, esfuerzos innecesarios en depurar problemas que el equipo anterior ya ha descubierto cómo solucionar.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Good documentation is the cornerstone of any successful transition. Make sure your new team has everything they need to take over.&quot; src=&quot;https://uploads.toptal.io/blog/image/92642/toptal-blog-image-1465890897901-a0f20a9752818d735201ce6836ee4ef5.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 15.4px; font-style: italic; letter-spacing: 0.14px; text-align: center;&quot;&gt;Una buena documentación es la piedra angular de cualquier transición exitosa. Asegúrate de que tu nuevo equipo tiene todo lo que necesita.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La documentación debe ser escrita por un desarrollador que tenga experiencia de primera mano en la configuración de la aplicación y contribuyendo a la base de códigos.&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¡Antes de que ocurra cualquier transición, solicita que el equipo de desarrollo anterior facilite la transferencia de conocimientos mediante la creación de un recurso que toque los temas anteriores!&lt;/em&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si la escritura no es el punto fuerte del equipo, pídeles que registren una o más capturas de pantalla que demuestren la configuración del entorno de desarrollo, despliegue, etc. Hoy en día incluso hay herramientas como&amp;nbsp;&lt;a href=&quot;https://www.vagrantup.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Vagrant&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;http://www.docker.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Docker&lt;/a&gt;&amp;nbsp;que permiten a entornos de desarrollo completos ser empaquetados y distribuidos a los demás. En esencia, en lugar de dar instrucciones a alguien sobre cómo construir un martillo, entregales el martillo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La prueba de fuego para saber qué tan comprensible y efectiva es la documentación de un proyecto, es la rapidez en que un nuevo desarrollador puede entender la configuración de su entorno de desarrollo y ejecución de su aplicación.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 id=&quot;entiende-tu-producto&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Entiende tu Producto&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener gran documentación no te exime de la necesidad de conocer los fundamentos de la tecnología de tu propio producto. Como propietario de un producto de software, es tu responsabilidad entender tu aplicación lo mejor posible, incluso si no posees muchos conocimientos técnicos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;No technical background? There&#39;s no excuse for failing to properly understand the building blocks of your project. It could cost you dearly.&quot; src=&quot;https://uploads.toptal.io/blog/image/92643/toptal-blog-image-1465890948644-6285ee0738789df28b275257d581c456.jpg&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 15.4px; font-style: italic; letter-spacing: 0.14px; text-align: center;&quot;&gt;¿Sin antecedentes técnicos? No hay excusa para no comprender adecuadamente los componentes básicos de tu proyecto. Te puede costar muy caro.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Qué elementos tecnológicos utiliza tu aplicación?&lt;/span&gt;&amp;nbsp;- Hay muchos marcos de aplicación común para&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Front_and_back_ends&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;el back-end y el front-end&lt;/a&gt;, y cualquier equipo nuevo de desarrollo debe estar familiarizado con los que utiliza tu aplicación. Algunos ejemplos de tecnologías web de back-end son&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ruby_on_Rails&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ruby on Rails&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Node.js&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt;, y [Django](https://en.wikipedia.org/wiki/Django_(web_framework). Algunos ejemplos de tecnologías web front-end son&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/React_(JavaScript_library)&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;React.js&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/AngularJS&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Angular.js&lt;/a&gt;, y&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ember.js&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ember.js&lt;/a&gt;.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Dónde se encuentra alojado?&lt;/span&gt;&amp;nbsp;- Diferentes servidores web tienen diferentes procesos de implementación, que requieren diversos niveles de experiencia. En los últimos años, las tecnologías de nube han creado una serie de nuevas opciones de alojamiento web, y tendrás que identificar cuál de estos, en concreto, estás utilizando y describir por qué lo elegiste sobre los demás.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Cuál es el proceso de desarrollo?&lt;/span&gt;&amp;nbsp;- ¿Tu equipo utiliza una herramienta de gestión de control de fuente específica como [Git](https://en.wikipedia.org/wiki/Git_(software)? Si es así, ¿cuál es el proceso por el cual una nueva característica se ha desarrollado, probado, aprobado, e implementado? El proceso debe ser normalizado,&amp;nbsp;&lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;debidamente documentado&lt;/a&gt;&amp;nbsp;y fácil de reproducir por los nuevos integrantes.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿Qué servicios de terceros utiliza tu aplicación?&lt;/span&gt;&amp;nbsp;- Algunas aplicaciones se basan en servicios de terceros como&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Shopify&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shopify&lt;/a&gt;. Por favor, ten en cuenta que la dependencia de los servicios de terceros está aumentando gradualmente, e incluso si actualmente no utilizas ningún servicio adicional, tu proyecto puede decidir emplear un servicio de terceros más adelante.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;¿En qué plataformas se puede ejecutar tu aplicación?&lt;/span&gt;&amp;nbsp;- ¿Tu aplicación es una aplicación de escritorio, aplicación web, sitios web responsive para teléfonos móviles, una aplicación nativa de iOS, aplicación nativa de Android, o alguna otra? ¿Se ejecuta en varias plataformas diferentes? ¿Cuál plataforma es tu prioridad en un momento dado? ¿En cuál plataforma es tu producto más fuerte o más débil? Asegúrate de conocer todos los detalles de las plataformas actuales de tu aplicación, e incluso a cuáles se puede ampliar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;toma-posesin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Toma Posesión&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El proceso de desarrollo de software de hoy en día utiliza una gran cantidad de servicios de terceros y herramientas. Ya sea que lo sepa o no, tu aplicación no es una excepción.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Durante el trascurso de desarrollo, tu equipo anterior puede haberse registrado o suscrito a tu nombre, o incluso utilizado sus propias cuentas para obtener acceso a los servicios que se necesitaban. La transición a un nuevo equipo significa que debes tomar posesión y estar en control de cada uno de los servicios y herramientas en las cuales tu aplicación está basada, para que así puedas permitir el acceso a tu nuevo equipo, sin necesidad de pasar por un intermediario o perseguir a los desarrolladores originales.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La siguiente lista muestra las diferentes herramientas o servicios externos de los que tu aplicación podría sacar provecho:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Gestión de Fuente de Control&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://bitbucket.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Bitbucket&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://about.gitlab.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Gitlab&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Alojamiento Web&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://www.heroku.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Heroku&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.engineyard.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;EngineYard&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.digitalocean.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Digital Ocean&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.bluehost.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Bluehost&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://aws.amazon.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Amazon Web Services&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Alojamiento de archivos&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://aws.amazon.com/s3&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Amazon Web Services (S3)&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Proveedor de DNS&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://www.godaddy.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;GoDaddy&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://dnsimple.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;DNSimple&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.hover.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Hover&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Servicios de Desarrollo&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://newrelic.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;NewRelic&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.filestack.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;FileStack&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://segment.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Segment&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://bugsnag.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Bugsnag&lt;/a&gt;&amp;nbsp;(y muchos otros)&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Servicios de Pago&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://stripe.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Stripe&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.braintreepayments.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Braintree&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.paypal.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;PayPal&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Servicios de blog&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://wordpress.com/wp-login.php&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;WordPress&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.tumblr.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Tumblr&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://ghost.org/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Ghost&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Soluciones de comercio electrónico&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://www.shopify.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Shopify&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.squarespace.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Squarespace&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Analítica / Seguimiento&lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;http://www.google.com/analytics&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Google Analytics&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://mixpanel.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Mixpanel&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.kissmetrics.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Kissmetrics&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Email Marketing:&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;http://mailchimp.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;MailChimp&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://www.constantcontact.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Constant Contact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pregúntale a tu equipo de desarrollo saliente cuáles son aplicables. Para cualquiera de los servicios que son de propiedad del equipo de desarrollo, pídeles que te transfieran la propiedad. Si eso no es posible, entonces pídeles ayuda para crear una nueva cuenta y asegúrate de que la aplicación utiliza tu cuenta en lugar de la de ellos. Esto no debería requerir nada más que cambiar algunos ajustes de configuración para tu aplicación. No hace falta decir que debes asegurarte de que cada contrato de desarrollo protege tus intereses desde el primer día y garantiza una transición sin problemas, sin importar la situación.&lt;/div&gt;
&lt;h2 id=&quot;autoriza-el-acceso&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Autoriza el Acceso&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con una sólida comprensión del ecosistema de tu aplicación y la propiedad de las diversas herramientas y servicios que utiliza, ahora puedes dar acceso completo al equipo entrante o miembro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayoría de los servicios te permitirá añadir un colaborador a tu cuenta y otorgarle un determinado nivel de acceso.&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Está bien ser conservador en este caso, muchos fundadores&lt;/em&gt;, especialmente los empresarios individuales, prefieren dar a sus desarrolladores acceso de administrador a sus servicios y hacer que manejen todo. Esto tiene el efecto secundario de mantenerte fuera del circuito, que como hemos aprendido, puede hacer más difícil la transición en el futuro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Deberías darle a tus desarrolladores privilegios completos de administrador? Es tu decisión, a la mayoría de las personas no parece importarles el uso de este enfoque. Sin embargo, siempre se debe planificar a futuro y asegurarse de que tu decisión no afecte negativamente a un nuevo equipo de desarrollo. De no hacerlo en las primeras etapas del proyecto puede tener consecuencias molestas en el futuro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #3863a0; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #3863a0; letter-spacing: 0.14px;&quot;&gt;Gestionando el traspaso&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora que has cubierto todas las bases, necesitas gestionar el traspaso de un equipo a otro. Estos son algunos consejos básicos para enfrentar tanto al equipo entrante como al de salida.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Make sure you properly manage the technical and personal aspects of your project handoff. Make your new team feel at home and don’t antagonize your old team.&quot; src=&quot;https://uploads.toptal.io/blog/image/92644/toptal-blog-image-1465890977224-b2d6ff246961e3f1101fe4e1c40c94f4.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 15.4px; font-style: italic; letter-spacing: 0.14px; text-align: center;&quot;&gt;Asegúrate de administrar adecuadamente los aspectos técnicos y personales de tu traspaso de proyecto. Permite que tu nuevo equipo se sienta como en casa.&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;equipo-entrante&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Equipo Entrante&lt;/h3&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Establece expectativas&lt;/span&gt;&amp;nbsp;- El nuevo equipo debe saber cuáles son tus objetivos más importantes para que puedan centrarse en la dirección correcta. La gestión de tus propias expectativas sobre lo que el nuevo equipo puede lograr de inmediato es igualmente importante.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Realiza visitas de control a menudo&lt;/span&gt;&amp;nbsp;- No dejes al nuevo equipo a su suerte. Debes hacer visitas de control con frecuencia para asegurarte de que tienen todo lo que necesitan, y que no se sientan como que tienen que valerse por sí mismos. Trata de hacer esto sin llegar a hacer micro gestión. Asegúrate de que sepan que estás para apoyar y ayudar si lo necesitan, pero no pongas presión innecesaria sobre ellos.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Sé paciente&lt;/span&gt;&amp;nbsp;- Se necesita tiempo para que los desarrolladores puedan adaptarse a una nueva base de códigos. Entiende que habrá un poco de tiempo de aprendizaje antes de que el nuevo equipo pueda igualar el ritmo del anterior.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;equipo-saliente&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Equipo Saliente&lt;/h3&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Recolecta todo el código en circulación&lt;/span&gt;&amp;nbsp;- Asegúrate de que todo el código fuente se haya registrado en el repositorio principal, y que sabes el estado de lo que se ha desplegado y lo que no. El nuevo equipo tendrá que saber exactamente dónde retomar y empezar a trabajar. Yo mismo he experimentado una situación en la que seguí el trabajo de un equipo que había desplegado código sin ponerlo en el repositorio principal. Esto llevó a que se crearan bugs, la duplicación de trabajo y dolores de cabeza que podrían haberse evitado fácilmente si el equipo saliente hubiera dejado el código fuente en un estado coherente.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Actualiza el nivel de acceso&lt;/span&gt;&amp;nbsp;- Si se separaron en buenos términos, es posible que desees mantenerlos con acceso a tu código y/o despliegue. Muchos equipos están dispuestos a ayudar durante la fase de transición, hasta que el nuevo equipo pueda asumir plenamente. Si no, considera cambiar o revocar el acceso para evitar cualquier problema accidental o conflictos con el nuevo equipo.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Dales las gracias por su trabajo&lt;/span&gt;&amp;nbsp;- Las transiciones pueden ser agitadas. Mientras estás ocupado con el nuevo equipo, no te olvides de agradecer a tu equipo saliente por su contribución al proyecto.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Conclusión&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cualquier transición en la vida puede dar miedo, lo cual trae la incertidumbre de si funcionará o no, el miedo a lo desconocido, y así sucesivamente. La transición a un nuevo equipo de desarrollo no es diferente, pero puedes y debes tomar medidas para que sea más fácil. En la mayoría de los casos, sólo se requiere un poco de planificación a largo plazo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tener un mayor conocimiento técnico y no técnico de tu producto de software, el proceso de desarrollo, y todas las cosas que entraron en el proceso ayudará a que cualquier transición de un equipo a otro, sea tan tranquila y sin dolor como sea posible.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo mejor de todo: ¡Tu nuevo equipo te respetará y dará las gracias por estar preparado! Es probable que les ahorre tiempo y esfuerzo, lo que también significa que vas a ahorrar dinero. Además, cuanto más pronto el nuevo equipo se dé cuenta de la insistencia en un alto nivel profesional, mejor. Lo más probable es que continúen la implementación de estas prácticas una vez tomen el control del proyecto, por lo que la próxima transición será también sin problemas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así que vamos a revisar los puntos clave que deben preceder a cualquier transferencia de propiedad de tu producto de software:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Recoger o crear la mayor documentación posible acerca de tu aplicación, el entorno de desarrollo y el proceso de despliegue.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Conocer tu producto dentro y por fuera.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Mantener el control de todos los servicios y dependencias de terceros de tu aplicación, y tener los nombres de usuario y contraseñas para todo.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Esté preparado para darle a tu nuevo equipo acceso a todo lo que necesitan para empezar a funcionar.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Sé proactivo y no dejes nada al azar, o para el equipo de desarrollo de salida.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;Por: &lt;a href=&quot;https://www.toptal.com/resume/carlos-ramirez-iii&quot;&gt;Carlos Ramirez III&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/software/guarda-la-calma-y-transiciona-a-un-nuevo-equipo-de-desarrollo/es&quot; style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, helvetica, arial, sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 15.4px; font-style: italic; letter-spacing: 0.14px; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/4107675414963034398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/07/guarda-la-calma-y-transiciona-un-nuevo-equipo-de-desarrollo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4107675414963034398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4107675414963034398'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/07/guarda-la-calma-y-transiciona-un-nuevo-equipo-de-desarrollo.html' title='Guarda la Calma y Transiciona a un Nuevo Equipo de Desarrollo'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-2353575465966642738</id><published>2017-06-24T21:59:00.001-03:00</published><updated>2017-06-24T21:59:49.097-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Business"/><category scheme="http://www.blogger.com/atom/ns#" term="Freemium"/><category scheme="http://www.blogger.com/atom/ns#" term="NetworkEffects"/><category scheme="http://www.blogger.com/atom/ns#" term="Pricing"/><category scheme="http://www.blogger.com/atom/ns#" term="SaaS"/><category scheme="http://www.blogger.com/atom/ns#" term="Software-as-a-Service"/><title type='text'>SaaS - Tácticas de Fijación de Precios Que Pueden Catapultar Tu Negocio</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La fijación de precios es una de las palancas financieras más importantes que tienen las compañías a su disposición para influenciar el éxito financiero de su negocio. Sin embargo, no es una tarea fácil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero, la fijación de precios afecta a múltiples inversionistas, dentro y fuera de la compañía. Experimentar con la fijación de precios no es una tarea que se deba tomar con ligereza. Segundo, encontrar el precio correcto es notoriamente difícil. Las preferencias de los clientes son difíciles de estimar con anticipación, e internamente, puede ser difícil anticipar los efectos de los cambios de precio en el desempeño financiero de una compañía. Y finalmente, por supuesto, la fijación de precios no sucede en un espacio vacío. En cualquier mercado competitivo, el cambio de precios puede llevar, a menudo, a acciones que podrían cancelar el efecto deseado del ajuste de precios.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con esto en mente, las técnicas y los métodos necesarios para estos retos son extremadamente útiles.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En mi experiencia, habiendo co-fundado una empresa de herramientas de desarrolladores que usa el modelo SaaS, he aprendido a apreciar el modelo de negocios SaaS como algo, entre otras cosas, que muestra buena relación con los precios. Las características intrínsecas de SaaS y su mecanismo de entrega tiene ramificaciones importantes relacionadas a la fijación de precios, lo cual, como resultado, puede ser muy útil en el manejo financiero de tu compañía.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En este artículo, exploro en más detalle lo que son y cómo pueden beneficiar tu negocio desde un análisis financiero y un punto de vista administrativo.&lt;/div&gt;
&lt;h2 id=&quot;qu-es-saas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es SaaS?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Software como Servicio (SaaS) es un&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Software_as_a_service&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;modelo de entrega y licencia software&lt;/a&gt;&amp;nbsp;en el cual el software tiene licencia de mano de una tercera parte y es entregado a los clientes a través de la internet. Comparado con modelos software alojados localmente, los clientes SaaS no tienen que instalar el software, actualizarlo, mantenerlo e integrarlo. La gran mayoría de los aspectos técnicos están “bajo control” gracias al proveedor SaaS, para que el cliente pueda empezar a usar el producto SaaS con poco esfuerzo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las ramificaciones y beneficios de SaaS versus otros tipos de servicios son expuestos gráficamente en la gráfica #1 abajo. Como puedes ver, con software tradicionales&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;on-premises&lt;/em&gt;, el cliente tiene que manejar la mayoría de las actividades relacionadas a la instalación y ejecución del software. Del otro lado del espectro, SaaS se encarga de todo esto del lado del proveedor del software. Hay sombras dentro; por ejemplo,&amp;nbsp;&lt;a href=&quot;http://searchcloudcomputing.techtarget.com/definition/Infrastructure-as-a-Service-IaaS&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;la Infraestructura como servicio&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;http://searchcloudcomputing.techtarget.com/definition/Platform-as-a-Service-PaaS&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;la Plataforma como Servicio&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;438&quot; src=&quot;https://uploads.toptal.io/blog/image/122587/toptal-blog-image-1490281466568-8ad0da1d275f4e97b8b9d3ac9b5e810d.png&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los pros y contras de SaaS son muy directos. Por una parte, SaaS es mucho más fácil de instalar y ejecutar. No requiere servidores locales, almacenamiento, administración, etc. Por otra parte, no permite el mismo nivel de personalización que un software&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;on-premises&lt;/em&gt;&amp;nbsp;puede proporcionar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El cambio de un software alojado localmente a SaaS se ha estado dando por un tiempo y es parte de un cambio más general en la industria IT a aplicaciones basadas en la nube. Según&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;FTI Consulting&lt;/em&gt;,&amp;nbsp;&lt;a href=&quot;http://www.fticonsulting.com/~/media/Files/us-files/insights/white-papers/saas-adapt-or-lose-out.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;69% de los negocios&lt;/a&gt;hoy en día usan al menos una aplicación basada en la nube.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El cambio para SaaS desde servicios&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;on-premises&lt;/em&gt;&amp;nbsp;pueden ser vistos muy bien cuando observamos Adobe, uno de los jugadores mejor conocidos de la industria. Como se puede ver en la gráfica #2,&amp;nbsp;&lt;a href=&quot;http://tomtunguz.com/adobe-saas-growth/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;cortesía de Tom Tunguz&lt;/a&gt;, las ganancias del producto de Adobe que no es parte de SaaS, alcanzó 3.4 billones de dólares en 2011 y se redujo a 1.6 billones de dólares en solo tres años. Una reducción tan grande en ganancias, normalmente, traería ramificaciones pero Adobe también ha estado ofreciendo una variedad de productos SaaS, lo cual ha incrementado cinco veces más las ganancias, de 0.45 billones de dólares en 2011 a 2.1 billones en 2014. La mezcla en los cambios de productos de Adobe es indicativo del cambio general de la industria al alejarse de los software alojados localmente y dirigirse a las provisiones de software basados en la nube, como SaaS.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;497&quot; src=&quot;https://uploads.toptal.io/blog/image/122582/toptal-blog-image-1490281168583-f695a7d2138d132d269ebc2c29479391.png&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todo indica que esta tendencia tiene muchas probabilidades de continuar.&amp;nbsp;&lt;a href=&quot;http://www.gartner.com/newsroom/id/3384720&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Gartner estima&lt;/a&gt;&amp;nbsp;que el software de aplicación fue un mercado de 144 billones de dólares en 2016 y que, para 2020, los negocios se estarán cambiando a software basados en la nube, al ritmo de 216 billones de dólares al año.&lt;/div&gt;
&lt;h2 id=&quot;saas-es-un-modelo-de-negocios-que-se-relaciona-bien-con-la-fijacin-de-precios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
SaaS es un Modelo de Negocios que se Relaciona Bien con la Fijación de Precios&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como ya lo mencioné, las razones para este cambio a aplicaciones basadas en la nube son variadas. Los costos más bajos de instalación y mantenimiento son, por supuesto, un factor importante. Sin embargo, un beneficio importante que he descubierto en las aplicaciones basadas en SaaS es que dan mucha importancia a la fijación de precios. Así, gana tanto el cliente como los negocios que proporcionan el servicio y creo que juega un papel importante al momento de explicar el cambio de industria de manera general.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En particular, hay muchas características operacionales intrínsecas de SaaS como modelo de negocio, que por su parte tiene implicaciones sobre la fijación de precios y específicamente, crea y magnifica el número de impulsos de fijación de precios que los negocios tienen a su disposición. En particular, resalto cuatro beneficios relacionados con fijación de precios de los productos SaaS:&lt;/div&gt;
&lt;ol style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Flexibilidad:&lt;/span&gt;&amp;nbsp;Por la naturaleza basada en la web y naturaleza de tiempo real del mecanismo de entrega, los productos SaaS son muy flexibles y permiten una iteración constante. Esto afecta la fijación de precios también, ya que los cambios en la fijación de precios puede ser relativamente fácil de implementar y el impacto de estos cambios se puede medir inmediatamente. Se puede seguir iterando hasta que se alcance el precio deseado.&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Seguimiento de Uso en Tiempo Real:&lt;/span&gt;&amp;nbsp;Ya que los productos SaaS están en la nube, el uso del software por un cliente es seguido en tiempo real del lado del proveedor del servicio. Esto significa que las compañías SaaS tienen más capacidad de cobrar en base a cada usuario que las compañías tradicionales on-premises. Esto tiene varios beneficios detallados abajo.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Efectos de Red:&lt;/span&gt;&amp;nbsp;El mecanismo de entrega e implementación tranquila de los productos SaaS actúa como un activador de los efectos de red. Esto tiene ramificaciones importantes en la fijación de precios, lo cual hace más fácil crear y cambiar por estos efectos de red, y así, en teoría, maximizar la monetización.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: decimal; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemium:&lt;/span&gt;&amp;nbsp;Debido al costo de casi cero de los costos de margen de entrega y alojamiento de productos, las compañías SaaS son más capaces de permitirle a los clientes usar ciertos productos de manera gratuita por meses o hasta años, hasta que actualicen o cancelen el servicio.&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemium&lt;/em&gt;&amp;nbsp;previene que la fijación de precios del producto llegue a ser una barrera para los usuarios que prueban o adoptan el producto, y así se aumenta el número de posibles clientes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;beneficio-no-1-flexibilidad-de-fijacin-de-precios&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Beneficio No. 1: Flexibilidad de Fijación de Precios&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El primer y sin duda más importante beneficio financiero de adoptar un modelo SaaS es la flexibilidad inherente que ofrece el modelo. En particular, la flexibilidad se refiere a los siguientes atributos:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Iteración Rápida:&lt;/span&gt;&amp;nbsp;Gracias al mecanismo de entrega, SaaS te permite iterar rápidamente en los cambios de fijación de precios para que puedas hacer pruebas de puntos de precio y paquetes hasta que llegues a la mezcla óptima.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Fijación de Precios por Parte:&lt;/span&gt;&amp;nbsp;SaaS se presta muy bien para una fijación de precios por parte, lo cual significa que tiene la habilidad de poner precios a diferentes ofertas de productos, a diferencia de dirigirse a sub-segmentos de múltiples clientes.&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Sin Intermediarios:&lt;/span&gt;&amp;nbsp;SaaS es entregado directamente al cliente, sin pasar por intermediarios. Esto remueve un inversionista clave de la ecuación y le regresa a la compañía una gran flexibilidad para probar diferentes puntos de fijación de precios y paquetes.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un ejemplo práctico de esto se puede observar al analizar la evaluación de Zendesk en fijación de precios. Zendesk es una exitosa compañía software de servicio al consumidor, la cual genera&amp;nbsp;&lt;a href=&quot;https://finance.yahoo.com/quote/ZEN/financials?p=ZEN&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;más de 300 millones de dólares en ganancias anuales&lt;/a&gt;. Ofrece diferentes características del mismo producto a diferentes segmentos del cliente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como se ve en el ejemplo de abajo, en enero de 2015, Zendesk ofrecía cinco planes diferentes para cinco segmentos diferentes. Su plan más económico estuvo disponible a 1 dólar por agente por mes, mientras que el más caro era 195 dólares por agente por mes. También dirigió a los usuarios hacia el plan “Plus” al resaltarlo en verde.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 2: Opciones de Fijación de Precios de Zendesk en Enero de 2015&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 2&quot; height=&quot;290&quot; src=&quot;https://uploads.toptal.io/blog/image/122573/toptal-blog-image-1490241462509-02455a5d183492905f6993f0816ad563.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-size: 13.44px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Source:&amp;nbsp;&lt;a href=&quot;http://web.archive.org/web/20150104101615/http:/www.zendesk.com/product/pricing&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Archive.org&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En enero, 2016, Zendesk debe haber sentido que había todavía algo que mejorar en la fijación de precios; ellos disminuyeron el número total de planes de cinco a cuatro. También hicieron cambios en la fijación de precios de planes, donde el plan menos costoso aumentó de 1 a 5 dólares por agente por mes, mientras el más costoso disminuyó de 199 a 99 dólares por agente por mes. Los nombres de los planes también fueron cambiados (ej., “Starter” a “Essential”) y los usuarios fueron dirigidos al plan “Professional” con una técnica de resaltado más ligera.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 3: Opciones de Fijación de Precios de Zendesk en Enero de 2016&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 3&quot; height=&quot;347&quot; src=&quot;https://uploads.toptal.io/blog/image/122574/toptal-blog-image-1490241496798-56385915d461cd49f7e52d7b1b7d3142.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-size: 13.44px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Source:&amp;nbsp;&lt;a href=&quot;http://web.archive.org/web/20160105085452/https:/www.zendesk.com/product/pricing&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Archive.org&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En 2017, la fijación de precios cambió nuevamente y el número de planes aumentó de nuevo a cinco. Mientras que el plan menos costoso se mantuvo en 5 dólares por agente por mes, su plan más costoso aumentó de 99 a 199 dólares por agente por mes. Al remover lo resaltado, Zendesk dejó de dirigir a las personas a cualquier plan.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Muestra 4: Opciones de Fijación de Precios de Zendesk en Enero de 2017&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Muestra 4&quot; height=&quot;352&quot; src=&quot;https://uploads.toptal.io/blog/image/122575/toptal-blog-image-1490241521649-801e3376fb2e5a424a8d194147161e24.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-size: 13.44px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Source:&amp;nbsp;&lt;a href=&quot;https://www.zendesk.com/product/pricing/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Zendesk Pricing Page&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Zendesk, desafortunadamente, no revela los efectos específicos que los cambios de fijación de precios han tenido. Sin embargo, el punto más general que muestra lo útil de la flexibilidad se resume muy bien&amp;nbsp;&lt;a href=&quot;https://www.cobloom.com/blog/saas-pricing-models#&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;en este post&lt;/a&gt;: “Encontrar el balance correcto entre valor y ganancia - tu habilidad para ayudar a los clientes y ser compensados de manera justa por esa ayuda - te llevará al éxito o al fracaso […] empresa.” Sin duda, los cambios de Zendesk son una reflexión de este punto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para resumir, SaaS, como mecanismo de entrega, permite una capacidad más grande de flexibilidad e iteración en cuanto a fijación de precios. Como&amp;nbsp;&lt;a href=&quot;http://sixteenventures.com/pricing-strategy&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;lo dice&lt;/a&gt;&amp;nbsp;Lincoln Murphy de Sixteen Ventures, “La fijación de precios (como casi todo) nunca es una situación donde se instala y se olvida,” así que la habilidad de iterar, probar, aprender y mejorar es una característica muy útil del modelo de negocios SaaS.&lt;/div&gt;
&lt;h3 id=&quot;anlisis-de-cohorte&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Análisis de Cohorte&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si los resultados de los cambios de fijación de precios no pueden ser medidos de una manera definitiva, no tiene sentido iterar. Así que es importante instalar una colección de data apropiada, al igual que procesos de medidas y herramientas desde el comienzo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una de las maneras de medir los resultados es a través de un análisis de cohorte. En este análisis, se coloca a los clientes en diferentes&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;cohortes&lt;/span&gt;&amp;nbsp;(grupos) basados en una característica, normalmente un periodo de tiempo seleccionado. Todos los nuevos clientes se pueden dividir en cohortes basadas en la fecha en que se hicieron clientes. Por ejemplo, puede haber diferentes cohortes como clientes que se unen en enero, febrero, marzo y etc.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;430&quot; src=&quot;https://uploads.toptal.io/blog/image/122583/toptal-blog-image-1490281222317-7d470620f6e80dc6a546b9be8eaca253.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las herramientas analíticas como&amp;nbsp;&lt;a href=&quot;https://mixpanel.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Mixpanel&lt;/a&gt;&amp;nbsp;ofrece análisis de cohorte basados en la data que recolectan. Como se ve en el ejemplo de abajo (Tabla 1), la retención está siendo analizada para medir cuántas personas siguen usando un producto ficticio a lo largo del tiempo. Para entrar en detalles, la cohorte del 27 de abril de 2014 tiene una tasa de retención de 23% en la semana 6, lo cual quiere decir que el 23% de las personas que se inscribieron en la semana del 27 de abril de 2014 siguen usando el producto en la 6ta semana. La cohorte del 13 de julio de 2014 tiene una tasa de retención de 9.6% en la semana 6, esto indica una baja significativa en las tasas de retención, lo cual a su vez significa un gran problema con esta cohorte o una acción tomada dentro de ese periodo de tiempo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El aspecto crítico del análisis de cohorte es la disponibilidad de data, así que es crucial que la data que será la base del análisis de cohorte sea recolectada correctamente y disponible cuando sea necesario.&lt;/div&gt;
&lt;h3 id=&quot;menos-es-ms&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Menos es Más&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En un estudio bien conocido realizado por los psicólogos Sheena Lyengar y Maek Lepper, se mostró que las opciones múltiples pueden producir “parálisis de elección.” Como se explica en este&amp;nbsp;&lt;a href=&quot;https://hbr.org/2006/06/more-isnt-always-better&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;artículo HBR&lt;/a&gt;:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“[…] consumidores en un supermercado importante vieron una mesa de muestra con 24 variedades de mermelada gourmet. Aquellos que probaron las muestras recibieron un cupón de 1 dólar en cualquiera de las mermeladas. En un día diferente, los consumidores vieron una mesa similar, excepto que solo se mostraban seis variedades de la mermelada. La muestra más grande atraía más interés que la pequeña. Pero al momento de comprar, las personas que vieron la muestra grande tenían posibilidad 1 de 10 de comprar, a diferencia de las personas que vieron la muestra más pequeña.”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Debido a la fijación de precios tan distante, la ausencia de intermediarios y las capacidades de iteración de SaaS, un producto puede ser ofrecido en muchas formas diferentes. Sin embargo, se debe tener cuidado de no crear una instancia de parálisis de opciones; por esto, es indispensable, de igual manera, acercarse a la fijación de precios desde una perspectiva de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un ejemplo práctico de esto se puede ver con Hubspot.&amp;nbsp;&lt;a href=&quot;https://www.hubspot.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Hubspot&lt;/a&gt;&amp;nbsp;es una plataforma de administración de mercadeo y ventas que automatiza y hace que el mercadeo por correo electrónico, la analítica y el SEO sean más efectivos.&amp;nbsp;&lt;a href=&quot;http://www.priceintelligently.com/blog/the-five-best-saas-pricing-pages&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;PriceIntellingently&lt;/a&gt;&amp;nbsp;hace un buen trabajo explicando cómo, a pesar de que la fijación de precios de Hubspot se puede mostrar en una variedad de formas (ej., una barra en movimiento que muestra el aumento en la fijación de precios mientras aumenta el número de contactos), solo tres planes diferentes fueron creados basados en tres diferentes valores métricos. Esto hace que estos planes sean más fáciles de seguir y entender.&lt;/div&gt;
&lt;h2 id=&quot;beneficio-no-2-fijacin-de-precios-por-uso&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Beneficio No. 2: Fijación de Precios “Por-uso”&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El segundo beneficio clave de los productos SaaS es que por el mecanismo de entrega, SaaS se presta muy bien para una fijación de precios por-uso. Estos se dan porque el uso del cliente se puede seguir y medir apropiadamente, ya que el software se ejecuta desde el lado del proveedor del servicio.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Fijación de precios por-uso es una herramienta de fijación de precios muy útil, por los siguientes motivos:&lt;/div&gt;
&lt;h4 id=&quot;crea-una-barrera-ms-baja-para-la-adopcin-del-cliente&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Crea una barrera más baja para la adopción del cliente.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los usuarios enfrentan una barrera financiera directa más baja al inscribirse en el servicio, ya que saben que sus gastos estarán nivelados con su uso. En contraste, los software tradicionales&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;on-premises&lt;/em&gt;&amp;nbsp;normalmente cobra una tarifa estándar basada en una suposición de uso estimado. Este estimado no necesariamente se relaciona con las necesidades del cliente en cuestión.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como lo señaló Reason Street en&amp;nbsp;&lt;a href=&quot;https://www.reasonstreet.co/business-model-pay-per-use/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;este artículo&lt;/a&gt;, “Por el bajo o ningún costo de las tarifas de las nuevas empresas, los clientes de empresas que normalmente se toman de seis meses a un año para tomar una decisión sobre el software de la empresa, a menudo se saltan esta decisión y simplemente empiezan a probar el servicio. Los clientes después aumentan su uso basándose en la necesidad real de la empresa (Pagando por adelantado las licencias de tarifas por puesto).”&lt;/div&gt;
&lt;h4 id=&quot;los-costos-se-pueden-alinear-mejor-con-las-ganancias&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los Costos se Pueden Alinear Mejor con Las Ganancias.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La fijación de precios por uso también le permite al proveedor del servicio alinear mejor sus propios costos con sus ganancias, ya que la ganancia que recibe está atada a los costos, ésta se contrae para cobrar el servicio. Como&amp;nbsp;&lt;a href=&quot;https://www.reasonstreet.co/business-model-pay-per-use/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;señala&lt;/a&gt;, Reason Street “Para las nuevas empresas software, particularmente en el sector SaaS, una vez que es construido el producto viable mínimo inicial, las empresas pueden escalar ganancias más cerca a la escala en costos requeridos para hacer entrega del servicio. Algunas empresas SaaS prefieren pago-por-usuario, porque la relación de valor se hace muy clara para el cliente, y pueden priorizar el desarrollo de características y servicio basado en las necesidades expresadas por el cliente.”&lt;/div&gt;
&lt;h4 id=&quot;la-fijacin-de-precios-por-uso-lleva-a-una-mayor-adhesin&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La fijación de precios por-uso lleva a una mayor adhesión.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La fijación de precios por-uso normalmente lleva a una adhesión mayor por parte de los clientes y esto tiene dos razones importantes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero, ya que los gastos del cliente se extienden por un gran periodo de tiempo, sus costos en cualquier momento serán pequeños comparados con otros costos por los que pasan sus negocios. Como resultado, pueden no estar tentados a disminuir estos. Por supuesto, si el cliente viera estos costos por completo (o hasta un periodo de tiempo más largo) podría notar que el costo total es mucho mayor, pero la psicología humana no siempre sigue la lógica.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Segundo, dado que la fijación de precios por-uso lleva a barreras de adopción más bajas (como se explica abajo), los clientes tienden a darle una oportunidad de prueba al servicio. Mientras continúan usando el servicio, el software puede ser puesto a un lado en los procesos diarios de la compañía, haciendo más difícil y costoso cambiar proveedores. Andreessen Horowitz resume este punto y los beneficios relacionados&amp;nbsp;&lt;a href=&quot;http://a16z.com/2014/05/13/understanding-saas-valuation-primer/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;muy bien&lt;/a&gt;:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Una vez una empresa SaaS ha generado suficiente dinero por su base de clientes instalada para cubrir el costo de adquirir nuevos clientes, esos clientes se quedan por mucho tiempo. Estos negocios son inherentemente adheridos porque el cliente ha, esencialmente, subcontratado al ejecutar su software al vendedor […]&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Es muy difícil cambiar vendedores SaaS una vez que están dentro del ritmo de trabajo del negocio. Los clientes SaaS, por definición, tomaron la decisión de tener un vendedor externo para manejar la aplicación. En el modelo de licencia perpetua, el equipo interno IT manejó todas las instancias software y así podría tomar el costo interno para poder cambiar de vendedores si así lo quieren.”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4 id=&quot;la-fijacin-de-precios-por-uso-permite-la-fijacin-de-precios-por-suscripcin-la-cual-ayuda-con-el-plan-financiero&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La fijación de precios por-uso permite la fijación de precios por suscripción, la cual ayuda con el plan financiero.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para estar claros, la fijación de precios por-uso no siempre es buena. Hay un intercambio de flujo de efectivo muy claro, que viene de un cambio de licencia directa a la fijación de precios por-uso. Este efecto&amp;nbsp;&lt;a href=&quot;http://a16z.com/2014/05/13/understanding-saas-valuation-primer/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;se ilustra muy bien&lt;/a&gt;&amp;nbsp;nuevamente, por Andreessen Horowitz:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“En el mundo software tradicional, las empresas como Oracle y Sap hacen la mayor parte de su negocio al vender una licencia perpetua para su software y luego venden actualizaciones para éste. En este modelo, los clientes pagan por la licencia software por adelantado y luego, normalmente, pagan una tarifa de mantenimiento anual (alrededor de 15-20% de la tarifa de licencia original). Aquellos de nosotros que venimos de este mundo llamaríamos a esta transacción una “dineroctomía”: El cliente pregunta cuánto cuesta el software y luego el vendedor pregunta al cliente cuál es su presupuesto; milagrosamente, el costo iguala el presupuesto y, voila, la operación de dineroctomía se completa.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto es perfecto para compañías de software antiguo y es excelente para la contaduría de estados de cuenta de ganancia tradicional. ¿Por qué? Porque el tiempo de ganancias y gastos están perfectamente alineados. Todos los costos de tarifa de licencia van directamente a la línea de ganancias y todos los gastos asociados se reflejan igualmente, así que 1 millón de dólares en tarifas de licencias vendidas en el trimestre, se muestra como 1 millón de dólares en ganancias en el trimestre. Así es como las compañías software pueden obtener la rentabilidad de la declaración de ingresos en los inicios de ciclo de vida.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora, compara eso con lo que pasa con SaaS. En vez de comprar una licencia perpetua para el software, el cliente está accediendo a usar el software de manera continua, a través de un modelo basado en servicio — por ello el término “software como servicio”. Aunque un cliente, normalmente, firma un contrato por 12-24 meses, la empresa no puede reconocer esos 12-24 meses de tarifas como ganancias por adelantado. Por el contrario, las reglas de contaduría requieren que la empresa reconozca ganancias en el momento en que se entrega el servicio software (así que para un contrato de 12 meses, la ganancia cada mes a 1/12 del valor total del contrato).&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Todavía la empresa causó que casi todos sus gastos pudieran adquirir a ese cliente desde el comienzo — ventas y mercadeo, desarrollo y mantenimiento del software, alojar infraestructura — por adelantado. Muchos de estos gastos por adelantado no tienen un reconocimiento a lo largo del tiempo en la declaración de ingresos y ahí está el problema: El tiempo de ganancia y gastos están mal alineados.”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Este efecto se muestra gráficamente en las gráficas 3 y 4 debajo:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;265&quot; src=&quot;https://uploads.toptal.io/blog/image/122589/toptal-blog-image-1490294065035-eeed31a577375e4e58d227c24a7a7bc6.png&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, como se puede ver claramente en la gráfica de arriba, el mayor beneficio de la suscripción de fijación de precios es que provee un ciclo de flujo de dinero más estable y predecible, el cual puede ser de gran ayuda cuando se trata de planes financieros. Esto ayuda a explicar por qué a la gran mayoría de los productos SaaS se les fija precios en base mensual o de suscripción.&lt;/div&gt;
&lt;h2 id=&quot;beneficio-no-3-crea-y-cobra-para-efectos-de-red&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Beneficio No. 3: Crea y Cobra para Efectos de Red&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro beneficio importante de la fijación de precios en los productos SaaS, ya que estos se prestan bien para los efectos de red y esto tiene implicaciones útiles para la fijación de precios. Para ser más preciso, cuando decimos que SaaS “se prestan bien para los efectos de red”, queremos decir que a) SaaS puede ser un habilitador para crear efectos de red, y b) SaaS como mecanismo de entrega es, a menudo, más práctico para actividades que ya se benefician de efectos de red naturales. Antes de pasar a ver las implicaciones de fijación de precios en este punto, entendamos un poco más como SaaS se presta muy bien para efectos de red.&lt;/div&gt;
&lt;h3 id=&quot;saas-como-un-habilitador-poderoso-de-efectos-de-red&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
SaaS como un Habilitador Poderoso de Efectos de Red&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como mencionamos, los atributos específicos de los productos SaaS, a menudo, significa que estos pueden ser habilitadores poderosos para efectos de red. Existen tres razones específicas:&lt;/div&gt;
&lt;h4 id=&quot;saas-es-un-buen-software-de-colaboracin-dado-que-es-entregado-por-internet&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
1) SaaS es un buen software de colaboración, dado que es entregado por internet.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Al usar el internet, en vez de una entrega alojada localmente, el software SaaS les permite a las personas colaborar en tiempo real (ej. Google Docs) y ver cosas simultáneamente. También evita los problemas de interoperabilidad entre diferentes usuarios (tal vez por sus sistemas operativos), de nuevo esto hace la colaboración más fácil.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como&amp;nbsp;&lt;a href=&quot;http://www.zdnet.com/article/saas-pros-cons-and-leading-vendors/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;se señala aquí&lt;/a&gt;, la facilidad de la colaboración para los productos SaaS es “porque la colaboración es una de las categorías SaaS más pobladas y cambiantes.” Algunos ejemplos de compañías en este espacio incluyen servicios como Campfire para la colaboración en equipo, Basecamp para gestión de proyecto, AnyMeeting para conferencia web, Vidyo para conferencia por vídeo, Box para almacenamiento y Google Apps para productividad.&lt;/div&gt;
&lt;h4 id=&quot;saas-hace-ms-fcil-trabajar-con-fuentes-externas-dado-que-hay-menos-problemas-interoperacionales&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
2) SaaS hace más fácil trabajar con fuentes externas, dado que hay menos problemas interoperacionales.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayoría de los negocios tienen que interactuar con múltiples terceras partes, ya sean vendedores, proveedores, freelancers, etc. Cuando se usa el software para trabajar juntos, la interoperabilidad de este software pasa a ser un problema. SaaS resuelve esto al remover la interoperabilidad (aparte de la interoperabilidad en el nivel de buscador, que es muy mínima en la mayoría de los casos). Como&amp;nbsp;&lt;a href=&quot;http://continuations.com/post/100592523985/network-effects-for-saas-businesses&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;se ve aquí&lt;/a&gt;, “está la más obvia que está conectando unos negocios con otros. Por ejemplo, si estás en manejo de compras y conectas compañías a posibles proveedores, como lo hace Kinnek. Esto crea un lugar en el mercado como efectos de red donde más proveedores crean más compradores de valor y viceversa.”&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una repercusión de esto es que, dado que SaaS es relativamente fácil de instalar y ejecutar, agrega menos fricción al momento de convencer a otras partes de ejecutar el mismo software que tú, lo cual hace más fácil crear efectos de red.&lt;/div&gt;
&lt;h4 id=&quot;saas-permite-efectos-de-red-habilitados-por-data&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
3) SaaS permite efectos de red habilitados por data.&lt;/h4&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ya que SaaS permite rastreo de data en tiempo real, también puede llevar los llamados efectos de red habilitados por data. En este&amp;nbsp;&lt;a href=&quot;http://tomtunguz.com/saas-enabled-marketplace-data-advantage/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;fascinante blog post&lt;/a&gt;&amp;nbsp;por Tomas Tunguz, Capitalista Emprendedor en Redpoint Ventures, el resalta este punto (específicamente refiriéndose a los lugares de mercado habilitados por SaaS) de la siguiente forma:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Ya que SEM implementa SaaS para el lado del proveedor y el de la demanda, estas compañías pueden desarrollar un entendimiento excepcional de su mercado. Acceso a la data del proveedor y la demanda del consumidor proporciona 4 ventajas clave para SEM.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Primero, SEM entiende la curva provisión/demanda en todo segundo […] Consecuentemente, si hay un desbalance provisión/demanda, el SEM puede [entrar] a hacer un balance del mercado.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Segundo, SEM entiende la excelencia operacional de sus proveedores […] El SEM puede calificar mejor y unir provisión y demanda.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tercero, la data acumulada en la demanda del consumidor y desempeño del proveedor, se compone en un valor único de data que crea una fosa alrededor del negocio.&lt;/div&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuarto, por la visibilidad de provisión/demanda, un gran conocimiento sobre la excelencia del proveedor y la habilidad de identificar los tipos correctos de compradores y vendedores, SEM se beneficia de un mercado más eficiente.”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;beneficios-de-fijacin-de-precios-de-los-efectos-de-red&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Beneficios de Fijación de Precios de los Efectos de Red&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El beneficio de fijación de precios de lo mostrado arriba es que SaaS hace más fácil fijar precios de productos, para que así los efectos de red sean alentados primero y luego aprovechados. Específicamente por el mecanismo de entrega, SaaS hace más fácil implementar pago por cuenta o pago por sistema de fijación de precios de usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los beneficios de la fijación de precios por usuario con relación a efectos de red se pueden resumir de la siguiente manera: dado que en una base por usuario el costo es relativamente menor, esto introduce poca fricción para compañías al probar un servicio. Si así lo hacen, y asumiendo que les guste, esto da inicio a la creación de efectos de red. Una vez que los efectos de red se establecen, las compañías sacan el producto SaaS a la organización más amplia, la cual a su vez permite al modelo de fijación de precios por usuario, “manejar” la salida y capturar el máximo de ganancias. En muchos casos, no se ofrece descuento para grandes volúmenes por la “adicción” al servicio que ha creado el efecto de red.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un buen ejemplo de lo anterior es&amp;nbsp;&lt;a href=&quot;https://www.atlassian.com/software/jira&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;JIRA&lt;/a&gt;. JIRA es un producto software encargado de gestión de proyecto y rastreo de problemas, proporcionado por Atlassian, una compañía Australiana de productos SaaS de&amp;nbsp;&lt;a href=&quot;https://finance.yahoo.com/quote/TEAM?p=TEAM&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;6 billones de dólares&lt;/a&gt;. JIRA permite a los desarrolladores documentar y revisar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;bugs&lt;/em&gt;&amp;nbsp;y otros problemas, al igual que realizar funciones de gestión de proyectos. Mientras más personas usen JIRA, más valioso es para cada usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como resultado de esto, la fijación de precios de JIRA refleja los efectos de red. Mientras aumenta el número de usuarios usando el producto, la fijación de precios por usuario también aumenta. Para un equipo pequeño, de 10 personas, se fija un precio de 10 dólares por usuario mientras que para 50 personas la fijación es de 50 dólares, lo cual es un aumento de cinco veces (Tabla 2).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;277&quot; src=&quot;https://uploads.toptal.io/blog/image/122584/toptal-blog-image-1490281258836-8062785820cf7662a75cca2cd631c64d.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras que el efecto exacto de esta fijación de precios es imposible de conocer, un vistazo rápido al&amp;nbsp;&lt;a href=&quot;https://s2.q4cdn.com/141359120/files/doc_financials/2016/Q4/Atlassian-FY2016-Annual-Report.pdf&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;reporte anual&lt;/a&gt;&amp;nbsp;(página 44 y 49) de Atlassian, muestra que la ganancia en cuanto a subscriptores aumentó un 1200% (12.24 millones de dólares en 2014 a 146.66 millones de dólares en 2016) mientras que el número de clientes aumentó un 80% (37,250 en 2014 a 60,950 en 2016). La matemática simple muestra que si la fijación de precios hubiese quedado igual, las ganancias de Atlassian serían solo de 22 millones de dólares, debido a un aumento de 80% en el número de clientes. En otras palabras, gracias a los cambios en su fijación de precios, Atlassian genera unos 124 millones de dólares adicionales (146 millones de dólares - 22 millones de dólares) por año!&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El punto general de cobrar por efectos de red se resume muy bien en este&amp;nbsp;&lt;a href=&quot;https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1088570&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;ensayo academico&lt;/a&gt;: “La presencia de efecto de red también favorece el pago por uso sobre la licencia perpetua; si el efecto de red es fuerte, el pago por uso siempre dominará la licencia perpetua sin importar el costo inconveniente o una potencial piratería. Con más clientes heterogéneos, una potencial piratería más alta, costos inconvenientes más bajos y efectos de red más fuertes, la licencia de pago por uso da paso a más ganancias de vendedores pero también un excedente social más alto que la licencia perpetua”.&lt;/div&gt;
&lt;h2 id=&quot;beneficio-no-4-freemium---la-fijacin-de-precios-como-estrategia-de-mercadeo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Beneficio No. 4:&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemium&lt;/em&gt;&amp;nbsp;- La Fijación de Precios como Estrategia de Mercadeo&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemium&lt;/em&gt;&amp;nbsp;es una estrategia de mercadeo donde una parte o todo el producto se ofrece con cero fijación de precios por tiempo ilimitado. La parte “-mium” de la palabra “freemium” se refiere a “premium”, donde el usuario del producto gratis podría actualizar a un producto premium, ej., pagar por el producto.&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Freemium&lt;/em&gt;&amp;nbsp;se ofrece con la esperanza de que algunos de los usuarios del producto gratis actualicen a premium, pero esta oferta es por tiempo ilimitado, para que así los usuarios puedan actualizar cuando lo deseen.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los beneficios de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;se resumen muy bien en este&amp;nbsp;&lt;a href=&quot;https://hbr.org/2014/05/making-freemium-work&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Artículo de Reseña de Harvard Business&lt;/a&gt;:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Muchos factores contribuyen al atractivo de la estrategia&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;. Ya que las características gratis son una herramienta de mercadeo potente, el modelo permite a una nueva empresa avanzar y atraer una base de usuario sin gastar recursos en campañas de publicidad o una fuerza de ventas tradicional. Las tarifas de suscripción mensual que normalmente se cobran, están demostrando ser una fuente más sustentable de ganancias que el modelo de publicidad que prevalece entre las empresas en línea en los inicios del 2000. Las redes sociales son conductores poderosos: Muchos servicios ofrecen incentivos por referir amigos (lo cual es más atractivo cuando el producto es gratis). Y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;es más exitoso que las pruebas gratis de 30 días u otras ofertas de tiempo limitado, porque los clientes se han vuelto cautelosos con los procesos de cancelación engorrosos y les parece que el acceso gratis ilimitado es más convincente”.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La pertinencia de esto para el modelo SaaS es que&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;solo funciona si el precio de entrega del servicio gratis es marginal. Si no, es poco probable que&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;funcione desde un punto de vista financiero. Afortunadamente para SaaS, este es uno de los beneficios inherentes del mecanismo de entrega. (Gráfica #5).&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;413&quot; src=&quot;https://uploads.toptal.io/blog/image/122588/toptal-blog-image-1490281517873-8d9eb8b012789533f0ac572bacf7e0f8.png&quot; style=&quot;font-size: 1.2em; letter-spacing: 0.14px;&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Así, SaaS se presta muy bien para ofrecer la fijación de precios&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;. Este punto se resume muy bien&amp;nbsp;&lt;a href=&quot;https://www.chargebee.com/blog/advantages-and-disadvantages-of-saas-freemium-model/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;en este post&lt;/a&gt;,&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“Para que el modelo&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;funcione, un atributo específico del producto ya debe estar en funcionamiento - baja distribución marginal y costo de producción. Solo si puedes mantener el costo lo más bajo posible, un usuario gratis extra te costará nada más que una entrada de base de datos […] ésta es una característica inherente de los productos SaaS”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una compañía que tiene una excelente oferta&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;SaaS es Slack, la cual tiene más de&amp;nbsp;&lt;a href=&quot;https://slackhq.com/we-love-it-when-the-numbers-turn-over-70a61a69b2ff#.1qetewxbe&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;4 millones de usuarios activos diariamente&lt;/a&gt;&amp;nbsp;hasta ahora. De estos usuarios, 1.25 millones son pagos pero los otros 2.75 millones están usando el producto gratis. La fijación de precios no previene que usen el producto y los hace usuarios pagos potencialmente en meses y años venideros. En otras palabras, muchas ventajas se adquieren gracias a la fijación de precios de cero-dólares.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;&quot; height=&quot;452&quot; src=&quot;https://uploads.toptal.io/blog/image/122585/toptal-blog-image-1490281312994-83b7ea58d4bfdcad4a2e3d8394e08753.png&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Slack parece estar beneficiándose de su estructura&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;, con una tasa de&amp;nbsp;&lt;a href=&quot;http://www.nirandfar.com/2014/11/slack.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;conversión anunciada de 30%&lt;/a&gt;. En otras palabras, de los 2.75 millones de usuarios que usan Slack gratis, se espera que 800,000 pasen a ser usuarios pagos en el futuro. Eso es muchas ganancias recurrentes; para ser un poco más preciso, a&amp;nbsp;&lt;a href=&quot;https://slack.com/pricing&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;6.67 dólares/mes/usuario con su plan más económico&lt;/a&gt;, eso es 5.3 millones de dólares adicionales en ganancias al mes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No todos los productos se crean igual; por esto, cada producto podría tener una oferta&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;diferente, al igual que una&amp;nbsp;&lt;a href=&quot;http://www.business2community.com/digital-marketing/freemium-conversion-rate-spotify-destroys-dropbox-667-01497671#YoBXTftx4PVKRE8i.97&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;tasa de conversión&lt;/a&gt;. Por ejemplo, mientras que Spotify tiene una&amp;nbsp;&lt;a href=&quot;http://www.business2community.com/digital-marketing/freemium-conversion-rate-spotify-destroys-dropbox-667-01497671#YoBXTftx4PVKRE8i.97&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;tasa de conversión de 27% de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;a premium&lt;/a&gt;, Dropbox&amp;nbsp;&lt;a href=&quot;http://www.business2community.com/digital-marketing/freemium-conversion-rate-spotify-destroys-dropbox-667-01497671#YoBXTftx4PVKRE8i.97&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;tiene una tasa de 4%&lt;/a&gt;. Por este motivo, cada compañía debería descubrir si&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;es asequible. Sin embargo, como&amp;nbsp;&lt;a href=&quot;https://blog.mailchimp.com/going-freemium-one-year-later/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;dice&lt;/a&gt;, Ben Chestnut, co-fundador de MailChimp, el día del helado gratis de Ben &amp;amp; Jerry’s mostró que&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;freemium&lt;/em&gt;&amp;nbsp;podría ser muy poderoso y lo ha sido para MailChimp desde que empezaron a ofrecerlo, ocho largos años después de fundar la compañía.&lt;/div&gt;
&lt;hr style=&quot;background: rgb(228, 228, 228); border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; height: 1px; letter-spacing: 0.14px; margin: 3em 0px;&quot; /&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;N.B. En este artículo, *Freemium* se define como una oferta de un producto a un cliente por tiempo ilimitado. Una prueba gratis se define como una oferta de un producto pago a un cliente por un tiempo limitado. Una prueba gratis no se considera *freemium*, ya que no se puede ofrecer indefinidamente. Para leer más sobre la implementación de *freemium* y pruebas gratis, por favor revisa&amp;nbsp;&lt;a href=&quot;http://sixteenventures.com/freemium-or-free-trial&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;este artículo&lt;/a&gt;&amp;nbsp;de Lincoln Murphy.&lt;/em&gt;&lt;/div&gt;
&lt;hr style=&quot;background: rgb(228, 228, 228); border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; height: 1px; letter-spacing: 0.14px; margin: 3em 0px;&quot; /&gt;
&lt;h2 id=&quot;en-una-nube&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En Una Nube&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras más y más compañías cambian una provisión de servicios basada en la nube, el cambio de SaaS a software&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;on-premises&lt;/em&gt;&amp;nbsp;seguramente continúe de manera estable. Y creemos que es algo bueno. Las nuevas empresas tendrán más facilidad de ofrecer el mismo servicio que compañías más grandes y establecidas solo han podido hacer gracias a grandes inversiones en habilidades internas. Los clientes tendrán más flexibilidad de encontrar productos que hagan un balance de sus necesidades con su bolsillo. En otras palabras, SaaS crea situaciones de éxito a través del espectro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mientras la tecnología SaaS y nuestro entendimiento de sus beneficios se desarrolla, esperamos ver más modelos de fijación de precios emerger para aprovecharse de este modelo tan único. Los ejemplos dados no son exhaustivos, y son solo un reflejo de los tipos de implementación de fijación de precios usada en el mundo SaaS, espero que este artículo pueda servir de guía para retos y oportunidades continuas en fijación de precios.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Por: &lt;a href=&quot;https://www.toptal.com/finance/resume/tayfun-uslu&quot;&gt;Tayfun Uslu&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/finance/pricing-consultants/saas-t%C3%A1cticas-de-fijaci%C3%B3n-de-precios-que-pueden-catapultar-tu-negocio/es&quot; style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Toptal&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/2353575465966642738/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/saas-tacticas-de-fijacion-de-precios.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2353575465966642738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2353575465966642738'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/saas-tacticas-de-fijacion-de-precios.html' title='SaaS - Tácticas de Fijación de Precios Que Pueden Catapultar Tu Negocio'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-4058945045868876025</id><published>2017-06-18T22:00:00.000-03:00</published><updated>2017-06-24T21:52:49.692-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP7"/><category scheme="http://www.blogger.com/atom/ns#" term="Programación"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Zend"/><title type='text'>Introducción A PHP 7: Qué Hay De Nuevo Y Qué Se Ha Ido</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSgexE_YzL5jQMzppzeu8Ss6645oNJpVXAvGgdDI8W_NXYIqrhuD6PcwUtq88QG-sBLQ1ASEmBTu_j1CUUXxlUTiKb-OrHN5h0e2kd4svmskAPABHlftInMe2eKDSOXR1mNH2mbyz-o40/s1600/PHP-7-Features-that-will-woo-every-PHP-fan.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;344&quot; data-original-width=&quot;600&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSgexE_YzL5jQMzppzeu8Ss6645oNJpVXAvGgdDI8W_NXYIqrhuD6PcwUtq88QG-sBLQ1ASEmBTu_j1CUUXxlUTiKb-OrHN5h0e2kd4svmskAPABHlftInMe2eKDSOXR1mNH2mbyz-o40/s640/PHP-7-Features-that-will-woo-every-PHP-fan.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Uno de los eventos más emocionantes en el 2015 en el mundo de PHP fue el lanzamiento de PHP 7;10 años después del lanzamiento de la última versión principal, PHP 5. Con un gran paso adelante, PHP 7 introduce un montón de nuevas características y actualizaciones de rendimiento.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, también elimina la funcionalidad antigua, obsoleta, que introduce algunos pausas de compatibilidad, lo que hace más difícil para las aplicaciones más antiguas migrar a la nueva versión. Esta guía debe servir como un recorrido rápido sobre qué esperar si planeas mover sus aplicaciones existentes, o construir otras nuevas, encima de PHP 7.&lt;/div&gt;
&lt;h2 id=&quot;pero-espera--a-dnde-fue-php-6&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pero Espera, ¿ A Dónde Fue PHP 6?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si no has estado trabajando con PHP últimamente, puedes preguntarte qué pasó con PHP 6, ¿por qué el salto de PHP 5 a PHP 7? Bueno, larga historia corta, PHP 6 fue un fracaso. La característica principal de la versión 6 era el soporte nativo de caracteres&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Unicode&lt;/em&gt;, ya que PHP se utiliza principalmente en el desarrollo web y la web necesita Unicode, por lo que el movimiento para traer Unicode a PHP tenía sentido.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La idea era traer un soporte completo para Unicode al núcleo mismo. Habría traído capacidades extendidas al lenguaje: desde la habilidad de usar&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;emojis&lt;/em&gt;&amp;nbsp;tontos, como nombres de variables y de funciones, hasta poderosas funciones internacionales de cuerdas. Por ejemplo, cuando otro idioma utiliza letras mayúsculas y minúsculas de manera diferente al inglés, o cuando un nombre en caracteres chinos necesita ser convertido al inglés.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;PHP 6 era ambicioso, pero basura. Así es como terminamos con PHP 7, saltando la versión 6 en el proceso.&quot; src=&quot;https://uploads.toptal.io/blog/image/92220/toptal-blog-image-1457697741992-bcacf11d0c909a8ac16a28b611fa9920.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;&lt;b&gt;PHP 6 era ambicioso, pero basura. Así es como terminamos con PHP 7, saltando la versión 6 en el proceso.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desafortunadamente, este ambicioso plan resultó ser un mayor problema de lo previsto. La mayor parte de la base de código tenía que ser portada para soportar Unicode tanto para las extensiones principales como para las importantes, lo que resultó tedioso y complicado. Esto frenó el desarrollo de otras características en el lenguaje, frustrando a muchos&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/php&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;desarrolladores de PHP&lt;/a&gt;&amp;nbsp;en el proceso. Se presentaron obstáculos adicionales, lo que resultó en menos interés en el desarrollo de un soporte nativo de Unicode, lo que finalmente llevó al abandono del proyecto.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dado que los recursos, tales como libros y artículos, se habían escrito para PHP 6 y su soporte Unicode, la nueva versión sería renombrada PHP 7 para evitar la confusión.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
De todos modos, suficiente sufrimiento del pasado triste, vamos a ver lo que PHP 7 trae a la fiesta.&lt;/div&gt;
&lt;h2 id=&quot;batalla-de-rendimiento-php-7-vs-php-5&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Batalla De Rendimiento, PHP 7 vs. PHP 5&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con prácticamente todas las actualizaciones, se esperan mejoras de rendimiento menores. Sin embargo, esta vez PHP trae una mejora significativa sobre versiones anteriores que hacen el funcionamiento escarpado una de las características más atractivas de PHP 7. Esto viene como parte del proyecto “PHPNG”, que aborda los componentes internos del propio motor&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Zend.&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mediante la refactorización de estructuras de datos internas y la adición de un paso intermedio para codificar la compilación en forma de un árbol de sintaxis abstracto (AST), el resultado es un rendimiento superior y una asignación de memoria más eficiente. Los números mismos parecen muy prometedores; Los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Benchmarks&lt;/em&gt;realizados en aplicaciones del mundo real muestran que PHP 7 es dos veces más rápido que PHP 5.6 en promedio y que resulta en un 50% menos de consumo de memoria durante las solicitudes, convirtiendo a PHP 7 en un fuerte rival para el compilador HHVM JIT de Facebook. Echa un vistazo a este infográfico de Zend representando el rendimiento de algunos comunes&amp;nbsp;&lt;a href=&quot;http://www.zend.com/en/resources/php7_infographic&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;CMS y Frameworks&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;PHP 7 se ve y se siente familiar, pero está ajustado para el rendimiento. El refinado Motor Zend y las ganancias de rendimiento resultantes hacen una gran diferencia.&quot; src=&quot;https://uploads.toptal.io/blog/image/92221/toptal-blog-image-1457697809406-4e22667debea6921cf2b36469491f5f0.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;&lt;b&gt;PHP 7 se ve y se siente familiar, pero está ajustado para el rendimiento. El refinado Motor Zend y las ganancias de rendimiento resultantes hacen una gran diferencia.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;La disminución en el consumo de memoria también permite a las máquinas más pequeñas manejar mejor las solicitudes junto con la oportunidad de construir micro servicios alrededor de PHP. Los cambios internos, en particular la implementación de AST, también abren posibilidades de optimizaciones futuras que podrían empujar aún más el rendimiento. Se está considerando una nueva implementación interna de un compilador JIT para futuras versiones.&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;php-7-azcar-sintctica&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
PHP 7 Azúcar Sintáctica&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
PHP 7 viene con nuevas características de sintaxis. Aunque no amplían las capacidades del propio lenguaje, proporcionan una forma mejor o más fácil de hacer que tu código sea más agradable para escribir y más cómodo para a los ojos.&lt;/div&gt;
&lt;h3 id=&quot;declaraciones-de-importacin-de-grupo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Declaraciones De Importación De Grupo&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora, podemos agrupar las declaraciones de importación para las clases que se originan desde el mismo espacio de nombres en la línea de ‘uso.’ Esto debería ayudar a alinear las declaraciones de una manera significativa o simplemente guardar algunos bytes en tus archivos.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framework&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Module&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Foo&lt;/span&gt;;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framework&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Module&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Bar&lt;/span&gt;;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framework&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Module&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Baz&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Con PHP 7 podemos usar:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framework&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Module&lt;/span&gt;\{&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Foo&lt;/span&gt;, &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Bar&lt;/span&gt;, &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Baz&lt;/span&gt;};
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;O si preferimos un estilo multi-linear:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Framework&lt;/span&gt;\&lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Module&lt;/span&gt;{
   &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Foo&lt;/span&gt;,
   &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Bar&lt;/span&gt;,
   &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Baz&lt;/span&gt;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;operador-coalescente-nulo&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Operador Coalescente Nulo&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto resuelve un problema común en la programación PHP, donde queremos asignar un valor a una variable de otra variable, si esta última está realmente configurada; de lo contrario proporcionarle un valor diferente a esta. Se utiliza comúnmente cuando trabajamos con la entrada proporcionada por el usuario.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Pre-PHP 7:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;isset&lt;/span&gt;(&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;)) {
   &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt; = &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;;
} &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;else&lt;/span&gt; {
   &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt; = &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;default&#39;&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// we would give $bar the value &#39;default&#39; if $foo is NULL&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Después de PHP 7:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt; 
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt; = &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt; ?? &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;default&#39;&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Esto también puede estar encadenado con un número de variables:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt; = &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt; ?? &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$baz&lt;/span&gt; ?? &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;default&#39;&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;operador-de-nave-espacial&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Operador De Nave Espacial&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El operador de la nave espacial&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;&amp;lt;=&amp;gt;&lt;/code&gt;&amp;nbsp;permite una comparación de tres vías entre dos valores, no solo indicando si son iguales, sino también cuál es mayor, sobre la desigualdad devolviendo 1,0 o -1.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aquí podemos tomar diferentes acciones dependiendo de cómo los valores difieren:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;switch&lt;/span&gt; (&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt; &amp;lt;=&amp;gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;0&lt;/span&gt;:
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;$bar and $foo are equal&#39;&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;case&lt;/span&gt; -&lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;:
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;$foo is bigger&#39;&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;:
       &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;$bar is bigger&#39;&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los valores comparados pueden ser enteros, flotantes, cadenas o incluso matrices.&amp;nbsp;&lt;a href=&quot;https://wiki.php.net/rfc/combined-comparison-operator&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Consulta la documentación para tener una idea de cómo se comparan los diferentes valores entre sí.&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&quot;nuevas-funciones-en-php-7&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nuevas Funciones En PHP 7&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Pero, por supuesto, PHP 7 también aporta nuevas y emocionantes funcionalidades.&lt;/div&gt;
&lt;h3 id=&quot;tipos-de-parmetros-escalares-y-sugerencias-de-tipo-de-retorno&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Tipos De Parámetros Escalares Y Sugerencias De Tipo De Retorno&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
PHP 7 extiende las declaraciones de tipos anteriores de parámetros en métodos (clases, interfaces y matrices) añadiendo los cuatro tipos escalares;&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Integers&lt;/em&gt;&amp;nbsp;(&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;int&lt;/code&gt;),&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Floats&lt;/em&gt;&amp;nbsp;(&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;float&lt;/code&gt;),&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Booleans&lt;/em&gt;&amp;nbsp;(&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;bool&lt;/code&gt;) y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Strings&lt;/em&gt;&amp;nbsp;(&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;string&lt;/code&gt;) como posibles tipos de parámetro.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, podemos especificar opcionalmente qué tipo de métodos y funciones devuelven. Los tipos soportados son * bool *, * int *, * float *, * string *, * array *, * callable *, nombre de * Clase * o * Interface *, * self * y * parent * (para métodos de clase)&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;Clase Calculadora
{
  // Declaramos que los parámetros proporcionados son del tipo entero
  Función Pública addTwoInts (int $ x, int $ y): int {
         Retorno $ x + $ y; // También decimos explícitamente que este método devolverá un entero
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las declaraciones de tipo permiten la construcción de aplicaciones más robustas y evitan pasar y devolver valores erróneos de las funciones. Otros beneficios incluyen analizadores de código estático e IDEs, que proporcionan una mejor visión de la base de código si faltan los&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;DocBlocks.&lt;/em&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Dado que PHP es un lenguaje de tipificación débil, ciertos valores para los tipos de parámetro y de retorno se emitirán en función del contexto. Si pasamos el valor “3” en una función que tiene un parámetro declarado de tipo&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;int&lt;/code&gt;, el intérprete lo aceptará como un entero y no lanzará ningún error. Si no deseas esto, puede habilitar&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;modo estricto&lt;/code&gt;&amp;nbsp;añadiendo una directiva de&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;declarar&lt;/code&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Declarar (tipos_estrictos = 1);&lt;/code&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto se establece en una base por archivo, ya que una opción global dividiría los repositorios de código en aquellos que están construidos con rigor global&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;en&lt;/em&gt;&amp;nbsp;y aquellos que no lo son, resultando en un comportamiento inesperado cuando combinamos código de ambos.&lt;/div&gt;
&lt;h3 id=&quot;excepciones-del-motor&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Excepciones Del Motor&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con la adición de excepciones del motor, los errores fatales que podrían haber resultado en la terminación del&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Script&lt;/em&gt;&amp;nbsp;se pueden capturar y manejar fácilmente.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Errores como llamar a un método inexistente no terminará el Script, sino que lanzarán una excepción que puede ser manejada por un bloque de prueba de captura, lo que mejora el manejo de errores para sus aplicaciones. Esto es importante para ciertos tipos de aplicaciones, servidores y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Daemons&lt;/em&gt;, ya que los errores fatales requerirían que se reiniciaran. Las pruebas en PHPUnit también deberían ser más útiles, ya que los errores fatales eliminan toda la serie de pruebas. Las excepciones, en lugar de errores, se manejarían por caso de prueba.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;La adición de excepciones de motor a PHP 7 ayuda a prevenir la terminación de scripts y mejora el error handling.&quot; src=&quot;https://uploads.toptal.io/blog/image/92223/toptal-blog-image-1457697946879-315bbdeb62fa5b19448072af61cbb24b.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px;&quot;&gt;&lt;i&gt;&lt;b&gt;PHP 7 se ve y se siente familiar, pero está ajustado para el rendimiento. El refinado Motor Zend y las ganancias de rendimiento resultantes hacen una gran diferencia.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
PHP 7 añade una serie de nuevas clases de excepción basadas en el tipo de errores que se pueden encontrar. Con el fin de mantener la compatibilidad entre versiones, se ha añadido una nueva interfaz&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Throwable&lt;/code&gt;&amp;nbsp;que se puede implementar a partir de excepciones de motor y de usuario. Esto era necesario para evitar excepciones del motor para extender la clase de excepción de base, lo que resulta en antiguas excepciones de captura de código que no existían antes.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Antes de PHP 7 esto habría terminado el script con un error fatal:&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;try&lt;/span&gt;
{
   thisFunctionDoesNotEvenExist();
}
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;catch&lt;/span&gt; (\EngineException &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$e&lt;/span&gt;) {
   &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
Clean things up &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;and&lt;/span&gt; log error
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;echo&lt;/span&gt;
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$e&lt;/span&gt;-&amp;gt;getMessage();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;clases-annimas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Clases Anónimas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las clases anónimas son primos de funciones anónimas que podrías usar en una instancia simple a corto plazo. Las clases anónimas se pueden crear y utilizar fácilmente como un objeto normal. Aquí hay un ejemplo de los documentos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Pre-PHP 7&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;php
class
MyLogger {
 public function log($msg) {
 
   print_r($msg . &quot;\n&quot;);
 }
}
 
$pusher-&amp;gt;setLogger(
new MyLogger() );
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Con clase anónima:&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;php
$pusher-&amp;gt;setLogger(new class {
 public
function log($msg) {
   print_r($msg
. &quot;\n&quot;);
 }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las clases anónimas son útiles en las pruebas unitarias, particularmente en pruebas de objetos y servicios. Esto nos ayuda a evitar las pesadas bibliotecas y los marcos replica la creación de un objeto simple que proporciona la interfaz que queremos imitar.&lt;/div&gt;
&lt;h3 id=&quot;funciones-csprng&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Funciones CSPRNG&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Se agregaron dos nuevas funciones para generar cadenas y números enteros criptográficamente seguros.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;random_bytes(int
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$len&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Devuelve una cadena aleatoria con longitud&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;$len&lt;/code&gt;.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;php
random_int(int
$min, int $max);
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Devuelve un número entre&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;$min&lt;/code&gt;y&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;$max&lt;/code&gt;.&lt;/div&gt;
&lt;h3 id=&quot;sintaxis-de-escape-de-codepoint-unicode&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sintaxis de Escape de Codepoint Unicode&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
A diferencia de muchos otros lenguajes, antes de PHP 7, PHP no tenía una manera de escapar de un código Unicode en literales de cadena,. Esta funcionalidad agrega la secuencia de escape `\ u ‘para producir dichos caracteres usando su código de código UTF-8. Esto es mejor que insertar los caracteres directamente, permitiendo un mejor manejo de los caracteres invisibles, así como los caracteres que tienen la misma representación gráfica, pero difieren en el significado.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;echo &quot;\u{1F602}&quot;; // outputs 😂‚&lt;/code&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ten en cuenta que esto rompe el código existente con la secuencia `\ u ‘porque cambia el comportamiento.&lt;/div&gt;
&lt;h3 id=&quot;los-generadores-se-actualizan&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los Generadores Se Actualizan&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Generadores en PHP obtienen también algunas características adicionales agradables. Ahora, los generadores tienen una instrucción de retorno que puede usarse para permitir que produzca un valor final después de la iteración. Esto se puede utilizar para comprobar que el generador se ha ejecutado sin errores y permite que el código que llamó al generador maneje varios escenarios de manera adecuada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, los generadores pueden devolver y rendir expresiones de otros generadores. Esto les permite dividir las operaciones complejas en unidades más simples y modulares.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;genA&lt;/span&gt;&lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;;
}
 
&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;genB&lt;/span&gt;&lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt; {&lt;/span&gt;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; from genA(); &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// &#39;genA&#39; Se llama aquí e itera&lt;/span&gt;
sobre
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;;
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;success&#39;&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Este es un resultado final que&lt;/span&gt;
podemos comprobar más tarde
}
 
&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;foreach&lt;/span&gt; (genB() &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$val&lt;/span&gt;) {
   &lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;\n $val&quot;&lt;/span&gt;; &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Esto emitirá los&lt;/span&gt;
valores &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt; a &lt;span class=&quot;hljs-number&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt; para}
 
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$genB&lt;/span&gt;()-&amp;gt;getReturn(); &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Esto debería devolver el &quot;éxito&quot;&lt;/span&gt;
cuando no hay errores.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;expectativas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Expectativas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las expectativas son una mejora de la función de&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;afirmar ()&lt;/code&gt;&amp;nbsp;mientras se mantiene la compatibilidad hacia atrás. Permiten aserciones de costo cero en el código de producción y proporcionan la posibilidad de lanzar excepciones personalizadas cuando la afirmación falla, lo cual puede ser útil durante el desarrollo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;Afirmar ()&lt;/code&gt;&amp;nbsp;se convierte en una construcción de lenguaje en PHP 7. Las aserciones deben usarse para propósitos de depuración sólo en entornos de desarrollo y pruebas. Para configurar su comportamiento, se nos proporcionan dos nuevas directivas.&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; list-style: none; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;zend.afirmación&lt;/code&gt;&amp;nbsp;-&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;1&lt;/code&gt;: generar y ejecutar código (modo de desarrollo) (valor por defecto) -&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;0&lt;/code&gt;: genera el código pero salta a su alrededor en tiempo de ejecución -&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;-1&lt;/code&gt;: no genera código que lo convierte en coste cero (modo de producción)&lt;/li&gt;
&lt;li style=&quot;border: 0px; box-sizing: border-box; line-height: 1.5em; list-style-type: disc; margin: 0px 0px 0.75em 30px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;afirmación.excepción&lt;/code&gt;&amp;nbsp;-&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;1&lt;/code&gt;: lanzar cuando la aserción falla, lanzando el objeto proporcionado como excepción o lanzando un nuevo objeto * ErrorAfirmación * si no se proporcionó la excepción -&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;0&lt;/code&gt;: usa o genera un * Throwable * como se describió anteriormente, pero solo genera una advertencia basada en ese objeto en lugar de lanzarla (compatible con el comportamiento de PHP 5)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preparacin-para-pasar-de-php-5-a-php-7&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Preparación Para Pasar de PHP 5 a PHP 7&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La introducción de un lanzamiento importante brinda la oportunidad de cambiar/actualizar las funcionalidades más antiguas o incluso eliminarlas si se consideran demasiado viejas o han quedado obsoletas durante algún tiempo. Tales cambios pueden introducir interrupciones en compatibilidad en aplicaciones más antiguas.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Otro problema que surge de esta versión, es que las bibliotecas y los marcos importantes de los que dependes pueden no haber sido actualizados para soportar la última versión. El equipo de PHP ha intentado hacer los nuevos cambios lo más atrasados ​​posible y permitir que la migración a la nueva versión sea lo más sencilla posible. Las aplicaciones más nuevas y más actualizadas deberían encontrar más fácil pasar a la nueva versión, mientras que las aplicaciones más antiguas pueden tener que decidir si los beneficios superan el costo, posiblemente eligiendo no actualizar.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayoría de los descansos son menores y se pueden mitigar fácilmente, mientras que otros pueden requerir más esfuerzo y tiempo. Básicamente, si tenías advertencias de obsoletos en tu aplicación antes de instalar PHP 7 probablemente obtendrás errores que romperán la aplicación hasta que se resuelva. Fuiste advertido, ¿verdad?&lt;/div&gt;
&lt;h3 id=&quot;antiguos-sapis-y-extensiones&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Antiguos SAPIs y extensiones&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo más importante, las SAPIs viejas y desaprobadas fueron eliminadas como la extensión&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;mysql&lt;/code&gt;&amp;nbsp;(pero no deberías estar usando esto en primer lugar, ¿verdad?). Para obtener una lista completa de extensiones y destacados eliminado puedes comprobar este RFCs&amp;nbsp;&lt;a href=&quot;https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además, otros SAPIs están siendo portados a PHP 7.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Cargas de SAPIs y extensiones viejas fueron eliminadas de PHP 7.Estamos prediciendo que no se perderán.&quot; src=&quot;https://uploads.toptal.io/blog/image/92249/toptal-blog-image-1458551698129-fcacb67514011e47a013042d0768b128.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;background-color: #fafafa; color: #505050; font-size: 18.2px; letter-spacing: 0.14px;&quot;&gt;&lt;b&gt;&lt;i&gt;Cargas de SAPIs y extensiones viejas fueron eliminadas de PHP 7.Estamos prediciendo que no se perderán.&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;sintaxis-de-variable-uniforme&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sintaxis de variable uniforme&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esta actualización hizo algunos cambios a favor de la coherencia para las construcciones de variable- variable. Esto permite expresiones más avanzadas con variables, pero introduce cambios en el comportamiento en algunos otros casos, como se muestra a continuación.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;                       &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
old meaning
           &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// new meaning&lt;/span&gt;
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$$foo&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;bar&#39;&lt;/span&gt;][&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]
    ${&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;bar&#39;&lt;/span&gt;][&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]}
    (&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$$foo&lt;/span&gt;)[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;bar&#39;&lt;/span&gt;][&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]
      &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;{&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]}
      (&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;)[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]()
    &lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;{&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]}()
    (&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;)[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]()
Foo::&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]()
     Foo::{&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]}()
     (Foo::&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;)[&lt;span class=&quot;hljs-string&quot; style=&quot;border: 0px; box-sizing: border-box; color: #2aa198; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&#39;baz&#39;&lt;/span&gt;]()
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Esto rompería el comportamiento de las aplicaciones que accedían a valores como éste. Por otro lado, puede hacer algunas cosas limpias como esto :.&lt;/div&gt;
&lt;pre style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-size: 14px; letter-spacing: 0.14px; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;code class=&quot;language-php hljs&quot; style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #657b83; display: inline-block; font-size: 0.9em; line-height: 1.5em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; overflow-x: auto; padding: 2px 5px; vertical-align: text-bottom; width: 864px;&quot;&gt;&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
Nested ()
foo()();
&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;// Calls the return of foo()&lt;/span&gt;
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;-&amp;gt;bar()();
 
&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
IIFE syntax like JavaScript
(&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt;
{&lt;/span&gt;
   &lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;hljs-function&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;border: 0px; box-sizing: border-box; color: #859900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Function&lt;/span&gt; &lt;span class=&quot;hljs-title&quot; style=&quot;border: 0px; box-sizing: border-box; color: #268bd2; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;body&lt;/span&gt;
})&lt;span class=&quot;hljs-params&quot; style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;()&lt;/span&gt;;&lt;/span&gt;
 
&lt;span class=&quot;hljs-comment&quot; style=&quot;border: 0px; box-sizing: border-box; color: #93a1a1; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;//&lt;/span&gt;
Nested ::
&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$foo&lt;/span&gt;::&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$bar&lt;/span&gt;::&lt;span class=&quot;hljs-variable&quot; style=&quot;border: 0px; box-sizing: border-box; color: #b58900; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;$baz&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;etiquetas-de-estilo-antiguo-eliminadas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Etiquetas De Estilo Antiguo Eliminadas&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las etiquetas de apertura / cierre `` &amp;lt;% …%&amp;gt;&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;,&lt;/code&gt;&amp;nbsp;&amp;lt;% = …%&amp;gt;&amp;nbsp;&lt;code style=&quot;background: rgb(255, 255, 252); border-radius: 3px; border: 1px solid rgb(238, 238, 238); box-sizing: border-box; display: inline-block; font-size: 0.8em; line-height: 1em; margin: 0px; max-width: 100%; min-height: 0px; min-width: 0px; padding: 2px 5px; vertical-align: text-bottom;&quot;&gt;,&lt;/code&gt;&amp;nbsp;&lt;lenguaje script=&quot;php&quot; style=&quot;box-sizing: border-box;&quot;&gt;... &amp;lt;/ script&amp;gt; `se eliminan y ya no son válidas. Sustituirlas por los válidos debería ser fácil, pero ¿qué estás haciendo con ellos de todos modos, raro?&lt;/lenguaje&gt;&lt;/div&gt;
&lt;h3 id=&quot;nombres-no-vlidos-para-clases-interfaces-y-rasgos&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nombres No Válidos Para Clases, Interfaces Y Rasgos&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como resultado de las adiciones, como las clases de tipo de parámetro y retorno, las interfaces y los rasgos ya no pueden tener los siguientes nombres:&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
- bool - int - float - string - nulo - verdadero - falso&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Estos causan roturas a las aplicaciones existentes y las bibliotecas que las utilizan, pero deben ser fáciles de arreglar. Además, aunque no causan ningún error y son válidos, no deben utilizarse los siguientes, ya que están reservados para uso futuro:&lt;/div&gt;
&lt;h2 id=&quot;recurso&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
-recurso&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
objecto - mixto - numérico&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Abstenerse de usarlos debería ahorrarte el trabajo de cambiarlos en el futuro. Para una lista completa de cambios que romperían la compatibilidad, comprueba este&amp;nbsp;&lt;a href=&quot;http://php.net/manual/es/migration70.incompatible.php&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;documento&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
También puedes utilizar&amp;nbsp;&lt;a href=&quot;https://github.com/sstalle/php7cc&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;php7cc&lt;/a&gt;, que verifica tu código y puede detectar posibles problemas que puedan surgir si te mudas a PHP 7. Pero, por supuesto, no hay mejor manera que instalar PHP 7 y comprobarlo por ti mismo. ## Potenciales Problemas de Compatibilidad con PHP ### PHP 7 Compatibilidad de Infraestructura&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una gran cantidad de servicios de hosting han comenzado a añadir soporte para PHP 7. Esta es una buena noticia para los proveedores de alojamiento compartido, ya que las ganancias de rendimiento les permitirá aumentar el número de sitios web de los clientes en su hardware, reduciendo sus gastos operativos y aumentando sus márgenes. En cuanto a los propios clientes, no deben esperar demasiado de un impulso en estas condiciones, pero para ser justos, el alojamiento compartido no es una opción orientada al rendimiento de todos modos.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Por otro lado, los servicios que ofrecen los servidores privados virtuales o servidores dedicados obtendrán los beneficios completos de este golpe de rendimiento. Algunos servicios de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;PaaS&lt;/em&gt;&amp;nbsp;como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Heroku&lt;/em&gt;&amp;nbsp;soportaban PHP 7 desde el principio, pero otros servicios, como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;AWS Beanstalk&lt;/em&gt;&amp;nbsp;y&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;OpenShift de Oracle&lt;/em&gt;, están rezagados. Consulta el sitio web de tu proveedor PaaS para ver si PHP 7 ya está soportado, o si el soporte viene en un futuro próximo. Por supuesto, los proveedores IaaS te permiten tomar el control del hardware e instalar PHP 7 (o compilar si es más a tu gusto). Los paquetes de PHP 7 ya están disponibles para los principales entornos IaaS.&lt;/div&gt;
&lt;h3 id=&quot;php-7-compatibilidad-de-software&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
PHP 7 Compatibilidad de Software&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Además de la compatibilidad de infraestructura, también debes tener en cuenta posibles problemas de compatibilidad de software. Los sistemas de gestión de contenidos populares como WordPress, Joomla y Drupal han añadido soporte para PHP 7 con sus últimas versiones. Los marcos importantes como&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Symfony&lt;/em&gt;&amp;nbsp;y Laravel también disfrutan de un apoyo total. Sin embargo, es hora de una palabra de precaución. Este soporte no se extiende a código de terceros en forma de complementos, plugins, paquetes o lo que sea que ru CMS o framework los llame. Pueden sufrir problemas de compatibilidad y es tu responsabilidad asegurarte de que todo esté listo para PHP 7.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Para los repositorios activos y mantenidos, esto no debería ser un problema. Sin embargo, los repositorios antiguos y sin mantenimiento que carecen de soporte de PHP 7 podrían hacer que tu aplicación entera no fuese utilizable.&lt;/div&gt;
&lt;h2 id=&quot;el-futuro-de-php&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El futuro de PHP&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La versión de PHP 7 eliminó el código antiguo y obsoleto y allanó el camino para nuevas características y actualizaciones de rendimiento en el futuro. Además, se espera que PHP obtenga optimizaciones de rendimiento adicionales pronto. A pesar de tener algunas pausas de compatibilidad con versiones anteriores, la mayoría de los problemas son fáciles de resolver. Las bibliotecas y los frameworks ahora están migrando su código a PHP 7 haciendo disponible así las últimas versiones. Quiero incentivarte a probar y ver los resultados por ti mismo. Tal vez tu aplicación ya es compatible y espera para usar y beneficiarte de, PHP 7.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;por: &lt;a href=&quot;https://www.toptal.com/resume/vilson-duka&quot;&gt;Vilson Duka&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 19.2px; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;a href=&quot;https://www.toptal.com/php/introducci%C3%B3n-a-php-7-qu%C3%A9-hay-de-nuevo-y-qu%C3%A9-se-ha-ido/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/4058945045868876025/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/php-7-que-hay-de-nuevo-y-que-se-ha-ido.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4058945045868876025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/4058945045868876025'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/php-7-que-hay-de-nuevo-y-que-se-ha-ido.html' title='Introducción A PHP 7: Qué Hay De Nuevo Y Qué Se Ha Ido'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSgexE_YzL5jQMzppzeu8Ss6645oNJpVXAvGgdDI8W_NXYIqrhuD6PcwUtq88QG-sBLQ1ASEmBTu_j1CUUXxlUTiKb-OrHN5h0e2kd4svmskAPABHlftInMe2eKDSOXR1mNH2mbyz-o40/s72-c/PHP-7-Features-that-will-woo-every-PHP-fan.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-2846027231874130527</id><published>2017-06-11T23:59:00.000-03:00</published><updated>2017-06-11T23:59:18.230-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="interface"/><category scheme="http://www.blogger.com/atom/ns#" term="internetofthings"/><category scheme="http://www.blogger.com/atom/ns#" term="iot"/><category scheme="http://www.blogger.com/atom/ns#" term="smarthome"/><title type='text'>Hogar Inteligente Hogar: Domesticando El Internet De Las Cosas</title><content type='html'>&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;La tecnología del hogar inteligente está en auge. A pesar de las proyecciones lucrativas para el mercado, y la cantidad en incremento de siempre de dispositivos conectados, tenemos aún que ser testigos de un gran impacto social desde la adopción del consumidor dentro del hogar. Como momento crítico potencial al acecho, hay bastantes debates alrededor de la privacidad, integración y otros temas técnicos. Y aún así, parece haber menos especulación en cuanto a por qué los consumidores aún no se han subido al vagón de la emoción, o cómo la vida doméstica ha mejorado. Considerando cuán personal es un hogar, ¿debería ser preocupante que aquellos haciendo publicidad de estos productos hablan menos sobre la calidad de vida que de datos, energía y ‘seguridad’? ¿Es acaso la adopción de la&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/it/are-we-creating-an-insecure-internet-of-things&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3976cb; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Internet de las Cosas&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;dentro de nuestros hogares algo inevitable? ¿O acaso ya está aquí?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;img alt=&quot;Interface de Hogar Inteligente&quot; src=&quot;https://uploads.toptal.io/blog/image/92213/toptal-blog-image-1457422095807-10eaeaa9b63ae577a9ff3acd6c2cd683.jpg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 id=&quot;algn-lugar-cerca-del-futuro&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algún Lugar Cerca Del Futuro&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La persona inteligente regresa a su certificada casa inteligente de&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: border-box; font-weight: 600; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;‘Internet - de - las - Cosas’&lt;/span&gt;&amp;nbsp;después de un largo día de trabajo. El&amp;nbsp;&lt;a href=&quot;http://august.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;sistema de seguridad inteligente&lt;/a&gt;&amp;nbsp;siente que la persona inteligente está sola e inicia la secuencia de ‘Noche de Viernes En Casa’. Por dentro, un intercomunicador con una voz de madre estandarizada sugerirá que la persona inteligente ordene comida esta noche. La persona inteligente descarga sus cosas en la cocina donde la&amp;nbsp;&lt;a href=&quot;http://thesmartstove.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;hornalla inteligente&lt;/a&gt;&amp;nbsp;muestra una selección de comida a domicilio, en vez de la usual guía de recetas. Luego del arribo de la comida, la persona inteligente irá a la sala de estar para relajarse y mirar un poco de televisión vistiendo sólo su ropa interior. La&amp;nbsp;&lt;a href=&quot;http://internet-tvs-review.toptenreviews.com/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;televisión inteligente&lt;/a&gt;&amp;nbsp;prepara una selección de maratones de Netflix categorizadas por estados de ánimo. La persona inteligente elige: ‘¿Quieres que te suban el ánimo? Lista de Comedia’, y antes de que el show comience, la persona inteligente revisará una serie de gráficos que mostrará datos propios de actividad y dieta durante el día. Una lista de tips para vivir inteligentemente se generará al fondo, una de las cuales dice que basado en la cantidad de noches consecutivas en la cual la Persona Inteligente ha estado sola, deberían considerar una selección de sitios de citas populares en vez de mirar televisión esta noche. Al toque de un dedo, la persona inteligente acepta una solicitud e instantáneamente una cantidad de perfiles son exhibidos, cada uno elegido de una lista de preferencias generada por la Persona Inteligente. De repente, una cantidad de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;pings&lt;/em&gt;&amp;nbsp;y mensajes de esperanzadores que también están en su casa llenan la pantalla. El intercomunicador de la casa inteligente repite en voz alta ‘¡Tienes un email!’. La persona inteligente juega con el control remoto y - ooops - el televisor toma una selfie en respuesta a la cantidad de pings. Su imagen, sentado y vistiendo sólo su ropa interior y comiendo fideos aparece brevemente en la pantalla antes de ser enviada al éter. La cadena de mensajes se duplica sólo para congelar el sistema, causando que la casa inteligente tenga que ser reiniciada. La casa se oscurece, y en la pantalla apagada de la televisión inteligente se refleja la imagen de la persona inteligente de nuevo, finalmente sola.&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;hogar-inteligente-hogar&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Hogar Inteligente Hogar&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con el debate y los titulares acerca del&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/designers/ui/touch-the-world-is-our-interface&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Internet de las Cosas&lt;/a&gt;, y la cantidad de dispositivos conectados y tasaciones de mercado - ¿queda alguien para preguntar sobre qué pasará a la casa cuando el Hogar Inteligente tome control? El tener una casa es una de las más viejas tradiciones que tenemos como humanos. ¿Acaso la existencia del Hogar Inteligente significa el fin del hogar como lo conocemos?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El hogar es el lugar original donde construimos nuestra identidad y marcamos nuestro lugar en el mundo - el perfil original. Cada generación ha formado su morada radical como su perspectivas marcas en el mundo. Podemos ahora mirar hacia atrás a esos hogares del pasado como ventanas a las vidas pasadas de esas generaciones, sus valores y ambiciones. ¿Qué dirá nuestro Hogar Inteligente de nosotros? O quizás, en lugar de eso, ¿qué le está diciendo al resto de las personas?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;La Historia del Hogar Inteligente&quot; src=&quot;https://uploads.toptal.io/blog/image/92214/toptal-blog-image-1457422167327-cb702f401f56cdc8f7c2decffe694a11.jpg&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;una-breve-historia-sobre-el-hogar-automatizado&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Una Breve Historia Sobre El Hogar Automatizado&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El proceso hacia el hogar automatizado comenzó hace casi dos siglos. Cuando conectamos nuestros hogares por primera vez, la bombilla de luz nos dio la noche. Ya no más el hombre estaría encerrado a los límites del sol. La tecnología ofrecía liberación de las horas naturales del día. Un tiempo después, los electrodomésticos reemplazaron las herramientas y todo lo que se movía, o podía moverse, obtuvo energía a través de baterías. La primera generación del hogar automatizado prometía un mejor desempeño a cambio de tiempo de ocio. Más tiempo para la familia, u ofrecerle a la ama de casa una chance para que pueda perseguir su carrera. El hogar automatizado nos liberó de la necesidad de mantenerlo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora bien, la tendencia tecnológica continúa llevándonos a través de la siguiente generación a una nueva domesticidad, y aunque siempre habrá lamentos por lo que ha pasado, quizá el cambio no sea tan malo. Si hay una nueva liberación, tal vez es la liberación de estar en casa. La liberación de sentarnos y permitirle al mundo visitarnos por dentro. La libertad del exterior. La libertad de los unos con los otros. Sin embargo, esta vez, ¿puede esta libertad venir con un costo?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El hogar es el dispositivo de seguridad original - la pared de fuego original. Pero ahora, mientras le permitimos al mundo entero flotar a través de nuestras paredes y dentro de nuestras casas, ¿hemos desinflado el concepto entero de nuestra casa, el cual ha existido por milenios? Hablamos de seguridad y privacidad ahora en el contexto de sistemas técnicos y hardware pero, ¿hemos olvidado lo que originalmente la privacidad significa? En los espacios donde una vez tuvimos la mayor intimidad, nos exponemos completamente al invitar al mundo entero a nuestras casas. ¿Debemos perder el hogar para adoptar el Hogar Inteligente? Considerando la aceptación a nivel mundial de que la privacidad ha muerto, estos pensamientos pueden ser obsoletos de ser escuchados por desarrolladores y diseñadores web. El punto en realidad es fundamentalmente cuestionar qué es lo que nos ofrece el Hogar Inteligente a cambio de lo que debemos darle. Entonces, ¿vale la pena ese trato? ¿LA vida doméstica mejorará como lo hizo durante las primeras generaciones de automatización? O, ¿cómo nos aseguramos, especialmente como la&amp;nbsp;&lt;a href=&quot;https://www.toptal.com/front-end&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;comunidad&lt;/a&gt;&amp;nbsp;que se tomará parte de este cambio, de que al menos alguna cantidad de domesticidad sea salvada?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;img alt=&quot;Sólo En Casa Con El Internet de las Cosas&quot; src=&quot;https://uploads.toptal.io/blog/image/92215/toptal-blog-image-1457422221361-545deb6d43874bdf6addc62aa7037dcf.jpg&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 id=&quot;el-estado-del-internet-de-las-cosas&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Estado Del Internet De Las Cosas&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Internet de las Cosas es uno de esos monstruosos términos del momento que cuando los escuchamos, sabemos de su significancia, y aún así es probable que sepamos mucho menos sobre sus efectos tangibles. Podremos escuchar que hay estimaciones de 200 mil millones de dispositivos siendo conectados en un futuro cercano, o que el valor del mercado se proyecta a 80 mil millones de dólares. Los números tienen significancia similar de la misma forma en la que sabemos que la Tierra está a 92.2 millones de millas del sol. Son números muy importantes, y aún así mucho de nosotros no entendemos las especificaciones, o le damos importancia a esos números de forma diaria. Todo lo que la mayoría de las personas quiere saber en muchos casos es: ¿cómo va a esto a cambiar, o mejorar nuestra vida?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Qué es lo que resiste a que adoptemos a la tecnología inteligente para el hogar con la misma ubicuidad que los teléfonos inteligentes de hoy? Considera las fases tempranas de la tecnología de los smartphones, ¿qué causó que dieran el gran salto de un dispositivo de nicho, a ser ajustados en la cadera de casi cada persona y sus abuelos?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los smartphones existieron desde hace casi una década antes de que el mercado viera un auge significativo. El lanzamiento del iPhone en 2007 generó un giro mayor porque Apple quería ser el primero en diseñar y comerciar el dispositivo para uso diario. Los elementos que el iPhone introdujeron o mejoraron parecían ser ajustes sutiles de interfaces, y aún así fueron capaces de catalizar un giro mayor. Entonces, ¿qué podría ser ese punto crítico, o producto para los hogares inteligentes?&lt;/div&gt;
&lt;h2 id=&quot;el-problema-con-los-productos-de-nicho&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El Problema Con Los Productos De Nicho&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Parece que todos los días sale un producto nuevo para hogares inteligentes con los cuales decorar tu propio hogar, y aún así con cada nueva aplicación aparece un nuevo dispositivo, con un nuevo control remoto que podría conectarse con otra nueva app en tu smartphone. No importa cuán potencialmente útiles sean estos dispositivos, parecen ser novedad y excesivos sin ser asociados con un propósito más grande.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Recientemente, Yves Behar publicó los diseños para un sistema de rastreo de un jardín conectado llamado Edyn. El sistema contiene dos productos, uno para monitorear la tierra, y otra para responder a los datos rastreados y regar el jardín cuántas veces sea necesario. Con esos datos, la app puede recomendar qué plantas son las más fáciles de cultivar, y qué puede necesitar el producto para florecer.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Parece muy útil - ¿Pero es lo suficientemente necesario para ser ampliamente adoptado, o para realmente cambiar la forma en la que cuidamos nuestros jardines? Especialmente considerando que para muchos, la jardinería es una actividad placentera. Las personas por lo general utilizan esta actividad como una herramienta de meditación. De hecho, hay un estudio reciente sugiriendo que mientras más feliz la persona es, más ejercen la jardinería, y mientras más una persona hace justamente eso, más felices son. Entonces, ¿qué es exactamente lo que sugiere Edyn que puede mejorar sobre este proceso de jardinería que no tuviese antes? Si la jardinería se convierte en algo más fácil, ¿qué más hay para ganar en cuanto a tiempo en el día? Tal vez ahora la jardinería inteligente puede hacer que miremos otro episodio más en Netflix, en vez de regar el jardín por nuestra cuenta. ¡Con suerte, algún día no tendrán que levantar un dedo verde nunca más! Imagina todos los episodios que podrían ser vistos en Netflix.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ahora, no quiero tomar como punto a Edyn, pero a lo que voy es que esta herramienta representa la mayor cantidad de tecnología de hogar inteligente hoy en día. Mucho de ello sería genial de tener, creo, pero no parece valer la pena todo el costo y esfuerzo.&lt;/div&gt;
&lt;h2 id=&quot;entonces-qu-sigue&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Entonces, ¿Qué Sigue?&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El problema con la tosca interacción entre múltiples apps ahora es clara para el mercado porque hay un empujón definitivo hacia quienes pueden desarrollar el ‘núcleo’ para todos los dispositivos de hogares inteligentes. Algunos de los jugadores más importantes por ahora son SmartThings, Wink, incluso Apple está generando un momento a través de Apple TV, y Amazon tiene el dispositivo llamado Echo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Sin embargo, no hay por ahora alguien a la cabecera, ni tampoco demasiadas casas han comenzado a adoptar la tecnología. Lo que parece faltar es, al igual que con el caso del iPhone, es la interfaz apropiada que pueda aliviar el dolor de cabeza de la tecnología del hogar inteligente que se interponga en el camino de la conveniencia.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La mayor parte del proceso que estas tecnologías están intentando mejorar no son exactamente molestias mayores - apagar luces, poner algo de música, etc. Entonces, si la experiencia es difícilmente más disfrutable, la nueva tecnología no será adoptada.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Un producto, Josh.ai, ha reconocido esta necesidad de cohesión entre dispositivos, y su manifiesto se enfoca en la interfaz. Josh.ai anticipa la necesidad para que los programas desarrollasen y construyesen a través del tiempo junto con el usuario. Eventualmente, ciertos comandos se memorizaron a tal punto que Josh.ai sabrá que cada mañana debería lentamente prender las luces, prender el noticiero de la mañana, y preparar una taza de café. La interfaz toma cualquier peso de elegir entre apps, y en en cambio responde a comandos por voz para manejar todos los dispositivos conectados. Josh.ai es promocionado como tu mejor amigo en casa. Incluso le hablas como si fuera tu mejor amigo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Josh.ai basa su producto alrededor del uso de la voz en vez de cualquier otra interfaz. Esto podría ser un movimiento crítico para la tecnología del hogar inteligente. La plataforma de Josh.ai esencialmente pregunta cómo puede el usuario programar su casa de la forma más fácil. La esperanza es que incluso procesos complejos como rutinas matutinas puedan ser programadas por voz, y luego memorizadas para futuras instancias. “Hey Josh, cuando llegue a casa ¿podrías prender las luces, poner el horno a 300 grados, y quizá poner algo de música de Frank Sinatra? ¡Llevaré a un amigo!”.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Si Josh.ai es uno de los centros más potenciales y optimistas que la tendencia del Hogar Inteligente para moverse a la siguiente fase, ¿qué nos dice su manifiesto sobre la ambición de de qué podemos esperar de la tecnología en el futuro?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Muchas veces la frase “haz de tu vida algo más fácil y productivo” aparece en mucho de estos manifiestos. Pero, si mucho de estos núcleos ofrecen es el control autónomo de pequeñas cosas como luces y música, entonces ¿qué tan fáciles se vuelven nuestras vidas? ¿Puede todo esto comprarse con la transición de escobas a aspiradoras?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Los tres puntos esenciales de Josh.ai son: ahorro de energía desconsiderado, conciencia continua de los dispositivos, y un sistema más en cadena. ¿Cómo estos valores se comparan a tecnologías pasadas que significativamente liberaban a la persona común? En los manifiestos de muchos de estos dispositivos centrales, hay difícilmente algún lenguaje que parezca remótamente humano.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque los beneficios de algunos de esos productos son decepcionantes, el problema es que incluso la más pequeña de las cosas propone un riesgos significante. Tomemos a Nest como ejemplo, ¿qué podría ser más inofensivo que un termostato? Y sin embargo en su corto tiempo de vida, Nest ha sido denunciado por la venta de información sobre incendios caseros alrededor de la industria de las compañías de seguros.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Incluso si el Centro del Hogar Inteligente fuese tu ‘mejor amigo’, ¿quieres que tu mejor amigo sepa todo sobre tus preferencias? ¿Cuánto le permitimos realmente a nuestros mejores amigos que sepan sobre nosotros? ¿Les decimos que nos sentimos solos? ¿Qué perfiles miramos en internet? Incluso si nuestro mejor amigo es bueno guardando secretos, ¿les diríamos todo? ¿Sobre aquella vez?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En cualquier momento que alguien se queje sobre lo que es inevitable, se los percibe como un orador quejoso. Pero esta es una transición extraña donde parece que muchos de estos productos no han ganado demasiado, y aún así hay un riesgos significante en qué puede ser perdido si las tecnologías son adoptadas. ¿No se siente extraño que en el último siglo nuestros padres y abuelos marchaban por privacidad, y que ahora nosotros la estemos entregando tan ansiosamente?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;color: #303030; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0.14px;&quot;&gt;por: &lt;b&gt;Ken Mundle&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px;&quot;&gt;Articulo vía: &lt;/span&gt;&lt;b style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px;&quot;&gt;&lt;a href=&quot;https://www.toptal.com/designers/interactive/hogar-inteligente-hogar-domesticando-el-internet-de-las-cosas/es&quot; style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px;&quot;&gt;Toptal&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/2846027231874130527/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/hogar-inteligente-hogar-domesticando-el-internet-de-las-cosas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2846027231874130527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/2846027231874130527'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/hogar-inteligente-hogar-domesticando-el-internet-de-las-cosas.html' title='Hogar Inteligente Hogar: Domesticando El Internet De Las Cosas'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1994917754886445503.post-8583381701531659893</id><published>2017-06-04T20:05:00.000-03:00</published><updated>2017-06-04T20:05:26.051-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bad design"/><category scheme="http://www.blogger.com/atom/ns#" term="best practices"/><category scheme="http://www.blogger.com/atom/ns#" term="digital design"/><category scheme="http://www.blogger.com/atom/ns#" term="industrial design"/><category scheme="http://www.blogger.com/atom/ns#" term="longevity"/><title type='text'>Deja De Crear Basura: Una Guía Para Diseñar Interfaces Que Duren Mucho Tiempo</title><content type='html'>&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Somos una sociedad que constantemente arroja cosas a la basura, de moda rápida a obsolescencias manufacturadas en nuestros dispositivos, mucho de lo que compramos se tira a la basura en menos de un año. Los productos comienzan a deteriorarse demasiado rápido o son reemplazados por más nuevo, brillante o moderno.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No solo esto es terrible desde una perspectiva de sustentabilidad, pero cuando algo está diseñado para ser reemplazado de forma casi inmediata, significa que estamos creando literalmente basura.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV7ixPxx6Xtu0D4ydPQZ3JW97PNG4OVJwvz2i8jU_d-ZwrOcp_8WwQA4s_7FCqNHVJyFOAjn9wsVXHBUiekwmj2QppHj4Ng7VCb1axWsS2mySyKzszYQlToLKWWu9VQi1ACsqWX0eNbVI/s1600/toptal-blog-image-1489505850341-3fd4e32b78581526cb896a8341ad781b.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV7ixPxx6Xtu0D4ydPQZ3JW97PNG4OVJwvz2i8jU_d-ZwrOcp_8WwQA4s_7FCqNHVJyFOAjn9wsVXHBUiekwmj2QppHj4Ng7VCb1axWsS2mySyKzszYQlToLKWWu9VQi1ACsqWX0eNbVI/s640/toptal-blog-image-1489505850341-3fd4e32b78581526cb896a8341ad781b.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Lo mismo pasa en el diseño de producto digital. ¿Cuál es el punto de perseguir ciegamente las últimas tendencias si el resultado tendrá que ser reemplazado con un completo rediseño unos meses después? ¿El complicado efecto que buscas lograr con tu infraestructura lo hará defectuoso e inutilizable sólo poco tiempo después de su lanzamiento?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñadores profesionales siempre deben estar atentos de las últimas tendencias en diseño y tecnología, pero los mejores diseñadores encuentran un punto de apoyo firme para desafiar y durar más que cualquier tendencia. Al concentrarse en el problema central que los diseñadores intentaban resolver, también lograron un diseño que ha conseguido durar por muchos años. Los mejores diseños son eternos.&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(240, 240, 240); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 10px; box-sizing: border-box; color: #505050; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.14px; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px 0px 0px 15px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; box-sizing: border-box; font-size: 1.2em; line-height: 1.5em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
“El buen diseño dura muchísimo tiempo. Evade estar de moda y por eso nunca parece anticuado. A diferencia de un diseño que está de moda, este otro dura muchos años–incluso en la sociedad descartable de hoy.”&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Dieter Rams&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;h2 id=&quot;disear-para-la-longevidad&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Diseñar para la longevidad&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque no hay una forma increíblemente segura de capturar un rayo dentro de la botella del diseño inmortal, las siguientes pautas te ayudarán a asegurar tu diseño para el futuro.&lt;/div&gt;
&lt;h3 id=&quot;evade-estar-a-la-moda&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Evade estar a la moda&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Siempre pregúntate esto: ¿Esta nueva tendencia que estoy poniendo en mi diseño algo que soportar las que vengan en el futuro? Las tendencias van y vienen, y depender de la modernidad puede condenar a tu diseño a sentirse antiguo ni bien aparezca la próxima ola de tendencias. Hace mucho tiempo, esto era innovador:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcOWR-Jb9jJrQLf7mtEfP12nhs7i7aPZFWEvPefB5e3skRYwF6aeuYCKcIxIh51Z-w3sHtgir3okDoBxKn8IsMnITHgJgONRDZtltIHGYbDfgR-oZlho14gKqe4lqbFm9c8keFjTdrrAU/s1600/toptal-blog-image-1489505875755-08a94cc4f1af8f0be814c6e39166b428.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;408&quot; data-original-width=&quot;500&quot; height=&quot;522&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcOWR-Jb9jJrQLf7mtEfP12nhs7i7aPZFWEvPefB5e3skRYwF6aeuYCKcIxIh51Z-w3sHtgir3okDoBxKn8IsMnITHgJgONRDZtltIHGYbDfgR-oZlho14gKqe4lqbFm9c8keFjTdrrAU/s640/toptal-blog-image-1489505875755-08a94cc4f1af8f0be814c6e39166b428.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Image credit:&amp;nbsp;&lt;a href=&quot;https://www.buzzfeed.com/hgrant/12-fashion-trends-that-should-never-make-a-come-ba&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Buzzfeed&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Recuerdas aquellos días del diseño del eskeumorfismo, cuando toda interfaz parecía ser cubierta en gradientes excesivos, sombras y texturas como madera y cuero? Lo que comenzó como una forma de hacer uso de las propiedades de objetos análogos del mundo real para ser incluídos en interfaces digitales e incorporar metáforas visuales, se convirtieron en una novedad de pasarela.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las tendencias no son problemáticas por sí solas, pero un buen diseñador puede ver a través de qué es útil. El eskeumorfismo en el diseño por sí mismo resalta la necesidad de que las interfaces digitales reflejen patrones en la realidad. Un control que se vea como un interruptor le da una pista al usuario en cuanto a su significado. La mayoría de los calendarios digitales tendrán fechas ordenadas para verse de la misma forma que el que tienes colgando en tu pared. Los diseñadores han aprendido desde ese entonces que los patrones parecidos al cuero y papel roto son visualmente innecesario y se ven pasados de moda.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh04OmMbtaX9jh2wx9lxglBrOPDn0qZVwwUKTUeULjjIUQCQZZaORO_MVi2Folo32XMiDjai_cTcxFEMQbNl8mpgyQcwuA20BBD6CMXsiaSAJKXQuJYSd3F9QFRAMt5UOWVZivvmFTFMRA/s1600/toptal-blog-image-1489505904049-35eceafdcbf32ed6224cc54c0019f8e4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;496&quot; data-original-width=&quot;788&quot; height=&quot;402&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh04OmMbtaX9jh2wx9lxglBrOPDn0qZVwwUKTUeULjjIUQCQZZaORO_MVi2Folo32XMiDjai_cTcxFEMQbNl8mpgyQcwuA20BBD6CMXsiaSAJKXQuJYSd3F9QFRAMt5UOWVZivvmFTFMRA/s640/toptal-blog-image-1489505904049-35eceafdcbf32ed6224cc54c0019f8e4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;La tendencia de hoy es el montón de pila de basura de mañana. Mira críticamente a lo que es popular y pregúntate por qué lo es, ¿cuál es la necesidad específica la que parece estar refiriéndose? Una vez que excaves pasando la basura, puede que llegues a encontrar un poco de algún tesoro que valga la pena incorporar a tu pensamiento de diseño.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3xZzzhUjnAW-C7AHW28neDVVzTvCrd7rltcpm5-n_CLoMT_2sjQKK5JnxLCA6JalgDO3WcGtnwMcnJKkJT00GxUu21QQOe1AHUgcnzh7gUlqQLA3vyHjfh1NeFLZPS6OVa9AHaa-an1k/s1600/toptal-blog-image-1489505923915-cb153129a9562df36ab13f195562473c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1600&quot; height=&quot;409&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3xZzzhUjnAW-C7AHW28neDVVzTvCrd7rltcpm5-n_CLoMT_2sjQKK5JnxLCA6JalgDO3WcGtnwMcnJKkJT00GxUu21QQOe1AHUgcnzh7gUlqQLA3vyHjfh1NeFLZPS6OVa9AHaa-an1k/s640/toptal-blog-image-1489505923915-cb153129a9562df36ab13f195562473c.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El último diseño de iCal de apple mantiene una conexión visual con la idea de un calendario, pero se deshace de los elementos innecesarios que distraen al usuario propios del eskeumorfismo, los cuales alguna vez fueron “tendencia”. En vez de seguir una tendencia estética específica, la nueva iteración se enfoca sólo en elementos de interfaz que añadan al entendimiento del usuario en la información de qué es lo que hay que hacer con él.&lt;/div&gt;
&lt;h3 id=&quot;mantenlo-simple&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Mantenlo simple&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Como el escritor Antoine de Saint-Exupery dijo, “Un diseñador sabe que ha llegado a la perfección no cuando no hay nada más que añadir, sino cuando no hay nada más para quitar”. A menudo, la evolución del diseño es un proceso progresivo de simplificación. Si comienzas con simplicidad y evades características superfluas o complejidades innecesarias, tu diseño tendrá más espacio para adaptarse cuando sea necesario y evadir modificaciones mayores.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Piensa como el logo de Apple es hoy: sencillo, limpio e icónico. Podrás reconocer el&amp;nbsp;&lt;a href=&quot;http://www.edibleapple.com/2009/04/20/the-evolution-and-history-of-the-apple-logo/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;original por Ronald Wayne&lt;/a&gt;. Mientras que es una hermosa pieza de ilustración, tiene más en común visualmente con una etiqueta de una patente médica del página del siglo 19 que la elegante encarnación que quita el aliento de muchos hoy en día.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJa50H5XyZ1YtVNk-1JGLCrrn5KKVZCJ4laiL89B8ETMght4BGf8VEo6lsybRNqjiwYVeQbW14LFG7fFfWf19mYFD_UFPYbuTNgimn6_PydAxHxRxoq6JfNZ4olSALb9O4QVh9vaTXmj0/s1600/toptal-blog-image-1489505946279-87463fe3d3355bd7e07a6e6d807c46cc.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;490&quot; data-original-width=&quot;341&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJa50H5XyZ1YtVNk-1JGLCrrn5KKVZCJ4laiL89B8ETMght4BGf8VEo6lsybRNqjiwYVeQbW14LFG7fFfWf19mYFD_UFPYbuTNgimn6_PydAxHxRxoq6JfNZ4olSALb9O4QVh9vaTXmj0/s640/toptal-blog-image-1489505946279-87463fe3d3355bd7e07a6e6d807c46cc.gif&quot; width=&quot;444&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpK-LufutZt9Hcn02n0FOr45zb0ALi7_42XIHAX4rTNIrEm8zDsRTuSYW6Jm8bEiEm98VcFp0Du_xWCxLZ3EYHpn1o2rNgxheul4EbC8gMoL5a-vJPgFG5YvqlDkrRFxX1qeoHE_3718/s1600/toptal-blog-image-1489505967926-154705a6b5849fe4f01a219309fdc4bc.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;384&quot; data-original-width=&quot;384&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpK-LufutZt9Hcn02n0FOr45zb0ALi7_42XIHAX4rTNIrEm8zDsRTuSYW6Jm8bEiEm98VcFp0Du_xWCxLZ3EYHpn1o2rNgxheul4EbC8gMoL5a-vJPgFG5YvqlDkrRFxX1qeoHE_3718/s400/toptal-blog-image-1489505967926-154705a6b5849fe4f01a219309fdc4bc.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Image credit:&amp;nbsp;&lt;a href=&quot;http://www.edibleapple.com/2009/04/20/the-evolution-and-history-of-the-apple-logo/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Manzana Comestible&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Cuando se edita un diseño desde su concepto crudo e inicial, piensa sobre el problema que estás intentando resolver. ¿Qué es lo más esencial en el diseño? ¿Qué es lo menos esencial? ¿Puede cualquier cosa ser alejada de la complejidad de tu solución para resolver un problema más simple y elegante? Mientras más enfocado tu diseño esté en la solución, es probable que dure por más tiempo.&lt;/div&gt;
&lt;h3 id=&quot;no-rompas-la-caja&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No rompas la caja&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
¿Cuándo es necesario reinventar la rueda? Pocas veces. Quizá puedas diseñar una interfaz increíble que requiera código complejo y personalizado, y pueda empujar los bordes de tu infraestructura al mismísimo límite para poder conseguir el efecto correcto, ¿pero deberías? ¿Tu solución podrá crear una situación que sea tan rígida que una sola actualización software cause que toda tu casa de naipes se caiga? ¿Tu diseño necesitará ir directamente a la basura porque en realidad rompe la internet?&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Haz uso de patrones familiares en tus diseños y codear dentro de infraestructuras comunes y lenguajes de&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;markup&lt;/em&gt;. No le pidas a tus usuarios tener que bajar cosas extra sólo para que puedan usar tu sitio o app. Tu UI no sólo será más fácil de entender, sino que también más fácil de entender. Piensa sobre todas las veces en las que deberíamos haber elegido no usar Flash.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9PqR2jYEMxCUfTg2C9l2X1CkKd0403UbW3pqHGLffruXdt3bSKbBCIADWPj2UMlsQ8KzzM2HcQElGCFT63047a2-LF2F64j8bar_GfIopFgkRqqFgLWnobruZv-257No3FADpz4arFLE/s1600/toptal-blog-image-1489505990539-82be47830430ab2f87dceaee58afe04c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;538&quot; data-original-width=&quot;957&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9PqR2jYEMxCUfTg2C9l2X1CkKd0403UbW3pqHGLffruXdt3bSKbBCIADWPj2UMlsQ8KzzM2HcQElGCFT63047a2-LF2F64j8bar_GfIopFgkRqqFgLWnobruZv-257No3FADpz4arFLE/s640/toptal-blog-image-1489505990539-82be47830430ab2f87dceaee58afe04c.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Ten una buena justificación y pensamiento para lo que haces. La audacia es el alma del diseño de alto impacto, pero elige tus batallas. Concéntrate en un sola meta para la “magia”, pero juega teniendo las reglas en mente en todo el resto. No sólo eso le ayudará a ese detalle estrella a brillar, sino que te ahorrará a ti y a tu equipo de desarrollo muchos dolores de cabeza.&lt;/div&gt;
&lt;h3 id=&quot;predice-tu-futuro&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Predice tu futuro&lt;/h3&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No, no tienes que invertir en una bola de cristal, pero debes pensar en el futuro. Si quieres que tu diseño dure, tendrás que intentar e imaginar la trayectoria de la solución de diseño. Esta es una de las cosas difíciles de hacer para los diseñadores, pero para ser parte del futuro un diseño debe anticipar, o crear, futuras tendencias.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La cámara instantánea Polaroid, por ejemplo, vio la tendencia de la fotografía casual décadas antes de la&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;selfie&lt;/em&gt;. Al concentrarse en hacer una cámara que capture y desarrolle fotos en el momento, Polaroid satisfació a la cultura moderna concentrada en imágenes y su necesidad siempre creciente de gratificación instantánea—¡Sólo mira la marca de Instagram!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpYbFsyji3fF3safV1QK6n_6JXuyVZaT6xaOgSCxc17IWZOr_Rz0KuHXAymvx-WizyYPDAg8L9HtpJlG_JCDKvkZbI8jTueDVum10U3wBvi4trPmXEBk15WhJebWH2kvcGcDA6Qzz3e5I/s1600/toptal-blog-image-1489506023696-f6c0e040d3a06fce8ec959b71f90ce3b.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;297&quot; data-original-width=&quot;437&quot; height=&quot;433&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpYbFsyji3fF3safV1QK6n_6JXuyVZaT6xaOgSCxc17IWZOr_Rz0KuHXAymvx-WizyYPDAg8L9HtpJlG_JCDKvkZbI8jTueDVum10U3wBvi4trPmXEBk15WhJebWH2kvcGcDA6Qzz3e5I/s640/toptal-blog-image-1489506023696-f6c0e040d3a06fce8ec959b71f90ce3b.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQxwo7BCy5IDBYjPFLgnpijoLjETYlA8Ir0Mzb_eD6jThumnfeDyhi-zU-s8D48ZH5wH2LM1avlpzrV53fg-qES72IrBJGG75Y59Hns3DuQ3U-4TkU-nXe4P-aNdlx2zK-Mxqm4RmymE/s1600/toptal-blog-image-1489506023704-19874a1c5ea83c3db13a44dec750b930.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;1600&quot; height=&quot;510&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQxwo7BCy5IDBYjPFLgnpijoLjETYlA8Ir0Mzb_eD6jThumnfeDyhi-zU-s8D48ZH5wH2LM1avlpzrV53fg-qES72IrBJGG75Y59Hns3DuQ3U-4TkU-nXe4P-aNdlx2zK-Mxqm4RmymE/s640/toptal-blog-image-1489506023704-19874a1c5ea83c3db13a44dec750b930.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Image credit:&amp;nbsp;&lt;a href=&quot;http://www.polaroid.com/snap-touch&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Polaroid&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
No sólo es Polariod el ancestro de la selfie, sino que el diseño es tan exitoso que incluso las supercomputadoras en nuestros bolsillos pueden tomar fotos digitales en alta resolución de forma ilimitada en el momento, y por eso la foto Polaroid en su formato físico es aún inmensamente popular.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Observa el problema que estás resolviendo e intenta imaginar las siguientes etapas en la evolución de su uso–¡quizá puedas predecir el futuro! Como dijo el analista en sistemas Alan Kay, “la mejor forma de predecir el futuro es inventándolo”.&lt;/div&gt;
&lt;hr style=&quot;background: rgb(228, 228, 228); border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; height: 1px; letter-spacing: 0.14px; margin: 3em 0px;&quot; /&gt;
&lt;h2 id=&quot;observar-diseos-atemporales-para-inspirarte&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Observar diseños atemporales para inspirarte&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Algunos de los mejores diseños han logrado superar su contexto original para volverse atemporales. A continuación, unos ejemplos de diseños que han persistido relativamente sin cambiar.&lt;/div&gt;
&lt;h3 id=&quot;el-sistema-de-estantera-de-dieter-rams&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El sistema de estantería de Dieter Rams&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz15QdQ_xOPrlRIvYxfQFzGjxYIsR61AVjfExIJvmoM7YIQ4i6YCG1VfMk2movu2K5Gmf4s-XUmGWLLYuvLWRFa6tzXNpbABecYetC3lx8_BrGuFdnqdClvq8ztzvN92Pr9Rxkw62T4GQ/s1600/toptal-blog-image-1489506041978-cda231cc8cb08c838d738581597da358.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1067&quot; data-original-width=&quot;1600&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz15QdQ_xOPrlRIvYxfQFzGjxYIsR61AVjfExIJvmoM7YIQ4i6YCG1VfMk2movu2K5Gmf4s-XUmGWLLYuvLWRFa6tzXNpbABecYetC3lx8_BrGuFdnqdClvq8ztzvN92Pr9Rxkw62T4GQ/s640/toptal-blog-image-1489506041978-cda231cc8cb08c838d738581597da358.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En uno de los 10 Mandamientos del Buen Diseño, el diseñador industrial y arquitecto Dieter Rams dice que un buen diseño debería durar mucho tiempo. El sistema de estantería de Dieter Rams hace uso de la simplicidad y modularidad permitiendo a decenas de configuraciones que se adapten a cualquier contexto o necesidad. Quizá sea por eso que el sistema de Ram ha sobrevivido relativamente sin cambiar desde los años 60 y puede ser encontrado en uso alrededor del mundo.&lt;/div&gt;
&lt;h3 id=&quot;la-pgina-del-home-de-google&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La página del home de Google&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuW1z90sVNoLQPbfM0IVusuk6VOomAbbT3iu2Pve_DAAIQzEcJ6KBM_l3_61A1EiCk4sGN4JEvItqgOQGOi6PQjQj9rRwZuXA4FTxHq5Ee937v90KO6XrRrAjaW2USr_iviSoTjmHgK2M/s1600/toptal-blog-image-1489506080177-ba5999d06bf3cb601bfe6c8ae5209866.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;889&quot; data-original-width=&quot;1600&quot; height=&quot;354&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuW1z90sVNoLQPbfM0IVusuk6VOomAbbT3iu2Pve_DAAIQzEcJ6KBM_l3_61A1EiCk4sGN4JEvItqgOQGOi6PQjQj9rRwZuXA4FTxHq5Ee937v90KO6XrRrAjaW2USr_iviSoTjmHgK2M/s640/toptal-blog-image-1489506080177-ba5999d06bf3cb601bfe6c8ae5209866.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Google comenzó su vida como un motor de búsqueda competitivos como muchos otros a fines de los años del siglo 20. Google se familiarizó con el concepto de búsqueda de manera muy diferente a comparación de su competencia. Un logo, una barra de búsqueda y un botón, y la opción de “me siento con suerte”. La simplicidad fue audaz y persuasivo.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Avancemos rápidamente unos veinte años aproximadamente, y la página del home es casi igual. Hay sólo una barra de búsqueda y un botón. Ah, y la opción de “me siento con suerte” también está ahí, también.&lt;/div&gt;
&lt;h3 id=&quot;la-silla-eames&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La silla Eames&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0pFrU5wF3-OymnLfVb_nxQtVDfLBmhonjLTFY_LRQPKDsfDiXXcTVaXlDzvd9IKMVfmBJYUSpZ6rOB0dvohSx26lwuU4_vIUdXRNyWCuckfqSaVawDtFk_3zyEV2kTmvUX-M4xq_lU0I/s1600/toptal-blog-image-1489506098193-2fb4e22100fbb764bad9a5e19af29a89.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;1200&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0pFrU5wF3-OymnLfVb_nxQtVDfLBmhonjLTFY_LRQPKDsfDiXXcTVaXlDzvd9IKMVfmBJYUSpZ6rOB0dvohSx26lwuU4_vIUdXRNyWCuckfqSaVawDtFk_3zyEV2kTmvUX-M4xq_lU0I/s640/toptal-blog-image-1489506098193-2fb4e22100fbb764bad9a5e19af29a89.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de la imagen:&amp;nbsp;&lt;a href=&quot;http://www.hermanmiller.com/products/seating/lounge-seating/eames-lounge-chair-and-ottoman.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Herman Miller&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La silla de salón icónica Eames y otomana debutaron casi hace medio siglo atrás en 1956. El diseño simple, con madera contrachapada moldeada sobre tapizado de cuero resolvía un problema simple de proveer a una silla simple de oficina algo más cómodo para una siesta. Cincuenta años después, el mismo diseño simple es aún distinguido como es funcional. Aquí hay un vistazo a&amp;nbsp;&lt;a href=&quot;http://www.eamesoffice.com/blog/10-most-iconic-eames-lounge-chair-spottings/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;las 10 más icónicas sillas Eames&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6PdWnwqjT3x1876o9qXCClgN0DE_pVbZG1y5nMltWBQZW5nAt53gcQqwzD7XM6Axk7C2zvVBDkFPhcVurHbw7o5bfh0VZS_YFCXbrnIPWoJYXiZQOGo2mKE6fGXWgTXBXUOHOTDRDdQ/s1600/toptal-blog-image-1489506117082-6d32d99876c5dc7415141ee01cd71d5a.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;577&quot; data-original-width=&quot;736&quot; height=&quot;500&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6PdWnwqjT3x1876o9qXCClgN0DE_pVbZG1y5nMltWBQZW5nAt53gcQqwzD7XM6Axk7C2zvVBDkFPhcVurHbw7o5bfh0VZS_YFCXbrnIPWoJYXiZQOGo2mKE6fGXWgTXBXUOHOTDRDdQ/s640/toptal-blog-image-1489506117082-6d32d99876c5dc7415141ee01cd71d5a.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Jim Henson in Eames Lounge. Image credit:&amp;nbsp;&lt;a href=&quot;http://www.eamesoffice.com/blog/10-most-iconic-eames-lounge-chair-spottings/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Eames Office&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;twitter&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Twitter&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIcnhzhGGeI-rdZn4ElK67yDFHUgOhKpxac2lOuK_VZvqiiShu17uHMhLyMwdZfiSkbjyc3zIvufypvFJtsk3QX4UMpmzHh1e5Oz4g0jz4PIFqUxWjYg99EQ5VIewaTrTRzKRbEdrqy6M/s1600/toptal-blog-image-1489506157954-88c1eee0ae26cdcd59255896db7abefa.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;508&quot; data-original-width=&quot;1600&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIcnhzhGGeI-rdZn4ElK67yDFHUgOhKpxac2lOuK_VZvqiiShu17uHMhLyMwdZfiSkbjyc3zIvufypvFJtsk3QX4UMpmzHh1e5Oz4g0jz4PIFqUxWjYg99EQ5VIewaTrTRzKRbEdrqy6M/s640/toptal-blog-image-1489506157954-88c1eee0ae26cdcd59255896db7abefa.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;Mucho de lo que hace Twitter especial es su fidelidad con el concepto de ser breve. Twitter es el haiku de las redes sociales—un límite de 140 caracteres impuesto en cada publicación hace que los usuarios sean inteligentes, claros y minimalistas. La idea original para&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.lifewire.com/history-of-twitter-3288854&quot; rel=&quot;noopener noreferrer&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3976cb; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;la plataforma comunicacional parecida a los SMS para que amigos compartan breves statuses de actualización fue creado en 2006&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;. Más de diez años después, se ha convertido en una de las plataformas más populares en las redes sociales, valuadas en casi 10 billones de dólares. En vez de limitarse creativamente por el límite de caracteres, unos 300 millones de usuarios de Twitter han innovado desde adentro las coacción sin alterar de difundir los ahora ubicuos conceptos como el&amp;nbsp;&lt;/span&gt;&lt;em style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;hashtag&lt;/em&gt;&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&amp;nbsp;y el&amp;nbsp;&lt;/span&gt;&lt;em style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;retweet&lt;/em&gt;&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHW4IjQ1rzcnfUH1EllyqAfV8a5CG_jXA7tUjl3jvIEBvvKvxxA-0IJwcEWL-N4DYfYoYjHMu3j5H7lYLc3Ps10OhSuemrhV8BmGe1MCConECwHXr53aKVWgWJ0HxvfagmL6zgNwpCOjk/s1600/toptal-blog-image-1489506188302-27c5e4a110f862fc41110c1b61adff04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1024&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHW4IjQ1rzcnfUH1EllyqAfV8a5CG_jXA7tUjl3jvIEBvvKvxxA-0IJwcEWL-N4DYfYoYjHMu3j5H7lYLc3Ps10OhSuemrhV8BmGe1MCConECwHXr53aKVWgWJ0HxvfagmL6zgNwpCOjk/s640/toptal-blog-image-1489506188302-27c5e4a110f862fc41110c1b61adff04.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Twitter circa 2012. Crédito de imagen:&lt;a href=&quot;http://seldo.com/weblog/2012/01/22/okay_twitter_its_time_you_stopped_getting_a_free_pass_you_have_fucked_up_your_interface_and&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Seldo&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;las-zapatillas-de-converse-all-star&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Las zapatillas de Converse All-Star&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_CMkz2WjeKGo4pZ9jiQG9TQhgqId6HmLPrhvzpTkEzOsqxPx1KrHN3Y9obpnYwM1c12-0xyr-l439G_iGZH_sW6AB_osKAtO7XqmzSpAKPq25rgh9GsL7NfLNUP2Kgh9HOUJVjhqM57o/s1600/toptal-blog-image-1489506206662-d6043f4ed77281e2558128ccec53fc2c.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_CMkz2WjeKGo4pZ9jiQG9TQhgqId6HmLPrhvzpTkEzOsqxPx1KrHN3Y9obpnYwM1c12-0xyr-l439G_iGZH_sW6AB_osKAtO7XqmzSpAKPq25rgh9GsL7NfLNUP2Kgh9HOUJVjhqM57o/s640/toptal-blog-image-1489506206662-d6043f4ed77281e2558128ccec53fc2c.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de imagen:&amp;nbsp;&lt;a href=&quot;http://www.smithsonianmag.com/innovation/how-chuck-taylor-taught-america-how-play-basketball-180960050/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Smithsonian&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Desde James Dean a Kristen Stewart y desde los Harlem Globetrotters al Doctor, todos parecen al menos tener un par de las icónicas zapatillas. Simple lona enmarcada en suela de goma ligera y con ese tope en la punta de los pies. Aunque está disponible en decenas de colores y patrones visuales, el diseño original&amp;nbsp;&lt;a href=&quot;https://www.sneakerfreaker.com/articles/american-icon-basketball-history-converse-star/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;del zapato de basket de 1920 no ha cambiado demasiado en casi 100 años&lt;/a&gt;, y a sus muchos seguidores les gusta así.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg8GRgWY9zzoCVSo0GYjWPCvuoE4m0P7D6t0wa-h5X3tCDxDNwLptctQ8j-5SKrr-cJNnnAdUNEjjI99M5y_bDZqih5t3mGHe0aJiaRCJ-oY-Y_df_puccpbAGtQaAXNfCdNvZUWdLMQs/s1600/toptal-blog-image-1489506228838-c339c6018074fd0aded36b96af9e5129.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;669&quot; data-original-width=&quot;500&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg8GRgWY9zzoCVSo0GYjWPCvuoE4m0P7D6t0wa-h5X3tCDxDNwLptctQ8j-5SKrr-cJNnnAdUNEjjI99M5y_bDZqih5t3mGHe0aJiaRCJ-oY-Y_df_puccpbAGtQaAXNfCdNvZUWdLMQs/s640/toptal-blog-image-1489506228838-c339c6018074fd0aded36b96af9e5129.jpeg&quot; width=&quot;478&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de imagen:&amp;nbsp;&lt;a href=&quot;http://www.dazeddigital.com/fashion/article/25679/1/converse-chuck-taylor-s&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Dazed Digital&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;craigslist&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Craigslist&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNtL-2CC7iDUg-nQoaznXJRPIXLBisV2ezb1qZS4HAXK6lV9vmiGODEtYn1DEGj8aEIudMBYClArHspKI_C8EfbINOS3GmwhwXV6MoqZ1eOdptCDXGT4b4ChP8G15H6JebwOdIRZkR4m0/s1600/toptal-blog-image-1489506256678-1206ee7a7fcf36d19e5161b445f627fa.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;525&quot; data-original-width=&quot;800&quot; height=&quot;420&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNtL-2CC7iDUg-nQoaznXJRPIXLBisV2ezb1qZS4HAXK6lV9vmiGODEtYn1DEGj8aEIudMBYClArHspKI_C8EfbINOS3GmwhwXV6MoqZ1eOdptCDXGT4b4ChP8G15H6JebwOdIRZkR4m0/s640/toptal-blog-image-1489506256678-1206ee7a7fcf36d19e5161b445f627fa.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;El mercado digital donde puedes encontrar un compañero de habitación, un trabajo de medio tiempo, un futón usado&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.telegraph.co.uk/news/newstopics/howaboutthat/6157363/20-most-bizarre-Craigslist-adverts-of-all-time.html&quot; rel=&quot;noopener noreferrer&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3976cb; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16.8px; letter-spacing: 0.14px; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;una colección de paquetes de ketchup de alrededor del mundo&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;, y todo en el medio. Lanzado como una web de simple esqueleto con una lista categórica de eventos y trabajos en San Francisco, incluso veinte años y decenas de ciudades después, la interfaz del sitio es aún libre de distracciones–ni banners o vistosos elementos de UI pueden encontrarse–lo cual es una gran parte de su magia. Algunos podrán pensar que es muy feo, pero el éxito multimillonario de Craiglist puede ser atribuído a su diseño brutalista de su sitio. Concentrándose en por qué los usuarios están ahí, en vez del placer visual, Craiglist es el lugar al cual recurrir para encontrar un buen departamento o la venta de tu colección de 300 peluches de pingüinos.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhna3UX1gfRj4bQmsD8SjoTnj5D6M92OgERvxi2xuRV7vdTmhklJ0T02DMVBVAZGqkk8NWMaV7tMi4-jldsFvt2WdO9V8c7PtOoH2VC9i_WCYZsI2AFzZT_jhuXka2NPWQJUcH2sBWfqys/s1600/toptal-blog-image-1489506265762-766ccf83a1336905831c79d94a32c868.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;953&quot; data-original-width=&quot;1600&quot; height=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhna3UX1gfRj4bQmsD8SjoTnj5D6M92OgERvxi2xuRV7vdTmhklJ0T02DMVBVAZGqkk8NWMaV7tMi4-jldsFvt2WdO9V8c7PtOoH2VC9i_WCYZsI2AFzZT_jhuXka2NPWQJUcH2sBWfqys/s640/toptal-blog-image-1489506265762-766ccf83a1336905831c79d94a32c868.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #303030; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 16.8px; letter-spacing: 0.14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3 id=&quot;el-logo-de-bmw&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
El logo de BMW&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSbfORMHVgFXmqAp1QgGNfNkxQ4KoUiStJFtxTtpS-kFtD8bC1V_HKNXwUzjRIJEaftr7eaE3qmdfUr_HvQgQ2beW-4xYalHMx0bUSOxRapNMfve1zH_qALzQFVnO7Ew-cZq8J_BsM5Qw/s1600/toptal-blog-image-1489506283011-efeb9c1189c60e86c63c12d3894e1711.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;416&quot; data-original-width=&quot;670&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSbfORMHVgFXmqAp1QgGNfNkxQ4KoUiStJFtxTtpS-kFtD8bC1V_HKNXwUzjRIJEaftr7eaE3qmdfUr_HvQgQ2beW-4xYalHMx0bUSOxRapNMfve1zH_qALzQFVnO7Ew-cZq8J_BsM5Qw/s640/toptal-blog-image-1489506283011-efeb9c1189c60e86c63c12d3894e1711.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de la imagen: Logo Design Love&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Aunque la idea de que el logo deba evocar las hélices giratorias de un avión ha&amp;nbsp;&lt;a href=&quot;http://www.logodesignlove.com/bmw-logo-evolution&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;desacreditado el mito&lt;/a&gt;, el clásico emblema existe aún hoy sin haber sido tocado idénticamente a su concepto original de 1917. La simplicidad limpia de los patrones blancos y azules en los cuadrados (inspirados en la bandera de Bavaria) aún está encerrado con un anillo negro y con las letras de la compañía arriba: BMW.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvveVeve_8KJkAOZCN1vQ9S8y_9lG4RKf82hhuzg6INk_U8ElYG0vneM9MVrmnBYH67AIcvLgfY9Vo7602vpYWQFjh3hJnt_lShpPnr9eruhyphenhyphenq8FLu16WEudmQpKbrAVmPPpmVDVudtb8/s1600/toptal-blog-image-1489506298464-5a86127690339ee1c4d51595b5634f7b.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;250&quot; data-original-width=&quot;500&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvveVeve_8KJkAOZCN1vQ9S8y_9lG4RKf82hhuzg6INk_U8ElYG0vneM9MVrmnBYH67AIcvLgfY9Vo7602vpYWQFjh3hJnt_lShpPnr9eruhyphenhyphenq8FLu16WEudmQpKbrAVmPPpmVDVudtb8/s640/toptal-blog-image-1489506298464-5a86127690339ee1c4d51595b5634f7b.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 id=&quot;la-caja-para-delivery-de-oyster-pail&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
La caja para delivery de Oyster Pail&lt;/h3&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFSKxZbuNFDQ8H1Fg8eqtFw-JzFTUoILVFXtdRVKvdOBmEUXxUO1mkO8oxPxKoQuQMksVtRDzT0aCun22F-9dJdEA3YlbQdTkR8x-usQOuu-aMe60l-NZ8nyO_Qg5NYMQtWWEKq18gT0/s1600/toptal-blog-image-1489506316320-5b503075d0054a6970dc507ed360ff6f.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;525&quot; data-original-width=&quot;700&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFSKxZbuNFDQ8H1Fg8eqtFw-JzFTUoILVFXtdRVKvdOBmEUXxUO1mkO8oxPxKoQuQMksVtRDzT0aCun22F-9dJdEA3YlbQdTkR8x-usQOuu-aMe60l-NZ8nyO_Qg5NYMQtWWEKq18gT0/s640/toptal-blog-image-1489506316320-5b503075d0054a6970dc507ed360ff6f.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de la imagen:&amp;nbsp;&lt;a href=&quot;http://hellogiggles.com/chinese-takeout-boxes/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;HelloGiggles&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Con un objeto tan simplemente sutil que es realmente familiar para ti, probablemente no lo pienses dos veces: el&amp;nbsp;&lt;em style=&quot;border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;oyster pail&lt;/em&gt;, más comúnmente conocido como la caja de delivery que se despliega en su propio plato. Patentes para este ingenioso diseño datan a fines del siglo 19, cuando se servía como transporte para la pesca de ostras. A mitad del siglo 20, sin embargo, a la caja de papel que se dobla se le dio una nueva vida como el contenedor favorito de todo, desde arroz frito a General Tso.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3xE4jMm8dEyAhBdMU8-6bdPOncYOB2_vt7OyjuLGZB4McnsFHlAfLdcltxRB9Vix8amMriwdstuaEB_vIOU-3ddhSpd-mA4Fe97nXl21FzruphXJ9iZs2aCORhEFsvF1zeE_g-Yqzorg/s1600/toptal-blog-image-1489506333097-b2142ca984999964a1643df3e60fdc02.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;620&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3xE4jMm8dEyAhBdMU8-6bdPOncYOB2_vt7OyjuLGZB4McnsFHlAfLdcltxRB9Vix8amMriwdstuaEB_vIOU-3ddhSpd-mA4Fe97nXl21FzruphXJ9iZs2aCORhEFsvF1zeE_g-Yqzorg/s640/toptal-blog-image-1489506333097-b2142ca984999964a1643df3e60fdc02.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de imagen:&amp;nbsp;&lt;a href=&quot;http://www.cbsnews.com/news/small-wonders-of-design-the-chinese-take-out-box/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;CBS News&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&quot;deja-de-crear-basura-concntrate-en-detalles-y-un-diseo-que-dure-bastante&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #3863a0; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.14px; line-height: 1.3em; margin: 2em 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Deja de crear basura. Concéntrate en detalles y un diseño que dure bastante&lt;/h2&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
En un mundo de ritmo rápido, es fácil para incluso brillantes diseñadores a entrar y salir de sus momentos de inspiración y existencia sólo para ser reemplazados o finalmente ser olvidado. La evolución es un proceso necesario no sólo en el mundo natural, sino también en el mundo de diseño.&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #303030; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.2em; letter-spacing: 0.14px; line-height: 1.5em; margin-bottom: 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
Nuestros productos creativos deben, a menudo, adaptarse rápidamente para estar a la par con los cambios en la tecnología y cultura. Sin embargo, al mirar a través de las tendencias, concentrarse en la solución, y anticipando el futuro, tus diseños podrán ser algún día atemporales como&amp;nbsp;&lt;a href=&quot;https://www.warnerbros.com/archive/spacejam/movie/jam.htm&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;el sitio de Space Jam&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0y-pVpnb13xlhgh6uIX_5D66pCnnQV1l9_Y8DyL5t_bv1T3bVeHyCcf8nN8MPnxUMvuqAAHWCwZRxZD7rNdta_-lNnJbhVfRzqfxcL-XydiTCmxRqfhE9x1J4bJG4jfJLmmteO-fHMtw/s1600/toptal-blog-image-1489506349654-35e565ff4c96144f1a7fef8688c3591a.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;394&quot; data-original-width=&quot;700&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0y-pVpnb13xlhgh6uIX_5D66pCnnQV1l9_Y8DyL5t_bv1T3bVeHyCcf8nN8MPnxUMvuqAAHWCwZRxZD7rNdta_-lNnJbhVfRzqfxcL-XydiTCmxRqfhE9x1J4bJG4jfJLmmteO-fHMtw/s640/toptal-blog-image-1489506349654-35e565ff4c96144f1a7fef8688c3591a.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;pop_out_box is-full_width is-big&quot; style=&quot;background: rgb(250, 250, 250); border: 0px; box-sizing: border-box; color: #505050; float: none; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 1.3em; letter-spacing: 0.14px; line-height: 1.5em; margin: 0px 30px 15px 0px; min-height: 0px; min-width: 0px; overflow: hidden; padding: 1em 1.5em; text-align: center; vertical-align: baseline; width: 864px;&quot;&gt;
Crédito de imagen:&amp;nbsp;&lt;a href=&quot;https://www.warnerbros.com/archive/spacejam/movie/jam.htm&quot; rel=&quot;noopener noreferrer&quot; style=&quot;border: 0px; box-sizing: border-box; color: #3976cb; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot; target=&quot;_blank&quot;&gt;Space Jam&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;blog_author_big_banner is-active&quot; data-ga-action=&quot;ClickedOnHireTheAuthor_bottom&quot; data-ga-label=&quot;stop-making-garbage-a-guide-to-designing-interfaces-that-last&quot; data-view=&quot;content#bottom_banner&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; margin: 0px; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;h2 style=&quot;border: 0px; box-sizing: border-box; line-height: 1.3em; margin: 0px 0px 1em; min-height: 0px; min-width: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
 
 
 &lt;style type=&quot;text/css&quot;&gt;
  @page { margin: 2cm }
  h2.cjk { font-family: &quot;Noto Sans CJK SC Regular&quot; }
  h2.ctl { font-family: &quot;FreeSans&quot; }
  p { margin-bottom: 0.25cm; line-height: 120% }
 &lt;/style&gt;


&lt;/h2&gt;
&lt;h2 class=&quot;western&quot; style=&quot;border: none; margin-bottom: 0cm; margin-top: 0cm; padding: 0cm;&quot;&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;freesans&amp;quot; , sans-serif; font-size: small;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;por:
&lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/designers/resume/bree-rubin&quot;&gt;Bree Chapin&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;
Articulo vía: &lt;/span&gt;&lt;a href=&quot;https://www.toptal.com/designers/visual-identity/deja-de-crear-basura-una-gu%C3%ADa-para-dise%C3%B1ar-interfaces-que-duren-mucho-tiempo/es&quot;&gt;Toptal&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davidg-tech.blogspot.com/feeds/8583381701531659893/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/deja-de-crear-basura-una-guia-para-disenar-interfaces-que-duren-mucho-tiempo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/8583381701531659893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1994917754886445503/posts/default/8583381701531659893'/><link rel='alternate' type='text/html' href='http://davidg-tech.blogspot.com/2017/06/deja-de-crear-basura-una-guia-para-disenar-interfaces-que-duren-mucho-tiempo.html' title='Deja De Crear Basura: Una Guía Para Diseñar Interfaces Que Duren Mucho Tiempo'/><author><name>David Gonzalez</name><uri>http://www.blogger.com/profile/18195676274893854932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV7ixPxx6Xtu0D4ydPQZ3JW97PNG4OVJwvz2i8jU_d-ZwrOcp_8WwQA4s_7FCqNHVJyFOAjn9wsVXHBUiekwmj2QppHj4Ng7VCb1axWsS2mySyKzszYQlToLKWWu9VQi1ACsqWX0eNbVI/s72-c/toptal-blog-image-1489505850341-3fd4e32b78581526cb896a8341ad781b.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>