<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[ECLaboratorio - Medium]]></title>
        <description><![CDATA[Trabajamos con equipos autónomos y autosuficientes enfocados a la creación de productos útiles, sencillos y que consigan mayor satisfacción del cliente - Medium]]></description>
        <link>https://medium.com/eclaboratorio?source=rss----90914c0e356e---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>ECLaboratorio - Medium</title>
            <link>https://medium.com/eclaboratorio?source=rss----90914c0e356e---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 00:17:09 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/eclaboratorio" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[La importancia de los procesos de QA (Cómo lo hacemos en El Confidencial)]]></title>
            <link>https://medium.com/eclaboratorio/la-importancia-de-los-procesos-de-qa-c%C3%B3mo-lo-hacemos-en-el-confidencial-95af8b5718d0?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/95af8b5718d0</guid>
            <category><![CDATA[labs]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[el-confidencial]]></category>
            <category><![CDATA[qa]]></category>
            <dc:creator><![CDATA[Julio Muñoz Gallarin]]></dc:creator>
            <pubDate>Wed, 03 Feb 2021 14:33:59 GMT</pubDate>
            <atom:updated>2021-02-04T11:06:08.916Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/555/0*UsidGFUMYeDwPFiF.png" /><figcaption>imagen obtenida de <a href="https://worldofagile.com/blog/agile-test-pyramid/">https://worldofagile.com/blog/agile-test-pyramid/</a></figcaption></figure><p>Hoy en día todo desarrollo empresarial de cierta complejidad debe realizarse usando todo tipo de técnicas de QA como pueden ser los tests de aceptación, unitarios, motores de integración continua, herramientas de calidad de código… Todas estas técnicas proporcionan mucho beneficio al largo plazo, aunque a corto plazo, mientras se sufre la curva de aprendizaje y los cambios en los procesos, pueda parecer todo lo contrario.</p><p>El testing es importante por muchos motivos, pero si queremos traducirlos a KPIs de negocio para que la gente de producto lo comprenda y os ayude a convencerlos, os dejo aquí tres motivos que os ayudarán:</p><ul><li>Disminución del tiempo dedicado a corrección de bugs, con el consecuente <strong>aumento del tiempo disponible para crear producto nuevo</strong></li><li>Disminución de los bugs en producción en partes que ya funcionaban, <strong>mejorando la experiencia y percepción de calidad de tu site</strong> de los usuarios.</li><li>Disminuir el tiempo de testing manual liberando a la gente de producto del mismo, <strong>proporcionándoles así mucho más tiempo para la creación y evolución de producto</strong>.</li></ul><p>Nosotros en El Confidencial realizamos los siguientes pasos para asegurar la calidad de nuestros productos:</p><h4>1. Buenas prácticas, patrones de diseño y comportamiento</h4><p>En primer lugar animamos y formamos a nuestros desarrolladores para que usen las buenas prácticas, intenten cumplir principios SOLID y sean capaces de aplicar patrones de diseño (Command, executor, visitor, decorator…) para cumplir con nuestros objetivos de tener el código lo más desacoplado y modular posible para que esto nos garantice mucha velocidad de desarrollo y simplifique la programación de cada parte del mismo</p><h4>2. Test unitarios</h4><p>Todo desarrollo, ya sea de front o de back, debe ir con sus tests unitarios implementados y con la mayor cobertura posible (hay que testear tu negocio, no hace falta testear un método “get” anémico), para tener cubierta cada pieza de nuestro código y garantizar tanto el buen funcionamiento de la funcionalidad nueva como la posible regresión en un futuro.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/777/1*K7n_RMlCkzbnYXMjWXsSMg.png" /></figure><h4><strong>3. Tests de Linting y estándares de código internos</strong></h4><p>Analizamos la calidad de nuestro código para detectar posibles errores como pueden ser:</p><ul><li>Clases con muchos métodos</li><li>Métodos con muchas líneas</li><li>Variables declaradas sin uso</li><li>Posible uso de algunos patrones</li><li>Estándares definidos por el propio equipo como puede ser el uso de PSR-12, uso del PHP-DOC etc</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8YVhzeU9SSf6m3Y2wEEecw.png" /></figure><h4><strong>4. Mutantes</strong></h4><p>Para que nuestros tests unitarios sean realmente útiles y no simplemente tests que cubren cobertura utilizamos librerías que nos lanzan tests de mutación de código. Estos tests básicamente lo que realizan son pasadas de tu suit de tests y entre cada pasada mutan el código fuente de tus clases para detectar que realmente los tests comprueban la lógica de negocio programada. Si te cambian una condición y no se rompe un tests… algo mal está en ese test!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/751/1*k79LM8lIkW60kYda63FqlA.png" /></figure><h4><strong>5. Tests funcionales o de UI</strong></h4><p>Para comprobar que al usuario no le falla nada en su experiencia creamos tests funcionales o de UI de todo lo que suponga una iteración del usuario con el interfaz de la aplicación, ya sea web o mobile. Para esta parte hay que tener en cuenta varios aspectos:</p><ul><li>Tener claros los criterios de aceptación y declarados en el estándar Gherkin, para orientarnos a BDD.</li><li>Solo testear de inicio el “happy path.”</li><li>Crear nuevos tests de UI solo tras el reporte de un bug para demostrar y reproducir el propio bug y su existencia.</li></ul><p>Ejemplo de declaración del test en modo Gherkin</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/731/1*PbK80kC9LZBat-HuYJOdvQ.png" /></figure><p>y ejemplo de cómo se visualiza en la suite de Cypress</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AEiEUO_h663J21Cz9J6taA.png" /></figure><h4>6. Test manual de la funcionalidad nueva</h4><p>Una vez el desarrollador da por terminado toda la parte de QA de su funcionalidad, junto con el desarrollo de la misma, se pasa a probar manualmente, por parte de otro compañero, la funcionalidad para salirnos del happy path e intentar encontrar problemas en el desarrollo</p><h4>7. Code Reviews</h4><p>Por último, teniendo ya pasadas todas las fases anteriores, se pueden realizar los pull request, donde hay una revisión del código por parte de varios compañeros para garantizar la calidad del mismo, detectar problemas en los acuerdos de trabajo acordados etc</p><h4>8. Releases</h4><p>Automáticamente los jueves a las 15:00 horas se saca una rama release con todas las funcionalidades que se han integrado hasta ese momento, cosa que nos permite hacer el siguiente paso que es el de realizar las “review de producto” y “bugfixing” de errores funcionales, diseño o negocio encontrados en las “reviews”, sin que le afecte el hecho de que se estén integrando nuevas funcionalidades en la rama de integración que saldrán en la siguiente release a la actual.</p><p>Además dicha release se comunica al canal interno de Slack para que todo el mundo sea cosciente de su creación y de qué es lo que ha entrado en la misma</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mBXWKMIZXUJUMG6njiV9CA.png" /></figure><h4>9. Review</h4><p>Una vez hemos garantizado este nivel de calidad la tarea puede ser revisada por los stakeholders para verificar que cumple todo lo que se ha acordado con dicha funcionalidad y tenemos su ok para su integración en la rama de integración y poder ser desplegada a producción</p><h4>10. Integración continua</h4><p>Es muy importante disponer de una herramienta de integración continua que, una vez se van integrando todas las funcionalidades individuales, verifique que todos los tests unitarios, funcionales y de calidad de código siguen pasando y todo está en verde. En nuestro caso usamos GOCD como dicho motor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IHFFrpjUcudlG1jqGSTnzw.png" /></figure><h4>11. Sonarqube</h4><p>También es fundamental tener una herramienta como Sonarqube que te permite detectar estos problemas de Linting y más reglas customizadas que hemos definido para nuestros desarrollos y mantener su evolución, así como asígnar responsables para su resolución en el caso de tenerlos. También nos permite definir reglas de límites de código duplicado y cobertura como, por ejemplo, nunca bajar la cobertura global de un proyecto con una subida, mínimo ha de mantenerse.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/968/1*A3Z893bhZ5BG930jaGkAyQ.png" /></figure><h4>12. Deployment automático</h4><p>Por último es fundamental tener un sistema de despliegue automatizado para eliminar el factor humano de la ecuación y así minimizar los errores en la puesta en producción del código nuevo de la release que se está sacando. Para este paso también usamos la herramienta de GOCD</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/674/1*_hyMHhrNGPAHhpkTn3ZGxA.png" /></figure><h4>13. Performance sintético del front en producción</h4><p>Como el SEO para nosotros es muy importante tenemos todo tipo de métricas para controlar que el performance en el front no se degrade por una subida. Hemos definido budgets para todas ellas y disponemos de un sistema de monitoreo y también un semáforo visual que nos permite tener todas ellas controladas. Algunas de esas métricas son:</p><ul><li>Time to interactive</li><li>Número de elementos en el DOM</li><li>Total de peticiones</li><li>Respuesta del servidor</li><li>CLS</li><li>FID</li><li>LCP</li><li>Tamaño del js</li><li>Tamaño del css</li><li>…</li></ul><p>Para ello usamos una herramienta que se llama speedcurve. Aquí os dejo un pantallazo de cómo se ve</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Oo2b_D3wcPj6r1Ru_PTAjQ.png" /></figure><h3>Next Steps</h3><p>Los siguientes pasos que queremos introducir para seguir creciendo en la calidad de los productos que usamos son los siguientes:</p><p><strong>1 Tests de performance en backend en la integración continua: </strong>Introduciremos la herramienta de Blackfire para que nos indique cómo es el performance de cada parte de nuestro backend para poder introducir budgets de performance tambien en backend e impedir una subida si alguna parte incumple su budget.</p><p><strong>2. Performance y Alertas del front en producción en casos reales: </strong>En este caso lo que se pretende es poder tener información real de usuarios, con una gran variedad de navegadores y sistemas operativos, para poder tener una información más fiable de tiempos, métricas, budgets y errores.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=95af8b5718d0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/la-importancia-de-los-procesos-de-qa-c%C3%B3mo-lo-hacemos-en-el-confidencial-95af8b5718d0">La importancia de los procesos de QA (Cómo lo hacemos en El Confidencial)</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Demystifying iOS Animations, Part 2]]></title>
            <link>https://medium.com/eclaboratorio/demystifying-ios-animations-part-2-49db33e62628?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/49db33e62628</guid>
            <category><![CDATA[mobile-application]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[movil]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Fernando Moya de Rivas]]></dc:creator>
            <pubDate>Tue, 12 Mar 2019 10:24:10 GMT</pubDate>
            <atom:updated>2019-03-12T10:24:10.851Z</atom:updated>
            <content:encoded><![CDATA[<h4>Mastering layer animations and understanding the importance of timing and dividing.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*UxwHdy0qSxiTjnSoZIpLCA.jpeg" /></figure><p>This is <em>Part 2</em> of a series of tutorials whose purpose is to help <em>iOS</em> programmers better understand the potential ofCoreAnimation framework. The animations described in this article are based on <em>CSS</em> <a href="http://tobiasahlin.com/spinkit/">SpinKit</a> library. You can find the <em>iOS</em> implementation “SpinKitFramework” <a href="https://github.com/fermoya/SpinKit">here</a>.</p><p>In the previous article we talked about view and layer animations. We went over CALayer class and finally implemented two beautiful <em>spinners</em>. In this last part we’ll focus on another spinner from the SpinKit library, the f<em>olding cube spinner, </em>which<em> </em>is the most difficult and complete of the set.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*9qTnY-2s_S_kB5z0YY2EcQ.gif" /><figcaption><em>Folding cube spinner</em></figcaption></figure><h4>Analysis</h4><p>This one is a bit of a total challenge, isn’t it? Give yourself a minute, what do you see here? What is happening? There’s for sure more than one solution. Think about the “actors in the play”, the time they show up, the different effects you see here…</p><p>Let’s take a look at the facts. In this animation, it looks like there’s a mix of:</p><ul><li>Rotations</li><li>Fade-in and fade-out</li><li>Color darkening</li></ul><p>All this happen to affect four squares… is it? Here’s what’s happening behind the scenes:</p><ul><li>The view has a sublayer which is a CAReplicatorLayer that, we know, replicates its sublayer the number of times we set it to. In this case, four times aCAShapeLayer .</li><li>Our instance of CAReplicatorLayer applies an instanceTransform so that each cube is rotated.</li><li>Each instance of the CAReplicatorLayer runs an animation which could be divided in two parts. First, the layer rotates and shifts while darkening, leaving a blank space behind. It starts fading out while this motion occurs so that it’s gone the moment it overlaps the contiguous cube. When all cubes are gone, they animation “reverses” and for that, it keeps the rotation motion but fading in this time.</li><li>The view that contains all these layers is rotated as well.</li><li>The transform applied to the CAReplicatorLayer makes it look like each cube rotates from a different angle.</li></ul><p>But wait, something’s missing. If there was 4 squares appearing and disappearing we would be aware of 8 rotations. That’s right, there are 3 of time fading out and 3 showing up. The missing one never fades out completely. You can see it better here:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*APJ2N_tpS98ZXmcQZRSVHA.jpeg" /><figcaption>1st fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*EEvJonoHtJUXBge8_UOj1A.jpeg" /><figcaption>2nd fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*ljoVMY_th0k5MqF0GZyj1g.jpeg" /><figcaption>3rd fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*Qsh8yi7ETSvHhRLuRfulAg.jpeg" /><figcaption>4th fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*0iB1m953zgKDa4qwwOpQgw.jpeg" /><figcaption>5th fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*iTCXGDqZ8RO8arSlJWiPpA.jpeg" /><figcaption>6th fold</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*CNnJwqNRu54fs378nrgbNw.jpeg" /><figcaption>7th fold</figcaption></figure><p>In terms of simplicity, it’s better to have two differentCAReplicatorLayer . One will replicate 4 instances that will fade out and the other one will have 3 that will fade in. By adjusting the timing we’ll manage to have this half-fade-in-half-fade-out effect at the middle.</p><h4>Implementation</h4><p>Before we start with the coding, I encourage you to take a look at my <a href="https://github.com/fermoya/SpinKit">repository</a> in <em>GitHub</em> as I won’t be sharing all the code in this article. If you’re not sure how the code works or where you should put this code, take a look the previous article <a href="https://medium.com/@fmdr.ct/demystifying-ios-animations-part-1-fd5fbcd45ee9"><em>Demystifying iOS Animations, Part 1</em></a>.</p><p>Okay so first let’s create the replicator layers and set them up:</p><pre>let fadeOutDiamondLayer = CAShapeLayer()<br>let fadeInDiamondLayer = CAShapeLayer()<br>let fadeOutReplicatorLayer = CAReplicatorLayer()<br>let fadeInReplicatorLayer = CAReplicatorLayer()</pre><pre>fadeOutReplicatorLayer.instanceCount = 4<br>fadeOutReplicatorLayer.addSublayer(fadeOutDiamondLayer)</pre><pre>fadeInReplicatorLayer.instanceCount = 3<br>fadeInReplicatorLayer.addSublayer(fadeInDiamondLayer)</pre><p>Don’t forget to tell the CAShapeLayer how it should render. fadeInDiamondLayer will be originally transparent:</p><pre>fadeOutDiamondLayer.fillColor = UIColor.green.cgColor<br>fadeOutDiamondLayer.strokeColor = UIColor.green.cgColor</pre><pre>fadeInDiamondLayer.fillColor = UIColor.green.cgColor<br>fadeInDiamondLayer.strokeColor = UIColor.green.cgColor<br>fadeInDiamondLayer.opacity = 0</pre><p>Add the layers to your custom view and make it rotate Double.pi / 4 <em>radians</em>:</p><pre>layer.addSublayer(fadeOutReplicatorLayer)<br>layer.addSublayer(fadeInReplicatorLayer)</pre><pre>transform = CGAffineTransform(rotationAngle: .pi / 4)</pre><p>Position the layers in the view so that they’re visible and take all the available space in the view:</p><pre>let diamondFrame = bounds.applying(CGAffineTransform(scaleX: 0.5, y: 0.5))</pre><pre>fadeOutDiamondLayer.frame = diamondFrame<br>fadeOutDiamondLayer.path = UIBezierPath(rect: diamondFrame).cgPath</pre><pre>fadeInDiamondLayer.frame = fadeOutDiamondLayer.frame<br>fadeInDiamondLayer.path = fadeOutDiamondLayer.path</pre><pre>fadeOutReplicatorLayer.frame = bounds<br>fadeInReplicatorLayer.frame = fadeOutReplicatorLayer.frame</pre><p>Set the rotation transform to CAReplicatorLayer:</p><pre>fadeOutReplicatorLayer.instanceTransform = CATransform3DRotate(CATransform3DIdentity, .pi / 2, 0, 0, 1)</pre><pre>fadeInReplicatorLayer.instanceTransform = fadeOutReplicatorLayer.instanceTransform</pre><p>We’re all set now for the animation. Why don’t we give another look? Based on the analysis we did above, we’ll need:</p><ul><li>opacity animation so that fadeOutDiamondLayer vanishes.</li><li>another opacity animation so that fadeInDiamondLayer shows apps (remember it’s hidden).</li><li>transform animation to rotate both diamond layers.</li><li>fillColor animation to darken both diamond layers and give the user a better notice of the 3D rotation.</li><li>Set up the timing and delay of all these animations so that they start at the right time.</li></ul><p>Having all this into account, let’s start by defining some constants we’ll use to set up each of them:</p><pre>let darkGreen: UIColor = UIColor(red: 0, green: 0.78, blue: 0.32, alpha: 1)</pre><pre>let totalDuration: Double =  4<br>let delayFactor = 0.2</pre><pre>let effectiveDuration = (1 - delayFactor) * totalDuration<br>let individualDuration = effectiveDuration / Double(2 * fadeOutReplicatorLayer.instanceCount)</pre><p>totalDuration is the number of seconds our animation will take in completing plus the delay at the end before start repeating. effectiveDuration is the real duration of “each lap” and individualDuration is number of seconds each diamond will take to rotate.</p><p>As some of the animations (rotation, darkening and fading in/out) happen at the same time, we can use a CAAnimationGroup to set up some common properties such as duration or fillMode . Another use of CAAnimationGroup is to delay the next run of the animations it contains and that’s something we’ll use later.</p><p>Okay, why don’t we start with the rotation? Here is the code for that:</p><pre>var transform = CATransform3DRotate(CATransform3DIdentity, CGFloat.pi, 0, 1, 0)<br>transform.m34 = -1 / 200</pre><pre>// Why not use transform.rotate.y?<br>let rotateAnim = CABasicAnimation(keyPath: &quot;transform&quot;)<br>rotateAnim.fromValue = CATransform3DIdentity<br>rotateAnim.toValue = transform<br>rotateAnim.timingFunction = CAMediaTimingFunction(name: .linear)<br>rotateAnim.duration = individualDuration</pre><p>Why are we using a CATransform3D rather than just using <em>transform.rotation.y </em>as keyPath and then setting the values in <em>radians</em>? What does the m34 property mean and why that value? Well, this is out of scope but rotations can be expressed as a matrix (see more info <a href="https://en.wikipedia.org/wiki/3D_projection#Perspective_projection">here</a>) . The property m34 simply tells us the inverse distance to the <em>projection plane z</em>. By changing its value we’ll get a much more realistic rotation as we’ll be achieving a 3D-like perspective.</p><p>One more thing: we need to indicate the anchorPoint in both diamondLayers. This property sets where the rotation axis is placed:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/323/1*acBQzjOpqfHswRuKZ5PB_g.png" /></figure><p>The default is (0.5, 0.5) which means the layer will rotate around its center. We don’t want this as we need the layer to rotate around one of its edges so we need to change it. This will affect the final position of the layer as it’ll be shifted.</p><pre>fadeOutDiamondLayer.anchorPoint.x = 1<br>fadeInDiamondLayer.anchorPoint.x = fadeOutDiamondLayer.anchorPoint.x</pre><p>Once this is has been dealt with, we can go on with the fillColoranimation. In this case, we need a CAKeyframeAnimation as the we need the animation to start and end with the same value:</p><pre>let colorAnim = CAKeyframeAnimation(keyPath: &quot;fillColor&quot;)<br>colorAnim.values = [UIColor.green.cgColor, darkGreen.cgColor, UIColor.green.cgColor]</pre><pre>colorAnim.keyTimes = [0, 0.5, 1]<br>colorAnim.duration = individualDuration</pre><p>As for the opacity animation, we’ll use a CAAnimationGroup as a wrapper of a CABasicAnimation . This way, the animation last value will be still rendered as the group (used as a wrapper) is delaying it.</p><pre>let fadeOutAnim = CABasicAnimation(keyPath: &quot;opacity&quot;)<br>fadeOutAnim.fromValue = 1<br>fadeOutAnim.toValue = 0<br>fadeOutAnim.fillMode = .forwards<br>fadeOutAnim.duration = individualDuration</pre><pre>let fadeOutWrapper = CAAnimationGroup()<br>fadeOutWrapper.animations = [fadeOutAnim]<br>fadeOutWrapper.duration = effectiveDuration / 2</pre><p>This wrapper is a key of the animation as it wouldn’t work unless we used it. Finally, we need to add all this animations to another group so that they’re delayed till the cube has showed up again. We’ll set an instanceDelay for the replicator layer as well:</p><pre>let fadeOutAnimGroup = CAAnimationGroup()<br>fadeOutAnimGroup.animations = [fadeOutWrapper, rotateAnim, colorAnim]<br>fadeOutAnimGroup.duration = totalDuration<br>fadeOutAnimGroup.repeatCount = .infinity</pre><pre>fadeOutReplicatorLayer.instanceDelay = individualDuration<br>fadeOutDiamondLayer.add(fadeOutAnimGroup, forKey: nil)</pre><p>THAT’S IT! Now we have the first part of the animation, the fading out of the diamonds. Now we need to do the same to fade in the hidden cubes:</p><pre>let fadeInAnim = CABasicAnimation(keyPath: &quot;opacity&quot;)<br>fadeInAnim.fromValue = 0<br>fadeInAnim.toValue = 1<br>fadeInAnim.fillMode = .forwards<br>fadeInAnim.duration = individualDuration</pre><pre>let fadeInWrapper = CAAnimationGroup()<br>fadeInWrapper.animations = [fadeInAnim]<br>fadeInWrapper.duration = fadeOutWrapper.duration</pre><pre>let fadeInAnimGroup = CAAnimationGroup()<br>fadeInAnimGroup.animations = [fadeInWrapper, rotateAnim, colorAnim]<br>fadeInAnimGroup.duration = totalDuration<br>fadeInAnimGroup.beginTime = CACurrentMediaTime() + effectiveDuration / 2<br>fadeInAnimGroup.repeatCount = .infinity</pre><pre>fadeInReplicatorLayer.instanceDelay = individualDuration<br>fadeInDiamondLayer.add(fadeInAnimGroup, forKey: nil)</pre><p>The only difference is we’re delaying when it starts to run so that we get effect we’re looking for. Note we’re creating a newopacity animation and not reusing the existing one. This is because we’re adding it to a CAAnimationGroup and not directly to the layer so reusing it might affect the previous animation.</p><p>If you’ve got to this point you’ll hopefully have a beautiful spinner ready to use in your App. I hope helped you understand layer animations and give you some insights about how to divide and structure your animations.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=49db33e62628" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/demystifying-ios-animations-part-2-49db33e62628">Demystifying iOS Animations, Part 2</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Demystifying iOS Animations, Part 1]]></title>
            <link>https://medium.com/eclaboratorio/demystifying-ios-animations-part-1-fd5fbcd45ee9?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/fd5fbcd45ee9</guid>
            <category><![CDATA[movil]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Fernando Moya de Rivas]]></dc:creator>
            <pubDate>Mon, 11 Mar 2019 09:49:38 GMT</pubDate>
            <atom:updated>2019-03-11T09:49:38.660Z</atom:updated>
            <content:encoded><![CDATA[<h4>Mastering layer animations and understanding the importance of timing and dividing.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JaDJnW9AKWyEgRGsBHWdGA.jpeg" /></figure><p>How many times have you struggled with an animation in your App? You had this whole idea of how to do it, you’d seen some tutorials and you knew the basics. How come it isn’t working this time? How frustrating, isn’t it? I mean, it can’t be that hard: it’s one of the keys for an App to look friendly, different, appealing… all in all, to gain an audience for your App.</p><p>Here is what’s happening, my friend:</p><blockquote>The problem when coding an animation is not the framework itself. The problems is YOU and the way you interpret how the animation you want to make actually works, how you divide the task into simpler tasks.</blockquote><p>WHAT!!!??? I ain’t no problem, dude. I’m done with this…</p><p>Okay, that might’ve been a little rough, my apologies. What do I mean by this? Well, I recently ran into this beautiful library, <a href="http://tobiasahlin.com/spinkit/">SpinKit</a>, written in <em>CSS</em>. There are several implementations of this library for <em>iOS. </em>As a challenge, I wanted to code it myself. I ended up losing a bunch of time messing around because I didn’t think it through and I impulsively went for it without thinking of how it actually worked every single animation.</p><p>The results of my experiment you can find <a href="https://github.com/fermoya/SpinKit">here</a>. This series of tutorials are based in what I learned from this experience. We’ll introduce a bit of CoreAnimation and then we’ll get to code some of the animations in <a href="http://tobiasahlin.com/spinkit/">SpinKit</a>.</p><h4>View vs Layer animations</h4><p>Let’s give this a quick look to understand the difference between them and when to choose one or another. What’s a <em>View Animation</em>?</p><pre>// Inside custom View<br>UIView.animate(withDuration: 0.4) { [weak self] in<br>    self?.transform = CGAffineTransform(scaleX: 2, y: 2)<br>}</pre><p>Here above the size of the view is doubling as a result of the <em>View Animation</em>. Below you can find the same effect by means of a layer animation:</p><pre>// Inside custom View<br>let anim = CABasicAnimation(keyPath: &quot;transform.scale&quot;)<br>anim.fromValue = 1<br>anim.toValue = 2<br>anim.duration = 0.4<br>anim.isRemovedOnCompletion = false<br>anim.fillMode = .forwards<br>layer.add(anim, forKey: nil)</pre><p>What’s the difference between both animations? In the first one we are actually changing the size of the view whereas in the second one we are changing the size of the layer. But not the size of the view!</p><p>What does this mean? Imagine your custom view is a UIButton. If you double the layer size you might expect the interaction surface to have doubled too, but that’s not the case. Actually, have a look at the properties isRemovedOnCompletion and fillMode . In order for the layer to keep the animation at its final state we needed to say: “<em>hey, don’t remove after you’re finished”</em> and <em>“keep your final state.”</em></p><p>All in all, UIView is a wrapper of CALayer. All the animations you can make for UIView you can make for CALayer but not the other way around. Among the UIView properties you can animate these are the most common:</p><ul><li>frame (never animate its bounds property)</li><li>backgroundColor</li><li>alpha (the property isHidden isn’t animatable)</li><li>transform (I like this one a lot. Usually it’s the one I use for its simplicity. You’ll see it soon)</li><li>constraints (don’t forget to call layoutIfNeeded method on the view that holds them)</li></ul><p>I rather use layer animations as they provide many more properties to animate, they are technically more efficient and have a better performance than view animations, although it’s barely noticeable. Also, if you want to do “magic” in <em>iOS </em>you’ll have to end up learning about CoreAnimation one way or another.</p><p>What can you animate on CALayer? Basically, any property exposed in its interface:</p><ul><li>opacity</li><li>frame</li><li>cgPath</li><li>backgroundColor</li></ul><p>You just have to use the name of the property as the keyPath when instantiating the animation.</p><h4>Working with CALayer</h4><p>CALayer exposes a great deal of properties so we’ll just talk about those which we’ll use through this tutorial. First of all, let’s instantiate a CALayer , position it inside your custom UIView and add it as a sublayer:</p><pre>// 1<br>let myFirstLayer = CAShapeLayer()</pre><pre>// 2.1<br>myFirstLayer.frame = bounds</pre><pre>// 2.2<br>myFirstLayer.bounds = bounds<br>myFirstLayer.position = CGPoint(x: bounds.width / 2, y: bounds.height / 2)</pre><pre>// 3<br>layer.addSublayer(myFirstLayer)</pre><p>What’s have we just done?</p><ol><li>Instantiate a CAShapeLayer . This is a subclass of CALayer and it’s the one you’ll probably use the most. There are other interesting subclasses as we’ll see such as CATextLayer to render text, CAReplicatorLayer to replicate a layer and CAEmitterLayer to render a system of particles.</li><li>Set the layer frame, that is its size and origin. This can be done in two different ways. Either you set the frame of the layer or its bounds and position . Don’t be confused by the last one. It sets the layer position, not its origin.</li><li>Add the layer to an instance of UIView which is the class in charge of drawing and rendering in <em>iOS.</em></li></ol><p>Facts to have in mind:</p><ul><li>Instantiate and add the layer as sublayer of the view just once. I normally do it in viewDidMoveToWindow method, although you could also use an init.</li><li>Set the layer frame when the view has been rendered and laid out, otherwise the result won’t be as expected. You should code this part in layoutSubviews method.</li></ul><p>How do we actually tell the CAShapeLayer what we want to render? We can either tell the layer to draw an image:</p><pre>let someImage: UIImage = ...<br>myFirstLayer.contents = someImage</pre><p>Or we can use a path to define the layer:</p><pre>myFirstLayer.path = UIBezierPath(ovalIn: rect).cgPath<br>myFirstLayer.fillColor = UIColor.blue.cgColor</pre><p>Now that we have understood how layers work, let’s move on to animations.</p><h4>Double bounce spinner</h4><p>Have a look at this first <em>spinner</em> and try to figure out how it works.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*JyGDqUTuHJ37fr15rlW0Lw.gif" /><figcaption>Double bounce spinner</figcaption></figure><p>As I said at the beginning of the article, the key for this is to figure out the best way to accomplish a “complex task” by dividing it into simpler ones and synch them so that they beautifully work together as expected. Taking a look at the <em>GIF</em>, this <em>spinner</em> is composed by two concentric circles. When the outer circle shrinks, the inner one expands and viceversa.</p><p>Let’s get to work!. In your custom view add the properties:</p><pre>private var outerCircleLayer = CAShapeLayer()<br>private var innerCircleLayer = CAShapeLayer()</pre><p>Then in the didMoveToWindow method, let’s add these two layers to the view layer and set their style.</p><pre>layer.addSublayer(innerCircleLayer)<br>layer.addSublayer(outerCircleLayer)<br>innerCircleLayer.fillColor = UIColor.blue.cgColor<br>outerCircleLayer.fillColor = UIColor.blue.cgColor</pre><p>Set their content and position in the view inside layoutSubviews:</p><pre>outerCircleLayer.path = UIBezierPath(ovalIn: bounds).cgPath<br>outerCircleLayer.frame = bounds</pre><pre>/* We&#39;re using a CGAffineTransform to easily define innerCircleLayer<br>path rect as half the size of outerCircleLayer bounds */</pre><pre>innerCircleLayer.path = UIBezierPath(ovalIn: outerCircleLayer.bounds.applying(CGAffineTransform(scaleX: 0.5, y: 0.5))).cgPath</pre><pre>innerCircleLayer.frame = CGRect(origin: CGPoint(x: bounds.width / 4, y: bounds.height / 4), size: innerCircleLayer.path!.boundingBox.size)</pre><p>Note how we defined innerCircleLayer bounds. Isn’t it cool how easy it is to modify an existing CGRect? No need for calculations, just apply a CGAffineTransform to scale, rotate, or translate a CGRect . All this as part of the CoreGraphics framework.</p><p>And finally, the animation itself. The cool thing about layer animations is that you can reuse them as they’re copied when added to a layer. That way you can just change some of its properties and use the same object for another layer:</p><pre>// 1<br>let anim = CABasicAnimation(keyPath: &quot;transform.scale&quot;)<br>anim.fromValue = 1<br>anim.toValue =  0.5<br>anim.timingFunction = CAMediaTimingFunction(name: .easeIn)<br>anim.duration = 0.4</pre><pre>// 2<br>anim.autoreverses = true<br>anim.repeatCount = .infinity</pre><pre>// 3<br>outerCircleLayer.add(anim, forKey: nil)</pre><pre>outerCircleLayer.add(anim, forKey: nil)</pre><pre>// 4<br>anim.fromValue =  0<br>anim.toValue =  1</pre><pre>innerCircleLayer.add(anim, forKey: nil)</pre><ol><li>Create the animation to scale the outer circle layer. Set bothfromValueand toValue properties so that its size is divided by 2.</li><li>Set it as reversible and make it repeat endlessly.</li><li>Add the animation to the outer circle. The animation is copied and you’re free to change your CAAnimation instance and reuse it.</li><li>Reuse the animation for the inner layer. Change its fromValueand toValue so that it starts with a size of zero and then grows till its real size.</li></ol><p>Simple, right? We’ve analysed the animation and divided it into two different animations which run at the same time, with no delay between each other. Let’s look at another example now.</p><h4>Wave spinner</h4><p>In this case, the <em>spinner</em> is composed by five parallel bars which increment their size with a delay between each other. Finally, the whole animation takes some time before starting over.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*JfvJUPUi77G9g0I3Xh9ADA.gif" /><figcaption>Wave spinner</figcaption></figure><p>One might think of instantiating five different layers but for this case we’re going to introduce the CAReplicantLayer . This kind of CALayer replicates each of its sublayers and applies some “offset accumulative transformation” to each instance. Among these transformations you have:</p><ul><li>instanceRedOffset , instanceGreenOffset and instanceBlueOffset to change the color of the layer.</li><li>instanceTransform to rotate, scale or translate the layers.</li><li>instanceDelay to apply some delay to the animations run by its sublayers.</li></ul><p>The code needed for this animations looks like this:</p><pre>// 1<br>let barsReplicatorLayer = CAReplicatorLayer()<br>barsReplicatorLayer.instanceCount = 5</pre><pre>let barLayer = CAShapeLayer()<br>barLayer.fillColor = UIColor.blue.cgColor</pre><pre>// 2<br>barsReplicatorLayer.addSublayer(barLayer)<br>layer.addSublayer(barsReplicatorLayer)</pre><pre>let barRect = CGRect(origin: .zero, size: CGSize(width: bounds.width / 6, height: bounds.height))<br>barLayer.path = UIBezierPath(rect: barRect).cgPath</pre><pre>barLayer.bounds = barLayer.path!.boundingBox<br>barLayer.position = CGPoint(x: bounds.midX, y: bounds.midY)</pre><pre>// 3<br>barsReplicatorLayer.instanceTransform = CATransform3DTranslate(CATransform3DIdentity, CGFloat(barsReplicatorLayer.instanceCount) * barRect.width / 4, 0, 0)</pre><pre>barsReplicatorLayer.frame = bounds</pre><ol><li>Instantiate CAReplicatorLayer and set the number of instances it has.</li><li>Pay attention to this: the layer to be replicated MUST be added as a sublayer of your CAReplicatorLayer instance whereas it’s the latter that’s added as sublayer of the view.</li><li>Finally, each instance must be shifted along the X-axis. This translation looks slightly different in code from the one found in CoreGraphics with CGAffineTransformbut it essentially has the same effect.</li></ol><p>Time for animations! Keep in mind that:</p><ul><li>The animation is going to be shared by all five instances of the replicator layer.</li><li>When the animation completes for one instance, it should’t start over right away but “wait” for the rest to finish.</li></ul><pre>// 1<br>let anim = CAKeyframeAnimation(keyPath: &quot;transform.scale.y&quot;)<br>anim.values = [0.4, 1]<br>anim.keyTimes = [0.5, 1]</pre><pre>anim.duration = 0.5<br>anim.autoreverses = true<br>anim.repeatCount = .infinity</pre><pre>// 2<br>anim.fillMode = CAMediaTimingFillMode.backwards<br>anim.timingFunction = CAMediaTimingFunction(name: .easeIn)</pre><pre>barLayer.add(anim, forKey: nil)</pre><pre>// 3<br>barsReplicatorLayer.instanceDelay = anim.duration / Double(barsReplicatorLayer.instanceCount)</pre><ol><li>We introduce CAKeyFrameAnimation . This CAAnimationsubclass interpolates the values at the relative keyTimes to generate the animation. In this case, we’re using it to delay the beginning of the animation.</li><li>As we’re starting the animation setting each instance to be 0.4 times its original size, we need to “fill” the animation in a way the layer is rendered with this scaled size. Otherwise, it would make a weird glitch.</li><li>Finally, we set instanceDelay so that each layer starts at a different time.</li></ol><p>Nice! If you made it this far you should have two beautiful spinners ready to use. In the next chapter <a href="https://medium.com/@fmdr.ct/demystifying-ios-animations-part-2-49db33e62628"><em>“Demystifying iOS Animations. Part 2”</em></a>, I’ll give you more insights about CoreAnimation framework by implementing a new spinner.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fd5fbcd45ee9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/demystifying-ios-animations-part-1-fd5fbcd45ee9">Demystifying iOS Animations, Part 1</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Share your code, make it open source]]></title>
            <link>https://medium.com/eclaboratorio/share-your-code-make-it-open-source-53e11eb84bcd?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/53e11eb84bcd</guid>
            <category><![CDATA[framework]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[showcase]]></category>
            <category><![CDATA[movil]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Fernando Moya de Rivas]]></dc:creator>
            <pubDate>Thu, 08 Nov 2018 17:01:46 GMT</pubDate>
            <atom:updated>2019-01-25T22:41:22.028Z</atom:updated>
            <content:encoded><![CDATA[<p>Any developer has most probably made use of a third party library at some point on their career but not many of them have even considered writing one themselves. They might think what they do isn’t good enough, not well coded or even useless to someone else’s purpose. Nothing further from the truth. In this post I’m gonna tell you about our experience releasing our first Open Source Mobile Framework at ElConfidencial. You can find it <a href="https://github.com/ECLaboratorio/BubbleShowCase-iOS">here</a> for iOS and <a href="https://github.com/ECLaboratorio/BubbleShowCase-Android">here</a> for Android.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*OC5mfEuR4IpGzxgkQyYn8A.png" /><figcaption>Example of use of BubbleShowCase</figcaption></figure><h4>Why would we think of creating our own library?</h4><p>At ElConfidencial we follow Scrum and, truth be told, my Product Owner (PO) and good friend, Juan, is quite picky and is often telling me about design patterns and solutions other great Apps implement. He wanted something very specific and unique as a walkthrough or show case for new features we were to release in future versions and this is how it all started.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/450/1*5RX94i1G4Aay_-JAXp5Bqw.jpeg" /></figure><p>Honestly, I first started by googling “show case”, that’s what every good developer would do. My mom would call me lazy for that, I just applied one of my favorite principles in programming: <a href="https://en.wikipedia.org/wiki/KISS_principle"><em>KISS (Keep it simple, stupid)</em></a>. This is actually meant for new features: don’t try to foresee the future, just meet your requirements because, as Clint Eastwood would say in The Bridges of Madison, “tomorrow is promise to no one”. The same way we could extrapolate this principle and use it here: if there’s something out there that works, it’s tested and it’s free to use, why would you take any time on doing it yourself, “stupid”? We could come up with a couple of reasons:</p><ul><li>There’s nothing similar to what you’re looking for.</li><li>You cannot customize the library you found to meet your PO expectations.</li></ul><p>The latter was our case. The results in Google showed me my PO wouldn’t like the options I’d give him and most importantly: the cost of developing this library was assumable for us.</p><h4>What made us even think of releasing it?</h4><p>When I saw the face of my PO in the Review that Friday when we showed him the result of that Sprint I knew we’d done a wonderful work. And I don’t wanna sound cocky or bragging but we had.Don’t misunderstand me, it’s good to be conscious about your own mistakes… but also about your successes and we were very happy with the results. So happy I’d say that, why not, we thought of making the library public.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*TrZ1QnntuuJxLp0x9FLImQ.jpeg" /></figure><p>Was our framework better than the ones already in the market? Probably not. Was it clean code that we published, fully tested and had high performance? Let me doubt about it.</p><p>Why did we still publish it? We were proud of ourselves and we had something that was different from other available products. We’d been always using others’ code and we wanted to contribute to the community, that’s the goal of all this, right? The same way we’d been making use of third party libraries, others might find ours interesting and use it in their projects. But most importantly: we wanted to improve our skills as developers. Hearing from other developers feedback would help us face new issues, improve the product as well as achieve new knowledge.</p><h4>Have some code that might be useful to others?</h4><p>Here are some steps to follow if you wanna publish it. The first thing to do is refactoring your code, making it clear to the rest. This isn’t just about releasing a first version of your library and forgetting about it: other developers might want to contribute and pull request your repository so making it legible and easy to understand isn’t such a bad idea. As Uncle Code would say, there’s no better documentation than the code itself. Extract new methods and classes, rename variables and functions, avoid repetition of code… You probably know what I’m talking about if you’ve happened to take a look at <a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship-ebook/dp/B001GSTOAM">Clean Code</a>. However, even if your code is pretty understandable… comments will kill nobody if they’re useful and constructive.</p><p>But wait, how will your prospective users know how to use it? Will they read the large documentation you’re preparing for them? Speaking for myself, I always try to find a quick example to follow and then rely on the usual hotkey most IDE’s have: <em>control + space. </em>This usually shows some quick documentation about the public methods and properties of the class. So how does this work? Is this magic? I’m sure you’ve heard about <em>javadocs </em>or any other kind of <em>markdown.</em> Most languages have their own and it’s basically a set of “escaping expressions” contained in a comment that an IDE knows how to interpret. For example, below I’m describing the class constructor and its parameters as well as remarking some requirements for the parameters:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6dc4cf164c2287b242d8cbcc16aa4648/href">https://medium.com/media/6dc4cf164c2287b242d8cbcc16aa4648/href</a></iframe><p>The next step is to create a git repository and share your code, make it public. The most widely used repositories are <a href="https://github.com/">GitHub</a> and <a href="https://bitbucket.org/">BitBucket</a>. I personally use the former for personal projects and public repositories whereas I use the latter for private ones so you’ll most probably end up using GitHub.</p><p>Besides the repository, you’ll need to add several extra files to your project in order to provide meta information about your repository. The first one is a <em>LICENSE</em> file which is usually requested when creating a repository in GitHub. Wait, a license? I don’t know anything about the current legislation.</p><p>Don’t panic, a LICENSE file is just a formality. <a href="https://choosealicense.com/licenses/">Here</a>’s a good resource to help you understand why you need a license and what’s the best one for your project. The most common licenses are MIT and APACHE.</p><p>Once you’ve chosen the most appropriate one for you, it’d be a good idea to add a README. A README is the file where you’ll explain what your framework does, why it is so special, which features it provides you with and how it works. Basically, it’s like a quick introduction to your framework. And guess what? It uses its own markdown language! There’s a good tutorial about it <a href="https://guides.github.com/features/mastering-markdown/">here</a>. Additionally, it’s very common to complete this file by adding <em>badges </em>that describe certain aspects of your project like the last version, support, … Take a look <a href="https://shields.io/#/">here</a>.</p><p>You won’t usually need a very extensive documentation but if that’s the case, you might want to take a look at the <em>Wiki</em> option of your repository to structure your API in sections.</p><p>Optionally, there’s an extra file you can add which is the CHANGELOG file. This helps developers know about new features and fixes to bugs that new versions of your framework introduce. This is optional as I said but it usually gives you more visibility in a package manager repository. Hold on, is there more about it? What’s a package manager repository? Well, you have so far done the hardest part: you’ve developed a framework, you’ve generated an API and documented it, you’ve uploaded your project to a public git repository… nonetheless, how’s anyone going to use it? Are they suppose to just download it and manually install it? I mean, that could be an option… but that’s not elegant at all. That’s why there are different places depending on the platform you’re coding for where you can find stored thousands and thousands of third party libraries which you can easily reference by means of a simple file, such as <em>pod</em> in <em>CocoaPods</em> and <em>pom.xml</em> in <em>Maven</em>. These two platforms are actually package managers which allow you to quickly install in your project any library you might need.</p><p>You should try to support as many package managers as you can. After all, you’re trying to get to as many users as possible so it makes sense your library shows up in the more package managers the better.</p><p>Last but not least, marketing comes to play: you’ll need to let developers know about your product. No one will use it if they don’t know it exists, so use everything in your hand to make it visible:</p><ul><li><a href="https://stackoverflow.com/questions/23225069/is-there-an-equivalent-of-androids-showcaseview-for-ios/52399929#52399929">StackOverFlow</a> is a must. Your product will probably answer some other developer’s question.</li><li>Blogs. Again, depending on your platform you’ll need one or another. We used <a href="https://android-arsenal.com/details/1/7119">Android Arsenal</a> to advertise our Android version.</li><li>Social Networks. No, I’m not talking about Instagram or Snapchat… although you might be surprised. I was actually talking about LinkedIn. Everyday I read a bunch of articles about other people’s projects and experiences so I guessed a mention to this achievement of ours in my wall would perfectly fit.</li><li>This blog itself, Medium. After all, if you’ve come so far you’ve probably got a good idea about what we’ve done and isn’t that the purpose?</li></ul><h4>Conclusion</h4><p>You should not be afraid of sharing what you’ve coded as the feedback you’ll get will just help you improve your code your product while making other developers lives easier. You’ll also learn about the experience.</p><p>The steps to release your framework might seem tough but it’s a once-in-a-lifetime thing that will give you more credit as a developer and help you in your career.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=53e11eb84bcd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/share-your-code-make-it-open-source-53e11eb84bcd">Share your code, make it open source</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Testeo y depuración en R]]></title>
            <link>https://medium.com/eclaboratorio/testeo-y-depuraci%C3%B3n-en-r-3c41f7057bf5?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/3c41f7057bf5</guid>
            <category><![CDATA[r]]></category>
            <category><![CDATA[testing-tools]]></category>
            <dc:creator><![CDATA[Virginia Peón]]></dc:creator>
            <pubDate>Wed, 31 Jan 2018 10:49:49 GMT</pubDate>
            <atom:updated>2018-01-30T22:32:44.696Z</atom:updated>
            <content:encoded><![CDATA[<p>Primera línea de defensa contra los bugs</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9QqEXt2Xk1PZu_vTsWhJYA.png" /></figure><p>Todos cometemos errores y, si además programamos, vamos a generar bugs. Pero también tenemos a nuestro alcance herramientas para limpiar nuestro código, detectar a tiempo los posibles fallos y estar seguros de que no cometeremos el mismo error dos veces.</p><p>Si queréis saber más sobre cómo escribir buen código en <a href="https://www.r-project.org/about.html">R</a>:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2Fhjgyl92eyjkht&amp;url=https%3A%2F%2Fwww.slideshare.net%2FVirginiaPenGarca%2Ftesteo-y-depuracin-en-r-86939043&amp;image=https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Ftesteoydepuracinenr-180130221017-thumbnail-4.jpg%3Fcb%3D1517350287&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=slideshare" width="600" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/aa32d1ce84e552104a234d0f563cda9a/href">https://medium.com/media/aa32d1ce84e552104a234d0f563cda9a/href</a></iframe><p>Y un vídeo de cómo trabajar con Test-Driven Development en R:</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D0CPdG3uRIuc&amp;src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F0CPdG3uRIuc&amp;type=text%2Fhtml&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/75b7b699d52d185cd44ab203e3cefdb5/href">https://medium.com/media/75b7b699d52d185cd44ab203e3cefdb5/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3c41f7057bf5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/testeo-y-depuraci%C3%B3n-en-r-3c41f7057bf5">Testeo y depuración en R</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Breaking Hoaxes: proyecto ganador de El Confidencial Editors Lab 2018]]></title>
            <link>https://medium.com/eclaboratorio/breaking-hoaxes-proyecto-ganador-del-el-confidencial-editors-lab-2018-812cf24976d8?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/812cf24976d8</guid>
            <category><![CDATA[innovación]]></category>
            <category><![CDATA[hackathons]]></category>
            <category><![CDATA[journalism]]></category>
            <dc:creator><![CDATA[Rafa Moreno]]></dc:creator>
            <pubDate>Fri, 26 Jan 2018 09:10:40 GMT</pubDate>
            <atom:updated>2018-12-20T15:07:07.276Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4iarMDUm5HMAddPBdy_ZmQ.jpeg" /><figcaption>Participantes del Hackathon (foto: GEN)</figcaption></figure><p><a href="https://www.globaleditorsnetwork.org/"><strong>Global Editors Network</strong></a> (GEN) y <a href="https://www.elconfidencial.com/"><strong>El Confidencial</strong></a>, con el apoyo de <strong>Google News Lab</strong>, reunieron en Madrid durante los días 18 y 19 de enero a algunos profesionales de los medios comunicación para desarrollar prototipos periodísticos enfocados a mejorar la cobertura de las noticias de última hora.</p><p>El equipo ganador de la competición Editors Lab Madrid fue <strong>La Sexta/Maldita.es</strong> con su proyecto <a href="http://community.globaleditorsnetwork.org/content/breaking-hoaxes-0">Breaking Hoaxes</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*tK0C32OaBlwAn2reE6Cr9w.jpeg" /><figcaption>Equipo de La Sexta / Maldita.es (foto: GEN)</figcaption></figure><p><strong>Breaking Hoaxes</strong> es una webapp para editores que permite acceder a información verificada en momentos de crisis. Además, posibilita desmentir noticias falsas casi en tiempo real. La webapp recoge información de varias fuentes -redes sociales, páginas web, notas de prensa institucionales- y las clasifica en información procedente de fuentes oficiales, fuentes fiables o información sobre el terreno. Toda esta información se almacena en una base de datos que permite realizar búsquedas rápidas. De esta forma, al recibir datos nuevos de fuentes desconocidas, el editor puede corroborar si esa información ha sido confirmada por otras fuentes de peso y cruzarla con docenas, incluso cientos de fuentes diferentes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*80R2Hvh8yf1DbkbyxRxb6A.png" /></figure><p>David Fernández, el desarrollador del equipo ganador, afirmó tras el evento: <br>‘<em>Uno de los problemas principales que tratamos de resolver es la dificultad de filtrar toda la información que los periodistas reciben durante un evento muy importante de última hora. En ese momento es muy complicado saber qué informaciones son ciertas y cuáles no. Por tanto, nuestro trabajo pretende eliminar el ruido y las noticias falsas para facilitar la labor del periodista’</em>.</p><p>El hackathon comenzó con una seria de charlas el pasado miércoles 17 de enero en <strong>Growth Space Barrabes</strong>. En ella participaron <strong>Alejandro Laso</strong> (El Confidencial), <strong>David Dieudonné</strong> (Google News Lab), <strong>Alvaro Ortiz</strong> (Populate) y <strong>Nathalie Malinarich</strong> (BBC). Los ponentes debatieron sobre cómo mejorar la cobertura de las noticias de última hora y destacaron las mejores prácticas y herramientas para ello.</p><p>Los once equipos participantes — compuestos por periodistas, desarrolladores y diseñadores — tuvieron dos días para experimentar y crear sus prototipos para mejorar la experiencia de redactores y lectores en la cobertura de las noticias de última hora.</p><p>El jurado, formado por <strong>Ana Ormaechea</strong> (Cuonda.com), <strong>Eva Morell </strong>(Flipboard Inc.), <strong>Nathalie Malinarich</strong> (BBC News), <strong>Rafael Höhr</strong> (Prodigioso Volcán), <strong>Ramón Puchades</strong> (Metrópolis Comunicación) y <strong>Sarah Toporoff</strong> (Global Editors Network), seleccionaron los prototipos mejor ejecutados antes de premiar a <strong>Breaking Hoaxes</strong> de La Sexta/Maldita.es.</p><p><strong>Nathalie Malinarich</strong> destacó algunas de las claves del prototipo ganador:<br>‘<em>Fue una decisión difícil porque todos los proyectos alcanzaron un alto nivel de ejecución. Breaking Hoaxes piensa en el usuario, en este caso el periodista, y le permite verificar las historias en tiempo real. Una idea pensada para el móvil, muy fácil de utilizar y muy necesaria</em>’.</p><p>Las menciones especiales del jurado se otorgaron a los equipos de <strong>Ara </strong>por su prototipo <a href="http://community.globaleditorsnetwork.org/content/ara-stories-tool-create-visual-summaries-breaking-news-0">Ara Stories</a> y a <strong>El Confidencial</strong> por <a href="http://community.globaleditorsnetwork.org/content/funnel-collaborative-and-organized-breaking-news-coverage-0">Funnel</a>. El premio del público fue también para <strong>Ara</strong>.</p><p>Si quieres ver las fotos del evento y toda la información sobre los proyectos desarrollados durante El Confidencial Editors Lab haz click en los siguientes enlaces:</p><p><a href="http://community.globaleditorsnetwork.org/projects_by_city_editorial/3463">Proyectos El Confidencial Editors Lab 2018</a></p><p><a href="https://photos.google.com/share/AF1QipNDpZ_KxT8fyQWUYO59NXW_ChpxTTUcDnN4Nd5EYmnd-NLg4sd-IhffPBw3lJShWg?utm_source=PR+General+-+International&amp;utm_campaign=77b585f049-EMAIL_CAMPAIGN_2018_01_24&amp;utm_medium=email&amp;utm_term=0_cd201626fe-77b585f049-&amp;key=M0MtbjFLamg4MndzUlZGdkFrenJOT01sM2FxQXB3">Fotos de El Confidencial Editors Lab 2018</a></p><p>El equipo de La Sexta/Maldita.es competirá en la final mundial del Editors Lab Final que tendrá lugar durante la conferencia <a href="http://community.globaleditorsnetwork.org/content/funnel-collaborative-and-organized-breaking-news-coverage-0"><strong>GEN Summit 2018</strong></a> en Lisboa, del 30 de mayo al 1 de junio, enfrentándose al resto de equipos ganadores de la VI edición del programa.</p><p>GEN Summit 2018 tendrá lugar en el corazón de Lisboa, en el histórico <strong>Pátio da Galé</strong>, bajo el lema ‘Towards the augmented newsroom’. Los tres días de conferencias explorarán el rol de la inteligencia artificial en las redacciones y los medios de comunicación. Además, se promoverán debates sobre cómo los medios pueden servirse de la inteligencia artificial para maximizar sus resultados e impacto.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=812cf24976d8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/breaking-hoaxes-proyecto-ganador-del-el-confidencial-editors-lab-2018-812cf24976d8">Breaking Hoaxes: proyecto ganador de El Confidencial Editors Lab 2018</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[El Confidencial organiza por segunda vez la edición española del #EditorsLab]]></title>
            <link>https://medium.com/eclaboratorio/el-confidencial-organiza-por-segunda-vez-la-edici%C3%B3n-espa%C3%B1ola-del-editorslab-3fa5e0c80019?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/3fa5e0c80019</guid>
            <category><![CDATA[breaking-news]]></category>
            <category><![CDATA[innovación]]></category>
            <category><![CDATA[journalism]]></category>
            <category><![CDATA[hackathons]]></category>
            <dc:creator><![CDATA[Rafa Moreno]]></dc:creator>
            <pubDate>Fri, 12 Jan 2018 09:12:21 GMT</pubDate>
            <atom:updated>2018-01-12T09:29:19.198Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6qqsoRUANGV2uSt6WuT2tw.jpeg" /></figure><p>Los días 18 y 19 de enero tendrá lugar <a href="https://www.globaleditorsnetwork.org/programmes/editors-lab/el-confidencial-editors-lab-2018/"><strong>El Confidencial Editors Network</strong></a>, ‘hackathon’ sobre innovación periodística, organizado por <strong>Global Editors Network (GEN)</strong> y <strong>El Confidencial</strong>, con el apoyo de <strong>Google News Lab</strong>. El evento reunirá a algunos de los mejores profesionales de los medios nacionales para desarrollar herramientas periodísticas que mejoren e innoven la cobertura de las noticias de última hora.</p><p><strong>¿Cómo pueden mejorar las coberturas de última hora los medios de comunicación?</strong> Hablamos de coberturas de desastres naturales, terrorismo, deportes, política… ¿Qué herramientas pueden facilitar una cobertura rápida y precisa de este tipo de acontecimientos?</p><p>Las jornadas darán comienzo el miércoles 17 de enero en un evento previo en el espacio <strong>Growth Space Barrabes</strong>, donde ponentes como <strong>Alejandro Laso</strong>, de El Confidencial, <strong>David Dieudonné</strong>, de Google News Lab, <strong>Fernando Blat</strong>, de Populate, y<strong> Nathalie Malinarich</strong>, de BBC News, compartirán sus experiencias sobre el terreno, destacarán las mejores prácticas y herramientas de las que se pueden servir los periodistas para cubrir los temas de última hora y compartirán los mejores ejemplos en este tipo de coberturas. A buen seguro, una ayuda que será de inspiración para los participantes, ya que les será útil para definir sus ideas y construir sus prototipos, y para los asistentes y profesionales del sector.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPARG9Beu_Oo%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPARG9Beu_Oo&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FPARG9Beu_Oo%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5f3fc2e82df63f611e0b7c5b4d27b98f/href">https://medium.com/media/5f3fc2e82df63f611e0b7c5b4d27b98f/href</a></iframe><p>Los participantes del ‘hacakthon’ tendrán dos días para construir sus prototipos de innovación. Los equipos estarán formados por un periodista, un desarrollador y un diseñador. Al final del evento, mostrarán sus prototipos a un jurado de expertos de los medios de comunicación. Este panel de expertos elegirá el prototipo ganador y, por tanto, qué equipo recibirá una invitación para participar en la final mundial del Editors Lab durante el <strong>GEN Summit 2018</strong> de Lisboa, entre el 30 de mayo y el 1 de junio de 2018.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f0VaRgAF0s02lK56_E6nKQ.jpeg" /></figure><p>Los medios de comunicación que participarán en esta nueva edición de El Confidencial Editors Lab son:</p><p><a href="http://www.diariodenavarra.es/"><strong>El Diario de Navarra</strong></a><br><a href="https://www.naciodigital.cat/"><strong>NacióDigital</strong></a><br><a href="https://www.ara.cat/"><strong>Ara.cat</strong></a><br><a href="http://cadenaser.com/"><strong>Cadena SER</strong></a><br><a href="https://twitter.com/datalabx"><strong>DataLab Madrid</strong></a><br><a href="https://lab.elconfidencial.com/"><strong>El Confidencial</strong></a><br><a href="http://corporate.videona.com/"><strong>Videona</strong></a><br><a href="http://www.ccma.cat/"><strong>CCMA</strong></a><br><a href="http://www.vocento.com/"><strong>Vocento</strong></a><br><a href="https://www.media.cat/"><strong>Mèdia.cat</strong></a><br><a href="https://maldita.es/"><strong>Maldita.es</strong></a></p><p>El jurado estará compuesto por <a href="https://twitter.com/aormaechea"><strong>Ana Ormaechea</strong></a><strong>,</strong> de Cuonda.com, <a href="https://twitter.com/evamorell"><strong>Eva Morell</strong></a><strong>, </strong>de Flipboard, <strong>Rafael Höhr,</strong> de Prodigioso Volcán, <a href="https://twitter.com/search"><strong>Ramón Puchades</strong></a><strong>,</strong> de Metrópolis Comunicación, <a href="https://twitter.com/nmalinarich"><strong>Nathalie Malinarich</strong></a>, de BBC News y <a href="https://twitter.com/SJToporoff"><strong>Sarah Toporoff</strong></a><strong>,</strong> de Global Editors Network.</p><p>El evento se podrá seguir por Twitter a través del ‘hashtag’ <a href="https://twitter.com/search?q=%23EditorsLab&amp;src=typd&amp;lang=es"><strong>#EditorsLab</strong></a><strong>.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3fa5e0c80019" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/el-confidencial-organiza-por-segunda-vez-la-edici%C3%B3n-espa%C3%B1ola-del-editorslab-3fa5e0c80019">El Confidencial organiza por segunda vez la edición española del #EditorsLab</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Elecciones 21D, la app para seguir campaña, resultados y pactos en Cataluña]]></title>
            <link>https://medium.com/eclaboratorio/elecciones-21d-la-app-de-el-confidencial-para-seguir-la-campa%C3%B1a-el-escrutinio-en-directo-y-los-d3eb03471644?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/d3eb03471644</guid>
            <category><![CDATA[development]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[movil]]></category>
            <category><![CDATA[apps]]></category>
            <category><![CDATA[android]]></category>
            <dc:creator><![CDATA[Juan F. Cía]]></dc:creator>
            <pubDate>Mon, 18 Dec 2017 10:12:37 GMT</pubDate>
            <atom:updated>2017-12-18T10:13:43.819Z</atom:updated>
            <content:encoded><![CDATA[<p><strong><em>ElConfidencial.LAB reedita su aplicación de elecciones para seguir la actualidad de los comicios en Cataluña, con el resto de la campaña, el seguimiento del escrutinio y la fase de pactos y formación de Gobierno.</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/996/1*Xa7xwXHc8Jj5GVZJY19nJg.jpeg" /></figure><p>El equipo de innovación de El Confidencial lanza una actualización de su aplicación de elecciones para seguir toda la actualidad informativa de los comicios en Cataluña: la última semana de campaña, el seguimiento del escrutinio electoral durante la noche del 21D y los pactos entre las formaciones que puedan dar origen a un nuevo gobierno en Cataluña.</p><ul><li><a href="https://itunes.apple.com/es/app/el-confidencial-elecciones-26j/id1053953402?mt=8"><strong>Descarga la app de Elecciones 21D en la tienda App Store (Apple)</strong></a><strong>.</strong></li><li><a href="https://play.google.com/store/apps/details?id=es.elconfidencial.elecciones21d"><strong>Descarga la app de Elecciones 21D en la Play Store (Android)</strong></a><strong>.</strong></li></ul><p>La aplicación tiene tres entornos y alguna funcionalidad interesante para no perderse ningún detalle de lo que suceda este 21D: un entorno de noticias, donde los lectores podrán filtrar los artículos según los distintos partidos; uno de encuestas, que permitirá acceder a los sondeos y una media de encuestas; y el de resultados, con un seguimiento del escrutinio en tiempo real, con el reparto del Parlament y una gráfica por bloques (independentistas vs. constitucionalistas).</p><p>Como funcionalidad destacada, los lectores de El Confidencial podrán suscribirse a nuestras notificaciones personalizadas por formaciones políticas desde la pantalla de configuración. Los usuarios podrán recibir alertas con informaciones que estén centradas en sus partidos políticos de interés, o bien suscribirse a las notificaciones por bloques (seguir todos los partidos que apuestan por la independencia de Cataluña o bien por el mantenimiento de la constitución y la unidad de España).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/900/0*Br3Yd2oAzvYgF2ax." /></figure><p>Las notificaciones generales estarán enfocadas a enviar alertas sobre sondeos y encuestas durante la campaña y los resultados de los comicios una vez cerrados los colegios electorales del próximo 21D.</p><p>La aplicación de El Confidencial Elecciones 21D está disponible ya para <a href="https://play.google.com/store/apps/details?id=es.elconfidencial.elecciones21d">su descarga gratuita en la Google Play Store para todos los dispositivos Android</a> y <a href="https://itunes.apple.com/es/app/el-confidencial-elecciones-26j/id1053953402?mt=8">en la App Store para dispositivos iOS como iPhone e iPad</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d3eb03471644" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/elecciones-21d-la-app-de-el-confidencial-para-seguir-la-campa%C3%B1a-el-escrutinio-en-directo-y-los-d3eb03471644">Elecciones 21D, la app para seguir campaña, resultados y pactos en Cataluña</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Blockchain en los Medios]]></title>
            <link>https://medium.com/eclaboratorio/blockchain-en-los-medios-5698e1055709?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/5698e1055709</guid>
            <category><![CDATA[el-confidencial]]></category>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[research]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Julio Muñoz Gallarin]]></dc:creator>
            <pubDate>Tue, 28 Nov 2017 10:44:04 GMT</pubDate>
            <atom:updated>2017-11-28T10:49:16.716Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*mwM0R8WQszelI4pU." /></figure><p>Hoy en día Blockchain es una de las tecnologías más buscadas en los motores de búsquedas en 2017 y está llamada a ser la tecnología más disruptiva de los últimos años. Por ello que desde El Confidencial nos estamos informando sobre dicha tecnología a través de cursos, charlas y meetups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/606/0*qr4T67iIXbinr0xa." /></figure><p>El jueves pasado tuvimos la suerte de contar en nuestras oficinas con la presencia de <a href="https://www.linkedin.com/in/covadongafernandezglz">Covadonga Fernandez</a>, fundadora de <a href="https://www.blockchainmedia.es/">BlockchainMedia</a>, que nos vino a dar una charla sobre cómo puede influir el tema de Blockchain en los medios de comunicación. Durante su charla se introdujeron conceptos como son el internet del valor, la tokenización, las ICOS … y se comentaron ciertos ejemplos de empresas que ya están introduciendo blockchain en el ecosistema de los medios de comunicación como son <a href="https://publiq.network/">publiq</a>, <a href="https://steemit.com/">steemit</a>, <a href="https://brave.com/">brave</a> y <a href="https://decent.ch/">decent</a>. Al final se generó un debate interesante sobre el posible encaje de esta tecnología en los medios de comunicación.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hjpaSqJAmU8iBM33-XH3_w.png" /></figure><p>Unos de los puntos que nos quedó claro es que Blockchain va mucho más allá de las criptomonedas y su uso se está extendiendo practicamente a todos los sectores, creándose cada mes cientos de startups en el mundo con productos globales basados en esta tecnología, y cuyas inspiraciones no tienen límite</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*tpLSTulhL95ju2Rs." /></figure><p>Otro de los puntos que nos quedó claro es que su principal uso es el de eliminar intermediarios gracias al funcionamiento del propio protocolo y la configuración de la red de nodos que conforman cada blockchain, a través de lo cual se establece la confianza necesaria entre desconocidos, concepto clave en el éxito del uso de Blockchain.</p><p>El tema candente llegó a la hora de hablar de Tokenización y cómo aplicar este concepto a los medios de comunicación, si tiene sentido o no crear tu propio ecosistema económico, y los pros y contras de financiar proyectos blockchain a base de ICOs y su preventa de tokens.</p><p>Desde el laboratorio creemos que Blockchain es una tecnología a la cual poner foco y seguramente, más bien pronto que tarde, acabemos experimentando con ella a través de algún proyecto de I+D.</p><p>Os mantendremos informados :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5698e1055709" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/blockchain-en-los-medios-5698e1055709">Blockchain en los Medios</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nuevas versiones de El Confi: registro y consumo de datos en iOS y servicio del tiempo y…]]></title>
            <link>https://medium.com/eclaboratorio/nuevas-versiones-de-el-confi-registro-login-y-consumo-de-datos-en-ios-y-servicio-del-tiempo-y-d2220d2bfa24?source=rss----90914c0e356e---4</link>
            <guid isPermaLink="false">https://medium.com/p/d2220d2bfa24</guid>
            <category><![CDATA[movil]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[google-play]]></category>
            <category><![CDATA[android]]></category>
            <dc:creator><![CDATA[Juan F. Cía]]></dc:creator>
            <pubDate>Tue, 29 Aug 2017 09:35:33 GMT</pubDate>
            <atom:updated>2017-08-29T09:35:38.738Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/995/1*tPL_z06Lg1asMgDpU_TACQ.jpeg" /></figure><h3><strong>Nuevas versiones de El Confi: registro y consumo de datos en iOS y servicio del tiempo y geolocalización en Android</strong></h3><p><strong><em>El Confi, la aplicación hermana de El Confidencial, tiene nuevas versiones para sus testers tanto en iOS como en Android. Los usuarios de iPhone y iPad podrán personalizar la aplicación en función del consumo de datos y los de Android dispondrán de información meteorológica en tiempo real, noticias relacionadas en editoriales de Opinión y otras mejoras.</em></strong></p><p>El Confidencial sigue dando pasos importantes en la evolución de uno de sus productos móviles estrella: <a href="https://blogs.elconfidencial.com/comunicacion/en-contacto/2017-08-04/nueva-aplicacion-elconfidencial-app-store-google-play_1425013/"><strong>su nueva aplicación de noticias</strong></a>, con una navegación más sencilla y cómoda para nuestros lectores y una experiencia más personalizada. Con el tiempo, el objetivo de este diario y su equipo de innovación, <a href="https://twitter.com/eclaboratorio?lang=es">El Confidencial LAB</a>, es avanzar en la posibilidad de que los usuarios puedan adaptar la aplicación a sus gustos e intereses. <a href="https://play.google.com/store/apps/details?id=com.elconfidencial.rss.beta&amp;hl=es">El Confi, la aplicación hermana de El Confidencial</a>, seguirá siendo un banco de pruebas excepcional para funcionalidades que, al principio, <strong>sean experimentales</strong>.</p><p>El Confi, tanto en <a href="https://itunes.apple.com/es/app/el-confi/id1213336183?mt=8"><strong>su versión en iOS</strong></a> como <a href="https://play.google.com/store/apps/details?id=com.elconfidencial.rss.beta&amp;hl=es"><strong>en Android</strong></a> -puedes descargarlas y probarlas en los enlaces-, ya disponen de dos versiones actualizadas: los usuarios de Apple disfrutarán de <a href="https://itunes.apple.com/es/app/el-confi/id1213336183?mt=8"><strong>la adaptación de la vista de las noticias en portada y portadas de sección en función del consumo de datos</strong></a>, una mejora que necesitará registro y login dentro de la aplicación. El login está disponible, por ahora, con la red social Facebook o bien a través de un correo de Google. Los usuarios Android encontrarán novedades como <strong>información meteorológica</strong>, <strong>contenido relacionado en Opinión</strong>, <strong>publicidad en interiores y secciones</strong>,<strong> cambios de diseño</strong> y <strong>la mejora en la visualización de gráficos e SVG con información de datos</strong>.</p><ul><li><a href="https://itunes.apple.com/es/app/el-confi/id1213336183?mt=8"><strong><em>Descarga El Confi en la App Store (iPhone y iPad)</em></strong></a>.</li><li><a href="https://play.google.com/store/apps/details?id=com.elconfidencial.rss.beta&amp;hl=es"><strong><em>Descarga El Confi en la Google Play (dispositivos Android)</em></strong></a>.</li><li><a href="https://itunes.apple.com/es/app/el-confidencial/id324458663?mt=8"><strong><em>Descarga la app oficial de El Confidencial en la App Store</em></strong></a>.</li></ul><p><strong>¿Vistas en función del consumo de datos?</strong></p><p>En la versión para iPhone y iPad, los lectores de El Confidencial podrán reducir el consumo de datos de la app a través de la forma en la que verán las noticias en portada y portadas de sección. La nueva versión de El Confi en iOS permitirá que los usuarios puedan escoger <strong>una vista por defecto con imágenes en tamaño grande</strong>, <strong>otra con imágenes pequeñas</strong> y <strong>una tercera sin fotos</strong>. Esta funcionalidad no afecta al interior de las noticias.</p><p>Para aprovechar esa ventaja, es necesario que los lectores de El Confidencial estén registrados y logados dentro de la aplicación. Para hacerlo podrán usar su cuenta en Facebook o un correo electrónico de Google. En ambos casos es un proceso rápido y sencillo. En un futuro, algunas de las ventajas de personalización de la aplicación necesitarán del registro, en gran parte porque nos <strong>exigirá a conocer mejor los gustos de nuestros lectores</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/664/1*AdQbxffYc_bUUtX8HDiIqg.jpeg" /></figure><p><strong>Novedades en Android</strong></p><p>Los avances en El Confi en Android son el paso previo al lanzamiento de <a href="https://play.google.com/store/apps/details?id=com.elconfidencial.rss&amp;hl=es"><strong>la actualización de la aplicación de noticias de El Confidencial en la Google Play</strong></a>. El pasado 4 de agosto <a href="https://blogs.elconfidencial.com/comunicacion/en-contacto/2017-08-04/nueva-aplicacion-elconfidencial-app-store-google-play_1425013/">publicamos la gran actualización de la app para iOS</a>, y ahora le toca el turno a los lectores de este diario en dispositivos Android. <a href="https://play.google.com/store/apps/details?id=com.elconfidencial.rss.beta&amp;hl=es"><strong>En esta versión de la aplicación hermana El Confi</strong></a>, los lectores encontrarán novedades interesantes que son un movimiento natural en ese proceso de cambios y de mejora de la aplicación oficial.</p><p>Entre las novedades, los lectores de El Confidencial dispondrán de un servicio de información meteorológica en tiempo real y vinculado a su geolocalización. Es un servicio que evolucionaremos asociado a otro tipo de ventajas. La información estará disponible en un entorno propio a través del menú y también a través de un indicador en la portada de la aplicación donde se le mostrará <strong>el lugar donde se encuentra</strong>, <strong>la temperatura</strong> y si <strong>el día está soleado, se encuentra nublado o bien se espera lluvia</strong>.</p><p>Además, esta última versión de El Confi en Android incorpora la posibilidad de leer otros artículos relacionados en los editoriales de Opinión -noticias que hayan sido escritas por la misma firma-, algunos cambios de diseño para mejorar la jerarquía de la información en portada y la incorporación de <strong>una publicidad más respetuosa con el lector</strong> dentro de las noticias y en portadas de sección. También es importante <strong>la solución de algunos errores detectados por los propios testers</strong> durante el uso de la primera versión.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d2220d2bfa24" width="1" height="1" alt=""><hr><p><a href="https://medium.com/eclaboratorio/nuevas-versiones-de-el-confi-registro-login-y-consumo-de-datos-en-ios-y-servicio-del-tiempo-y-d2220d2bfa24">Nuevas versiones de El Confi: registro y consumo de datos en iOS y servicio del tiempo y…</a> was originally published in <a href="https://medium.com/eclaboratorio">ECLaboratorio</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>