<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Arturo Gutiérrez | Artículos y Tutoriales sobre Kotlin y Android]]></title><description><![CDATA[Blog Técnico de Arturo Gutiérrez. Desarrollador Mobile, especialista en Kotlin, Android e iOS.]]></description><link>https://arturogutierrez.com/blog/</link><generator>Ghost 0.11</generator><lastBuildDate>Fri, 26 Apr 2024 08:22:53 GMT</lastBuildDate><atom:link href="https://arturogutierrez.com/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Kotlin: lenguaje oficial para el desarrollo en Android]]></title><description><![CDATA[<p><strong>¡BOOM!</strong> Sí, ha pasado, gracias al esfuerzo de la comunidad, Google ha dado un paso al frente y ha tomado, en mi opinión, una de las mejores decisiones que podía tomar.</p>

<p align="center"><strong>Kotlin se convierte en lenguaje oficial para el desarrollo en Android</strong></p>

<p>El anuncio se ha hecho hace muy poco</p>]]></description><link>https://arturogutierrez.com/blog/kotlin-lenguaje-oficial-para-el-desarrollo-en-android/</link><guid isPermaLink="false">a1343aa6-28f5-4fbf-9b90-d9982d3896bc</guid><category><![CDATA[kotlin]]></category><category><![CDATA[io17]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Wed, 17 May 2017 21:00:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/05/kotlin-googleio-header.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/05/kotlin-googleio-header.jpg" alt="Kotlin: lenguaje oficial para el desarrollo en Android"><p><strong>¡BOOM!</strong> Sí, ha pasado, gracias al esfuerzo de la comunidad, Google ha dado un paso al frente y ha tomado, en mi opinión, una de las mejores decisiones que podía tomar.</p>

<p align="center"><strong>Kotlin se convierte en lenguaje oficial para el desarrollo en Android</strong></p>

<p>El anuncio se ha hecho hace muy poco en la Keynote de <a href="https://events.google.com/io/">Google I/O 2017</a>. <strong>Stephanie Saad Cuthbertson</strong> fue quién hizo los honores.</p>

<p><img src="https://arturogutierrez.com/blog/content/images/2017/05/kotlin-googleio-17.jpg" alt="Kotlin: lenguaje oficial para el desarrollo en Android"></p>

<p align="center"><i>Aquí puedes ver el <a href="https://youtu.be/Y2VF8tmLFHw?t=2h6m31s">momento exacto</a> del anuncio</i></p>

<h4 id="qusignificasto">¿Qué significa ésto?</h4>

<p>Mucho. Muchísimo más de lo que en este momento se pueda pensar. Para empezar, la excusa (la principal excusa) de no dar el salto a Kotlin porque no está soportado por Google cae por su propio peso. A partir de ahora lo está y, además, viene <strong>directamente incluido en <a href="https://androidstudio.googleblog.com/2017/05/android-studio-30-canary-1-sdk-updates.html">Android Studio 3.0</a></strong>. Por si ésto fuera poco, <strong>Google se compromete a dar soporte al lenguaje</strong> junto a JetBrains y ambos crearán una Fundación sin ánimo de lucro para el mantenimiento y evolución del lenguaje.</p>

<p>Kotlin no viene a sustituir a Java, viene a complementarlo y evolucionarlo. Parte de su éxito está en su <strong>total interoperabilidad con Java</strong>, haciendo que puedas usar Kotlin y Java simultáneamente sin preocuparte en posibles incompatibilidades. Ésto hace que cualquier proyecto, esté en el estado en el que esté, sea susceptible a incluir a Kotlin.</p>

<p>Hay que agradecer a toda la comunidad de Kotlin ya que el soporte oficial por parte de Google se ha convertido en realidad gracias a base de progresar juntos, compartir experiencias, hacer uso del lenguaje o, sobre todo, pedir a gritos al equipo de desarrollo Android que se fijaran en Kotlin como posible evolución de Java.</p>

<p><strong>Ya no tienes excusa de pasarte a Kotlin</strong>, y por si aún tienes dudas o quieres saber más sobre Kotlin no dudes en leer mi post de <a href="https://arturogutierrez.com/blog/mi-mudanza-a-kotlin/">mi mudanza a Kotlin</a> si aún no lo has hecho 😊.</p>

<p>Links:</p>

<ul>
<li><a href="https://developer.android.com/kotlin/faq.html">Kotlin on Android FAQ</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/">JetBrains Announcement</a></li>
<li><a href="http://slack.kotlinlang.org/">Official Kotlin Slack</a></li>
</ul>]]></content:encoded></item><item><title><![CDATA[Infix functions en Kotlin]]></title><description><![CDATA[<p>Imagina que tienes el siguiente modelo para representar una carta de Póker:</p>

<pre><code class="language-kotlin">enum class Suit {  
    HEARTS,
    SPADES,
    CLUBS,
    DIAMONDS
}

enum class Rank {  
    TWO, THREE, FOUR, FIVE,
    SIX, SEVEN, EIGHT, NINE,
    TEN, JACK, QUEEN, KING, ACE    
}

data class Card(val rank: Rank, val suit: Suit)  
</code></pre>

<p>Es un modelo muy sencillo, se</p>]]></description><link>https://arturogutierrez.com/blog/infix-functions-en-kotlin/</link><guid isPermaLink="false">be33e86f-9011-4f1d-9812-388531d49bfb</guid><category><![CDATA[kotlin]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Fri, 17 Mar 2017 09:00:35 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/03/infix-functions-2.png" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/03/infix-functions-2.png" alt="Infix functions en Kotlin"><p>Imagina que tienes el siguiente modelo para representar una carta de Póker:</p>

<pre><code class="language-kotlin">enum class Suit {  
    HEARTS,
    SPADES,
    CLUBS,
    DIAMONDS
}

enum class Rank {  
    TWO, THREE, FOUR, FIVE,
    SIX, SEVEN, EIGHT, NINE,
    TEN, JACK, QUEEN, KING, ACE    
}

data class Card(val rank: Rank, val suit: Suit)  
</code></pre>

<p>Es un modelo muy sencillo, se compone de tres partes diferenciadas:</p>

<ul>
<li><strong>Suit</strong>. Representa el <em>palo</em> de la carta (corazones, diamantes, tréboles o picas).</li>
<li><strong>Rank</strong>. Indica el valor de la carta (dos, tres, rey, as, etc.).</li>
<li><strong>Card</strong>. Una clase que contiene tanto el <em>rank</em> cómo el palo de la carta.</li>
</ul>

<p>Para componer una carta simplemente hay que hacer:</p>

<pre><code class="language-kotlin">val card = Card(Rank.QUEEN, Suit.HEARTS)  
</code></pre>

<p>Cómo la idea es facilitar la creación de una carta vamos a añadir una función llamada <code>of</code> al enumerado <code>Rank</code>:</p>

<pre><code class="language-kotlin">enum class Rank {  
    TWO, THREE, FOUR, FIVE,
    SIX, SEVEN, EIGHT, NINE,
    TEN, JACK, QUEEN, KING, ACE;

    fun of(suit: Suit) = Card(this, suit)
}
</code></pre>

<p>¿Que hace <code>of</code>? Construye una carta a partir del propio <code>Rank</code> y del <code>Suit</code> recibido como parámetro. ¿Qué conseguimos? Añadir semántica a la creación de una carta, ejemplo:</p>

<pre><code class="language-kotlin">val card = Rank.QUEEN.of(Suit.HEARTS)  
</code></pre>

<p>Podemos ir incluso un poco más allá y usar <em>imports estáticos</em> tanto para <code>QUEEN</code> como para <code>HEARTS</code> para conseguir que la creación de la carta sea más cercano al lenguaje natural:</p>

<pre><code class="language-kotlin">val card = QUEEN.of(HEARTS)  
</code></pre>

<p>Mucho mejor ¿no?. Pues aún hay más, vamos a convertir la función <code>of</code> en una <strong>infix function</strong>. Para ello simplemente hay que añadir la palabra reservada <code>infix</code> al comienzo de la función:</p>

<pre><code class="language-kotlin">enum class Rank {  
    TWO, THREE, FOUR, FIVE,
    SIX, SEVEN, EIGHT, NINE,
    TEN, JACK, QUEEN, KING, ACE;

    infix fun of(suit: Suit) = Card(this, suit)
}
</code></pre>

<p>¿Qué significa ser una <strong>infix function</strong>? Básicamente poder usarla con <a href="https://en.wikipedia.org/wiki/Infix_notation">notación infix</a> que, a grandes rasgos, es poder utlizar la función como si de un operador aritmético se tratara, es decir, usarla sin necesidad de escribir el <em>punto</em> y los paréntesis.</p>

<p>¿Cómo queda finalmente el uso de la función <code>of</code>? Te adelanto que super conciso:</p>

<pre><code class="language-kotlin">val card = QUEEN of HEARTS  
</code></pre>

<p>Se podría decir que simplemente es <em>syntactic sugar</em> pero la realidad es que también nos ayuda a acercar muchísimo nuestro código al lenguaje natural, haciéndolo mucho más <strong>legible y conciso</strong>.</p>]]></content:encoded></item><item><title><![CDATA[Freakend Mobile 2017]]></title><description><![CDATA[<p>El fin de semana pasado se celebró el evento <a href="https://flipper83.github.io/freakend-mobile/">Freakend Mobile 2017</a>. Es más una reunión de amigos que un evento dónde se juntan una muestra importante de la comunidad española desarrolladores Android e iOS.</p>

<h4 id="queselfreakend">¿Qué es el Freakend?</h4>

<p>El Freakend es un evento informal organizado por <a href="https://twitter.com/flipper83">Jorge Barroso</a> dónde</p>]]></description><link>https://arturogutierrez.com/blog/freakend-mobile-2017/</link><guid isPermaLink="false">8f4dd0d5-00b7-4380-b25f-6c69ff765940</guid><category><![CDATA[freakend]]></category><category><![CDATA[eventos]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Fri, 24 Feb 2017 15:00:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/02/freakend_header.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/02/freakend_header.jpg" alt="Freakend Mobile 2017"><p>El fin de semana pasado se celebró el evento <a href="https://flipper83.github.io/freakend-mobile/">Freakend Mobile 2017</a>. Es más una reunión de amigos que un evento dónde se juntan una muestra importante de la comunidad española desarrolladores Android e iOS.</p>

<h4 id="queselfreakend">¿Qué es el Freakend?</h4>

<p>El Freakend es un evento informal organizado por <a href="https://twitter.com/flipper83">Jorge Barroso</a> dónde profesionales del sector para quedan para conocerse, charlar y, sobre todo, compartir experiencias y conocimiento. Normalmente nos juntamos en una casa rural pero este año se ha subido de nivel (debido a la alta demanda de asistencia) y la localización ha sido un pequeño hotel rural de la sierra de Madrid.</p>

<p>Lo mejor del Freakend, aparte de las magníficas charlas de los speakers, es el ambiente informal y las ganas de colaboración que hay entre todos los asistentes. Un sitio magnífico para consultar y aprender cómo trabajan otras compañeros y empresas del sector. Sinceramente, no se me ocurre un lugar mejor para hacerlo que en el Freakend con una cerveza en la mano (bueno, los que me conocen sabrán que en mi caso es un refresco).</p>

<p><img src="https://arturogutierrez.com/blog/content/images/2017/02/freakend_01-1.jpg" alt="Freakend Mobile 2017"></p>

<p align="center">Fotos de <a href="https://www.47deg.com/" target="_blank">47 Degrees</a></p>

<h4 id="charlas">Charlas</h4>

<p>El repertorio de Speakers, como es habitual, de un gran nivel comenzando, cómo no puede ser de otra forma, con una keynote que este año fue llevada por <a href="https://twitter.com/dggonzalez">David González</a> (GDE). Después tuvimos una mesa redonda sobre trabajo en remoto y sus diferentes formas, mencionar la envidia que personalmente tuve de <a href="https://twitter.com/eenriquelopez">Enrique López</a> cuándo comentó como trabaja en remoto de forma <strong>nómada</strong> habiendo trabajando desde más de 30 países diferentes en 2016, ¡increíble!.</p>

<p>El día siguiente fue una jornada repleta de charlas geniales comenzando con la <strong>máster class</strong> de <a href="https://twitter.com/raulraja">Raúl Raja</a> como es ya habitual en todas sus intervenciones. Inmediatamente después habló un servidor 😊. El día se completó con las charlas de <a href="https://twitter.com/cmonfortep">Cristian Monforte</a> de Xing, <a href="https://twitter.com/aballano">Alberto Ballano</a> también de Xing, <a href="https://twitter.com/RaulHernandezL">Raúl Hernández</a>, los Karumis <a href="https://twitter.com/davideme">Davide</a> y <a href="https://twitter.com/pedro_g_s">Pedro</a>, <a href="https://twitter.com/pepibumur">Pedro Piñera</a> de SoundCloud, <a href="https://twitter.com/HugoMatGom">Hugo Matilla</a> de Scondoo, <a href="https://twitter.com/sergiou87">Sergio Padrino</a> con su divertísima charla de Plex, <a href="https://twitter.com/javielinux">Javi Pacheco</a> y el espectáculo hecho persona con <a href="https://twitter.com/thanerian">Fernando Franco</a> y su curso de Sketch en directo.</p>

<p>El domingo se cerró el evento con las intervenciones de <a href="https://twitter.com/lascorbe">Luis Ascorbe</a> de Wallapop y del gran <a href="https://twitter.com/Guardiola31337">Pablo Guardiola</a> recién incorporado a Mapbox.</p>

<h4 id="micharla">Mi charla</h4>

<p>Ya había dado alguna charla anteriormente pero siempre a nivel interno dentro de Telefónica, así que se puede decir que es la primera vez que hablo de forma pública y, sobre todo, ante unos asistentes con tal nivel de experiencia y conocimiento. Espero haber <em>dado el callo</em>.</p>

<p>Los chicos de <a href="https://www.autentia.com">Autentia</a> se pegaron la gran currada de grabar y montar todas las charlas para que los que no pudieron asistir puedan disfrutarlas de igual manera. Podéis encontrarlas <a href="https://www.autentia.com/2017/02/23/un-fin-de-semana-en-la-sierra-hablando-de-mobile-charlas-del-freakend/">aquí</a>.</p>

<p>En mi caso, soy un fan aférrimo de las charlas dónde alguien nos cuenta como solucionó un problema real al que tuvo que enfrentarse, comentando los pasos a seguir, las soluciones adoptadas y sus <em>porqués</em>. En mi opinión, son de las que se aprenden más. <br>
Ese fue mi caso, el año pasado tuvimos una necesidad en la aplicación de <a href="https://tu.com">TU</a> de iOS dónde quisimos abordar un refactor importante mejorando la forma en que sincronizábamos los datos de la aplicación con backend. De esa experiencia nació esta charla: <strong>Extensible Synchronization Layer using Core Data</strong>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/PhtXmZ_oI6k" frameborder="0" allowfullscreen></iframe>

<h4 id="conclusin">Conclusión</h4>

<p>Como todos los años, una gran experiencia dónde siempre se aprende algo nuevo. No encuentro una mejor manera de resumirlo que con este tweet de Saúl:</p>

<blockquote class="twitter-tweet" data-lang="es"><p lang="es" dir="ltr">Si en el <a href="https://twitter.com/hashtag/freakendmobile?src=hash">#freakendmobile</a> no vuelves con ideas para implementar nada mas volver; you&#39;re doing it wrong.</p>&mdash; Saúl Díaz González (@sefford) <a href="https://twitter.com/sefford/status/833625907340443648">20 de febrero de 2017</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> 

<p>Así ha sido mi caso, muchas ganas de intentar a empezar a usar representaciones algebráicas para los modelos de mi aplicaciones incluyendo los casos de error que el dominio debería controlar (gracias a <a href="https://twitter.com/raulraja">Raúl Raja</a>) o empezar organizar mejor los recursos Android de mis aplicaciones basándome en la experiencia personal que compartió <a href="https://twitter.com/dggonzalez">David González</a>, y ésto son sólo algunos ejemplos de lo que aprendí.</p>

<p>La parte negativa es la <strong>poca representación de mujeres</strong> que había, no las conté pero creo que habría unas 4 o 5 únicamente. Desgraciadamante, ésto viene siendo una tónica habitual en eventos tecnólogicos pero estoy seguro que no es el porcentaje real de representación femenina del sector y espero que poco a poco se vayan animando a participar ya que éstos eventos van sobre personas desarrolladoras, sin importar género o experiencia.</p>]]></content:encoded></item><item><title><![CDATA[Extensiones en Kotlin]]></title><description><![CDATA[<p>Como te hablé en mi post sobre <a href="https://arturogutierrez.com/blog/mi-mudanza-a-kotlin">por qué empecé a usar Kotlin</a>, una de las funcionalidades más útiles que nos provee Kotlin es la habilidad de <strong>crear extensiones a clases de las cuáles no necesitamos tener acceso a su código</strong>. Lo vas a entender mejor con un ejemplo.</p>

<p>Imagina</p>]]></description><link>https://arturogutierrez.com/blog/extensiones-en-kotlin/</link><guid isPermaLink="false">70d95243-91fd-41c5-a1a0-0607d7031ecb</guid><category><![CDATA[kotlin]]></category><category><![CDATA[extensiones]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Mon, 06 Feb 2017 09:00:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/02/extensiones-en-kotlin.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/02/extensiones-en-kotlin.jpg" alt="Extensiones en Kotlin"><p>Como te hablé en mi post sobre <a href="https://arturogutierrez.com/blog/mi-mudanza-a-kotlin">por qué empecé a usar Kotlin</a>, una de las funcionalidades más útiles que nos provee Kotlin es la habilidad de <strong>crear extensiones a clases de las cuáles no necesitamos tener acceso a su código</strong>. Lo vas a entender mejor con un ejemplo.</p>

<p>Imagina el siguiente helper escrito en Java</p>

<pre><code class="language-java">public static boolean isWeekend(Date date) {  
   Calendar calendar = Calendar.getInstance();
   calendar.setTime(date);
   int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
   return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY
}
</code></pre>

<p>Es una función estática pura que recibe como parámetro la fecha en la que queremos comprobar si es fin de semana o no. En Java, este método estático tiene que estar dentro de una clase, vamos a suponer que se llama <code>DateUtils</code> por lo que para usarlo necesitas hacer lo siguiente:</p>

<pre><code class="language-java">boolean isWeekend = DateUtils.isWeekend(myDate);  
</code></pre>

<p>Para evitar este tipo de métodos estáticos Kotlin provee un mecanismo para añadir funcionalidad a clases que no tenemos acceso: <strong>Extensiones</strong>. La idea es <em>añadir</em> un método llamado <code>isWeekend()</code> a cualquier objeto de tipo <code>Date</code>. Para ello, simplemente hay que declarar la función de una forma concreta:</p>

<pre><code class="language-kotlin">1. fun Date.isWeekend(): Boolean {  
2.   val calendar = Calendar.getInstance()  
3.   calendar.time = this  
4.   val dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)  
5.   return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY  
6. }  
</code></pre>

<p>La sintaxis es muy simple. Se tiene que indicar el nombre de la clase la cuál se quiere <em>extender su funcionamiento</em>, <em>punto</em> y el <em>nombre del método</em>. A partir de ese momento, en el cuerpo de la función tenemos acceso a <code>this</code> que es un puntero al objeto dónde <em>se ha llamado el método</em>. Fíjate como en la línea número 3 se usa <code>this</code> como la fecha en la que queremos calcular el día de la semana ya que no se recibe ninguna fecha como argumento de la función.</p>

<p>¿Cómo se usaría? Muy fácil, simplemente llamando al método en cualquier objeto de tipo <code>Date</code>:</p>

<pre><code class="language-kotlin">val isWeekend = myDate.isWeekend()  
</code></pre>

<p>Sencillo ¿no? 😊</p>

<h3 id="fragmentmanager">Fragment Manager</h3>

<p>Te voy a enseñar otro ejemplo, esta vez enfocado a Android.</p>

<p>Para darte un poco de contexto, en Android cuándo se quiere por ejemplo reemplazar un <code>Fragment</code> es necesario crear una transacción a través del objeto <code>FragmentManager</code>. Ejemplo:</p>

<pre><code class="language-kotlin">val fragmentTransaction = fragmentManager.beginTransaction()  
fragmentTransaction.replace(R.id.container, newFragment)  
fragmentTransaction.commit()  
</code></pre>

<p>Es una de las transacciones de Fragments más básicas que existe pero es ideal para ilustrar el ejemplo. Si te fijas la transacción se divide en tres partes bien diferenciadas:</p>

<ul>
<li>Inicialización</li>
<li>Cuerpo de la transacción</li>
<li>Finalización</li>
</ul>

<pre><code class="language-kotlin">// Initialising transaction
val fragmentTransaction = fragmentManager.beginTransaction()

// Transaction body
fragmentTransaction.replace(R.id.container, newFragment)

// Committing transaction
fragmentTransaction.commit()  
</code></pre>

<p>¿Cómo sería la extensión entonces? Añadiríamos un nuevo método a <code>FragmentManager</code> que recibe una <em>lambda o función</em> dónde detallaremos las operaciones a realizar en la transacción. Además, está función recibirá como argumento la transación dónde realizar las operaciones:</p>

<pre><code class="language-kotlin">fun FragmentManager.executeTransaction(operations: (FragmentTransaction) -&gt; Unit) {  
   val transaction = beginTransaction() 
   transaction.operations() 
   transaction.commit() 
}
</code></pre>

<p>Puede parecer muy complicado pero ahora cuándo veas cómo se usa verás que realmente es más sencillo de lo que parece:</p>

<pre><code class="language-kotlin">fragmentManager.executeTransaction { transaction -&gt;  
   transaction.replace(R.id.container, fragment) 
}
</code></pre>

<p>Sencillo. Simplemente llamar al nuevo método con una lambda detallando las operaciones a realizar, en este caso un <code>replace()</code>.</p>

<p>¿Ventajas? De esta manera, aparte de ahorrar <em>boilerplate</em> al tener que escribir <code>beginTransaction() </code> y <code>commit()</code> cada vez te asegura qué no te vas a olvidar de commitear la transaccion al final, de esta manera consegues que tu código sea mucho más robusto.</p>

<h3 id="bonus">Bonus</h3>

<p>Hasta aquí lo básico sobre extensiones pero por si te has quedado con ganas de más voy a enseñarte como mejorar aún más esta función de extensión.</p>

<p>Para empezar, te puedes ahorrar escribir <code>transaction</code> en la cabecera de la lambda usando la palabra reservada <code>it</code>. A modo de resumen, <code>it</code> hace referencia al argumento de una lambda cuándo sólo hay un único argumento.</p>

<pre><code class="language-kotlin">fragmentManager.executeTransaction {  
   it.replace(R.id.container, fragment) 
}
</code></pre>

<p>Queda mucho más limpio ¿verdad? Pues aún se puede hacer más. Recuerda cómo se pasa como argumento la transacción dódne ejecutar las operaciones a la función que recibe <code>executeTransaction</code>. Ahora, ¿y sí en vez de pasar la transacción como argumento haces que dicha función sea una extensión de <code>FragmentTransaction</code>? Pues dicho y hecho:</p>

<pre><code class="language-kotlin">fun FragmentManager.transaction(operations: FragmentTransaction.() -&gt; Unit) {  
   val transaction = beginTransaction() 
   transaction.operations() 
   transaction.commit() 
}
</code></pre>

<p>La diferencia simplemente es que ahora dentro de la lambda de operaciones no hay que referirse de ninguna manera a la transación ya que la función se está ejecutando <em>dentro de la transación</em> en sí:</p>

<pre><code class="language-kotlin">fragmentManager.executeTransaction {  
  replace(R.id.container, fragment) 
}
</code></pre>

<p>Eso es todo. Esta última parte puede parecer un poco más complicada pero realmente es más sencillo de lo que parece, al final el principio es el mismo: <strong>cualquier clase puede ser extendida con métodos o funciones nuevas</strong>.</p>

<p>Si tienes cualquier duda o sugerencia no dudes en hacédmela llegar, estaré encantado en intentar resolverla.</p>]]></content:encoded></item><item><title><![CDATA[Mi mudanza a Kotlin]]></title><description><![CDATA[<p>Antes de nada, quiero que sepas que llevo desarrollando en <a href="https://go.java/index.html?intcmp=gojava-banner-java-com">Java</a> desde hace más de 10 años por lo que he seguido su evolución muy de cerca. Java, aunque muy lentamente, va evolucionando añadiendo características que poseen lenguajes más modernos como puede ser opcionales, lambdas o streams. <br>
El problema está</p>]]></description><link>https://arturogutierrez.com/blog/mi-mudanza-a-kotlin/</link><guid isPermaLink="false">fca391b2-f4c8-4c90-b583-bb20d0978155</guid><category><![CDATA[kotlin]]></category><category><![CDATA[java]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Mon, 30 Jan 2017 08:30:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/kotlin-mudanza-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/kotlin-mudanza-1.jpg" alt="Mi mudanza a Kotlin"><p>Antes de nada, quiero que sepas que llevo desarrollando en <a href="https://go.java/index.html?intcmp=gojava-banner-java-com">Java</a> desde hace más de 10 años por lo que he seguido su evolución muy de cerca. Java, aunque muy lentamente, va evolucionando añadiendo características que poseen lenguajes más modernos como puede ser opcionales, lambdas o streams. <br>
El problema está en que su ritmo de evolución es demasiado lento y, además, están obligados a preservar su verbosidad intrínseca haciendo que muchas de las nuevas características no sean tan agradables de usar como debieran.</p>

<h4 id="kotlin">Kotlin</h4>

<p><a href="https://kotlinlang.org">Kotlin</a> es un nuevo lenguaje desarrollado por <a href="https://arturogutierrez.com/blog/mi-mudanza-a-kotlin/jetbrains">JetBrains</a>. Por si no los conoces son los creadores de, en mi opinión, los mejores IDEs del mercado: IntelliJ / Android Studio, AppCode, ReSharper o Rider.</p>

<p align="center">  
<img src="https://arturogutierrez.com/blog/content/images/2017/01/kotlin-jetbrains-logo.jpg" alt="Mi mudanza a Kotlin">
</p>

<p>Kotlin es un <strong>lenguaje de tipado estático que compila a bytecode de la máquina virtual de Java (JVM) o incluso a JavaScript</strong>. Ésto quiere decir que puede usarse en cualquier sitio donde haya una JVM ejecutando bytecode. Personalmente, considero que viene para reemplazar a Java en aquellos lugares dónde usar otros lenguajes basados en JVM son inviables de usar o demasiados grandes añadiendo muchos nuevos métodos en sus librerías.</p>

<p>A diferencia de otros lenguajes como puede ser <a href="https://www.scala-lang.org/">Scala</a> que viene del sector académico, <strong>Kotlin viene de la industria</strong> (de <a href="https://www.jetbrains.com/">JetBrains</a> cómo te mencioné antes) con un periodo de diseño, iteración y desarrollo muy largo para convertirlo en un producto muy maduro desde su primera versión estable, con el <strong>objetivo de resolver problemas que a día de hoy tenemos todos los programadores de Java</strong>.</p>

<p>Otro de los objetivos importantes en su diseño es que sea <strong>100% compatible e interoperable con Java</strong>: ejecutar código Java desde Kotlin o viceversa (código Kotlin desde Java) sin problemas. ¿Qué quiere conseguir JetBrains con ésto? Dos cosas:</p>

<ol>
<li><strong>Minimizar la barrera de entrada</strong> permitiendo que, por ejemplo, no tengas que esperar a desarrollar un nuevo producto para empezar a utilizarlo sino que puedas empezar a utilizar Kotlin en todo nuevo código que desarrolles sin tener que preocuparte por la compatibilidad.  </li>
<li>Tener a tu disposición <strong>cualquier librería y/ framework escrito en Java</strong> disponible actualmente desde el primer día.</li>
</ol>

<p>Por si esto fuera poco Kotlin no es solo un lenguaje, sino que es una <strong>dupla de lenguaje y plugin</strong> para diferentes entornos de desarrollo. Entre las características que ofrece está el auto-completado, soporte completo para depuración, refactors e incluso un convertidor de Java a Kotlin. El plugin está disponible (en el momento de escribir este post) para todos los IDEs más usados:</p>

<ul>
<li><a href="https://plugins.jetbrains.com/androidstudio/plugin/6954-kotlin">Android Studio</a></li>
<li><a href="https://plugins.jetbrains.com/idea/plugin/6954-kotlin">IntelliJ</a></li>
<li><a href="https://github.com/JetBrains/kotlin-eclipse">Eclipse</a></li>
<li><a href="https://github.com/JetBrains/kotlin-netbeans">Netbeans</a></li>
</ul>

<h4 id="caractersticas">Características</h4>

<p>Voy a empezar enseñándote un simple ejemplo para que veas la diferencia de verbosidad entre Java y Kotlin:</p>

<p align="center">  
<img src="https://arturogutierrez.com/blog/content/images/2017/01/kotlin-conversion.gif" alt="Mi mudanza a Kotlin">
</p>

<p>El típico <a href="https://es.wikipedia.org/wiki/Plain_Old_Java_Object">POJO</a> de, en este caso, 3 campos que en Java ocupa 24 líneas en Kotlin es <strong>simplemente una</strong> 😍.</p>

<p>No quiero enrollarme mucho contando las bondades de Kotlin, porque no son pocas y quedaría un post muy largo, así que voy a detallar las que considero que son las más importantes:</p>

<ul>
<li><strong>OpenSource</strong> con una <a href="https://github.com/JetBrains/kotlin">comunidad muy viva</a>.</li>
<li><strong>Sintaxis clara y concisa</strong>, quita toda la verbosidad intrínseca de Java. Puede ser aprendido en cuestión de horas.</li>
<li><strong>Opcionales</strong>. Adiós a <code>NullPointerException</code>. Algo puede ser <code>null</code> únicamente si indicas que puede serlo.</li>
<li><strong>Inferencia de tipos</strong>. Es decir, dejamos al compilador que sea capaz de inferir los tipos que estoy usando y me ahorre declaralos de antemano. Ej.: <code>val text = “Hola”</code></li>
<li><strong>Data classes</strong>. Autogeneración de <em>boilerplate</em> para POJOs (<code>getters/setters</code>, <code>hashCode</code>, <code>equals</code>, <code>toString</code>, etc.).</li>
<li><strong>Extensiones</strong>. Di adiós a las clases <em>Utils</em>. Permite añadir nuevos métodos a clases sin necesidad de tener acceso a ellas. Te hablaré sobre ellos en próximos posts 😉.</li>
<li><strong>Funcional</strong>. Soporte para <a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional">Programación Funcional</a>.</li>
<li><strong>Inmutabilidad</strong> por defecto. Contra menos variables mutables tengas más seguro será tu programa, sobre todos en entornos multithreading. Kotlin te ayuda e incentiva a que utilices tantos datos inmutables como sea posible.</li>
<li><strong>Operadores</strong>. Añade soporte a tus clases de operadores como <code>+</code>, <code>-</code>, <code>*</code>, etc. Por ejemplo, Kotlin añade operadores a las colecciones básicas de Java por lo que puedes sumar dos listas de forma sencilla: <code>val newList = list1 + list2</code>, ésto devolverá una nueva lista con el contenido de ambas listas.</li>
<li><strong>Sealed Classes</strong>. Los enum del futuro. Escribí sobre ellos <a href="https://arturogutierrez.com/blog/creando-enumerados-con-datos-asociados-en-kotlin/">aquí</a>.</li>
<li><strong>Propiedades Lazy</strong>. Propiedades que inicializan su valor cuando, por ejemplo, son usadas por primera vez.</li>
<li><strong>Compila a Java 1.6</strong>. Éste es el GRAN punto para los desarrolladores Android como yo 😉.</li>
</ul>

<h4 id="porquusokotlin">¿Porqué uso Kotlin?</h4>

<p>Android nació con soporte para Java 1.6 (lanzado en 2006) añadiendo soporte casi completo para Java 1.7 más adelante, digo casi completo porque hay cosas como <a href="https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html">Try with Resources</a> que sólo es soportado desde KitKat (API Level 18). <br>
Hace muy poco se añadió soporte para Java 1.8 que trae soporte para características modernas como Lambdas, Method References o Type Annotations. La pega es que sólo están disponibles si tu aplicación soporta dispositivos desde Marshmallow (API Level 23) hacia arriba, haciéndolo inservible a día de hoy porque normalmente queremos abarcar el máximo dispositivos posibles cuando desarrollamos una aplicación.</p>

<p>Resumiendo, en Android estamos desarrollando en una especie de <em>Java 1.65</em>, es decir, usando herramientas que se lanzaron ¡hace más de 10 años!. Afortunadamente, ahora tenemos la posibilidad de usar Kotlin que viene a resolver muchos de éstos problemas.</p>

<p>Como te dije antes, Kotlin compila a bytecode de Java 1.6 por lo que es <strong>compatible con todos los dispositivos Android</strong>. Aún usando bytecode <em>antiguo</em> es capaz de darnos características modernas (algunas que empieza a traer Java 8) como puede ser Lambdas o Opcionales y, además, ser capaz de seguir evolucionando el lenguaje con cada nueva versión (ofreciendo retrocompatibilidad).</p>

<p>Desde el punto de vista de desarrollador Android puro Kotlin está perfectamente integrado con el ecosistema. Tiene <strong>soporte total con Android Studio</strong> y, además, incluye plugins y librerías adicionales para ayudarnos en el día a día del desarrollo en Android (<a href="https://github.com/Kotlin/anko">Anko</a> o <a href="https://kotlinlang.org/docs/tutorials/android-plugin.html">Kotlin Android Extensions</a>, hablaré sobre ellos en el futuro).</p>

<p>El soporte que está brindando JetBrains es espectacular, responden con mucha rapidez  a cualquier problema y, además, tienen un <a href="http://kotlinslackin.herokuapp.com/">Slack oficial sobre Kotlin</a> dónde cualquiera puede resolver sus dudas casi instantáneamente. Es muy activo. Lo recomiendo 100%.</p>

<p>Existen otras alternativas a Java para desarrollar aplicaciones en Android sobre JVM como puede ser Scala, pero en mi opinión son muy pesadas y las herramientas disponibles para Android no están al nivel de lo que ofrece Kotlin desde el primer día.</p>

<h4 id="quinestusandokotlin">¿Quién está usando Kotlin?</h4>

<p>Aquí puedes ver algunas productos y empresas que ya están usando Kotlin:</p>

<p align="center">  
<img src="https://arturogutierrez.com/blog/content/images/2017/01/companias-usando-kotlin-1.jpg" alt="Mi mudanza a Kotlin">
</p>

<p>Un montón de grandes empresas ya han confiando en Kotlin para sus productos por lo que, en mi opinión, <strong>Kotlin no es el futuro sino el presente</strong>.</p>

<h4 id="conclusin">Conclusión</h4>

<p>Sinceramente, no veo razón ninguna para seguir anclado a Java teniendo a nuestra disposición un lenguaje como Kotlin que en el caso de tener algún problema o incompatibilidad (aún no me he encontrado con ninguno) poder escribir en Java esa parte sin problema.</p>

<p>Espero haberte convencido, tanto si es así como sino te animo a que le des una oportunidad al lenguaje y pruebes sus bondades de primera mano 🙂.</p>]]></content:encoded></item><item><title><![CDATA[Cómo organizar las dependencias en Gradle]]></title><description><![CDATA[<p>Una de las mejores formas de trabajar mejor es teniendo bien organizado tu proyecto, y no, no me refiero únicamente al código de tu aplicación sino también al de tus <strong>dependencias</strong>.</p>

<p>Es muy común, por lo menos en mis primeros proyectos con <a href="https://gradle.org">Gradle</a>, tener todas las dependencias a cascoporro sin</p>]]></description><link>https://arturogutierrez.com/blog/como-organizar-las-dependencias-en-gradle/</link><guid isPermaLink="false">8a3e965d-5d93-49a7-8aed-a9b5cf93acc7</guid><category><![CDATA[gradle]]></category><category><![CDATA[android]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Sat, 21 Jan 2017 16:00:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/como-organizar-dependencias-gradle.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/como-organizar-dependencias-gradle.jpg" alt="Cómo organizar las dependencias en Gradle"><p>Una de las mejores formas de trabajar mejor es teniendo bien organizado tu proyecto, y no, no me refiero únicamente al código de tu aplicación sino también al de tus <strong>dependencias</strong>.</p>

<p>Es muy común, por lo menos en mis primeros proyectos con <a href="https://gradle.org">Gradle</a>, tener todas las dependencias a cascoporro sin llevar ningún tipo de control de versiones o, simplemente, de agrupación de tipo de dependencias. Para evitarlo, intento sacar todas las dependencias a un fichero común dónde intento organizarlas de una forma más concisa y legible. <br>
Eso es lo que te traigo hoy, un videotutorial de cómo organizo las dependencias de mis proyectos Android con <a href="https://gradle.org">Gradle</a>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/SkIqpXnLAFs" frameborder="0" allowfullscreen></iframe>

<p>Aquí te dejo el <a href="https://github.com/arturogutierrez/kotlin-dagger-example/pull/1">Pull Request</a> de los cambios que he hecho al proyecto y, también, el fichero <a href="https://github.com/arturogutierrez/Openticator/blob/master/dependencies.gradle">dependencies.gradle</a> de mi proyecto <a href="https://github.com/arturogutierrez/Openticator">Openticator</a> dónde puedes ver un ejemplo más completo de esta organización sobre un proyecto <a href="https://play.google.com/store/apps/details?id=com.arturogutierrez.openticator">real</a>.</p>

<p>Y tú, ¿a qué esperas para organizar tus ficheros gradle con lo que has aprendido? No dudes en compartir conmigo los resultados 😊.</p>]]></content:encoded></item><item><title><![CDATA[Cómo usar el nuevo all-open plugin de Kotlin 1.0.6]]></title><description><![CDATA[<p>Poco antes de terminar el pasado año, <a href="https://www.jetbrains.com/">JetBrains</a> lanzó su última versión de <a href="http://kotlinlang.org/">Kotlin</a> y entre otras novedades han añadido un plugin muy interesante: <strong>All-open plugin</strong>.</p>

<h4 id="introduccin">Introducción</h4>

<p>Antes de explicar qué es exactamente, me gustaría recordarte que por defecto <strong>todas las clases son finales</strong> en <a href="http://kotlinlang.org/">Kotlin</a> a no ser que</p>]]></description><link>https://arturogutierrez.com/blog/como-usar-el-nuevo-allopen-plugin-de-kotlin/</link><guid isPermaLink="false">87de78c3-ab06-48ef-a2f3-bb0f30f8e29e</guid><category><![CDATA[kotlin]]></category><category><![CDATA[gradle]]></category><category><![CDATA[android]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Mon, 16 Jan 2017 08:30:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/kotlin-allopen-plugin.png" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/kotlin-allopen-plugin.png" alt="Cómo usar el nuevo all-open plugin de Kotlin 1.0.6"><p>Poco antes de terminar el pasado año, <a href="https://www.jetbrains.com/">JetBrains</a> lanzó su última versión de <a href="http://kotlinlang.org/">Kotlin</a> y entre otras novedades han añadido un plugin muy interesante: <strong>All-open plugin</strong>.</p>

<h4 id="introduccin">Introducción</h4>

<p>Antes de explicar qué es exactamente, me gustaría recordarte que por defecto <strong>todas las clases son finales</strong> en <a href="http://kotlinlang.org/">Kotlin</a> a no ser que indiquemos lo contrario usando la palabra reservada <code>open</code>:</p>

<pre><code class="language-kotlin">open class HelloWorld {  
}
</code></pre>

<p>¿Qué significa ésto? Que si no indicas que una clase es <code>open</code> no podrás heredar de ella ni sobreescribir ningún método ya que es una clase final.</p>

<p>Desde el punto de vista de programador ésto no debería ser un problema, de hecho yo  considero una ventaja que nadie pueda heredar de mis clases para cambiar su comportamiento si no está explícitamente especificado para ello con <code>open</code>.</p>

<p>En cambio, ésto sí es en un problema cuándo necesitas que algunas de tus clases y todos sus miembros sean <code>open</code> explicítamente por requerimientos del framework, como puede ser, por ejemplo, cuándo usas <code>@Component</code> o <code>@Bean</code> en <a href="https://spring.io/">Spring</a>, o cuándo estás creando un nuevo modelo para la base de datos <a href="https://arturogutierrez.com/blog/como-usar-el-nuevo-allopen-plugin-de-kotlin/realm">Realm</a>.</p>

<h4 id="ques">¿Qué es?</h4>

<p><strong>All-Open Plugin</strong> es un nuevo plugin introducido en <a href="https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-0-6-is-here/">Kotlin 1.0.6</a> que nos permite convertir clases con todos sus miembros a no finales sin tener que escribir la palabra reservada <code>open</code> manualmente.</p>

<h4 id="cmofunciona">¿Cómo funciona?</h4>

<p>Imagina que tenemos un <code>DataStore</code> que se utiliza como punto de entrada en nuestro código para escribir y leer información sin importarnos dónde lo hace realmente. Ejemplo:</p>

<pre><code class="language-kotlin">class SimpleDataStore {  
   fun read(): String {
      // read something
   }
   fun write(val data: String) {
      // write data to somewhere
   }
}
</code></pre>

<p>Si queremos que esta clase se convierta en <strong>no final</strong> simplemente tenemos que decirle al plugin que queremos que haga su trabajo en nuestra clase. ¿Cómo se hace? A través de anotaciones, para ello necesitamos crearnos una anotación que usaremos para anotar las clases que queremos que se <em>openicen</em> (puede tener cualquier nombre, yo la he llamado <code>AllOpen</code> por simplicidad):</p>

<pre><code class="language-kotlin">package com.arturogutierrez.example

annotation class AllOpen  
</code></pre>

<p>Ahora, necesitamos anotar nuestro <code>DataStore</code> con <code>@AllOpen</code>:</p>

<pre><code class="language-kotlin">@AllOpen
class SimpleDataStore {  
   fun read(): String {
      // read something
   }
   fun write(val data: String) {
      // write data to somewhere
   }
}
</code></pre>

<p>Desde el punto de vista de código hemos terminado, sólo nos queda activar el plugin en nuestro proceso de build. Para ello, necesitamos añadir la dependencia en nuestro <em>build script</em>. Abre el fichero <code>build.gradle</code> de tu proyecto y añade el plugin a <strong>dependencies</strong>:</p>

<pre><code class="language-groovy">buildscript {  
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-allopen:1.0.6"
  }
}
</code></pre>

<p>Ahora abre tu fichero <code>build.gradle</code> de tu aplicación, depende de la configuración de tu proyecto puede ser el mismo o no, en el caso de Android solemos tener un <code>build.gradle</code> para el proyecto y otro por módulo por lo que ahora tienes que abrir el perteneciente al módulo, y añade el nuevo plugin con su configuración:</p>

<pre><code class="language-groovy">apply plugin: 'kotlin-allopen'

allOpen {  
    annotation("com.arturogutierrez.example.AllOpen")
}
</code></pre>

<p>Cómo habrás visto no sólo tenemos que añadir el plugin sino que además tenemos que indicarle <strong>que anotación va a usar para buscar las clases que queremos que se conviertan en no finales</strong>.</p>

<p>Si quieres usar varias anotaciones en vez de una sólo no hay problema, el plugin también incluye la propiedad <code>annotations</code> (nótese el plural) dónde puedes pasar una lista de anotaciones:</p>

<pre><code class="language-groovy">allOpen {  
    annotations("com.arturogutierrez.example.AllOpen", "com.arturogutierrez.example.AllOpenAgain")
}
</code></pre>

<p>¡Eso es todo!, ahora cada vez que compiles las clases serán abiertas <strong>automáticamente en tiempo de compilación</strong> sin que tengas que hacer nada más 🙂.</p>

<h4 id="ejemploreal">Ejemplo Real</h4>

<p>Si has trabajado con <a href="https://realm.io/docs/java/latest/#installation">Realm</a> para Android sabrás que cuándo creas un modelo éste <strong>no puede ser final</strong> para que <a href="https://realm.io/docs/java/latest/#installation">Realm</a> pueda hacer su magia en tiempo de compilación. Ésto en Java no es un problema porque por defecto todo es no final, en cambio, en Kotlin es al revés, todo es final a no ser que digas que no lo es explícitamente con <code>open</code>. <br>
En el caso de <a href="https://realm.io/docs/java/latest/#installation">Realm</a> es tedioso (y además feo) tener que poner todo <code>open</code> manualmente por lo que ésto es un caso de uso perfecto para el plugin.</p>

<p>Voy a poner un caso real de mi aplicación <a href="https://github.com/arturogutierrez/Openticator">Openticator</a> que estoy desarrollando. Tengo un modelo de <a href="https://realm.io/docs/java/latest/#installation">Realm</a> que describe la cuenta de un usuario de ésta manera:</p>

<pre><code class="language-kotlin">open class AccountRealm : RealmObject() {  
  @PrimaryKey
  open var accountId: String = ""
  open var name: String = ""
  open var type: String = ""
  open var secret: String = ""
  open var issuer: String = ""
  open var order: Int = 0
  open var category: CategoryRealm? = null
}
</code></pre>

<p>Como ves, todo es <code>open</code> para que <a href="https://realm.io/docs/java/latest/#installation">Realm</a> funcione correctamente. ¿Qué he hecho entonces? Crearme una anotación que he llamado <code>RealmModel</code> para anotar mis modelos con ella y decirle al plugin que use la anotación para convertirlas en <code>open</code>:</p>

<pre><code class="language-kotlin">@RealmModel
class AccountRealm : RealmObject() {  
  @PrimaryKey
  var accountId: String = ""
  var name: String = ""
  var type: String = ""
  var secret: String = ""
  var issuer: String = ""
  var order: Int = 0
  var category: CategoryRealm? = null
}
</code></pre>

<p>Podemos decir que este caso de uso es el caso de uso perfecto para usar este nuevo plugin. Si estás interesado en ver exactamente los cambios que he hecho en la aplicación para usar el plugin puedes ver consultar <a href="https://github.com/arturogutierrez/Openticator/pull/67">Pull Request</a> en GitHub.</p>

<h4 id="limitaciones">Limitaciones</h4>

<p>Una vez que añades el plugin a tu <em>bulid script</em> <strong>no puedes activar o desactivarlo por configuración</strong>, lo que <strong>sería muy interesante para testing</strong>. Por ejemplo, sería muy interesante crearse una anotación <code>@OpenForTesting</code> y aplicar el plugin sólo para testing, sin modificar las clases fuera del ámbito de testeo.</p>

<p>La razón de querer hacer ésto es que no se pueden mockear clases finales (de una forma sencilla), entonces, si quieres mockear una dependencia de la clase que estás testeando y esa dependecia es final probablemente termines haciéndola <code>open</code> o extrayendo una interfaz (cuándo sólo tienes una implementación y no tiene sentido extraer una interfaz para una sola clase en la mayoría de los casos).</p>

<p>Es cierto que ahora con <a href="https://github.com/mockito/mockito">Mockito 2</a> se pueden mockear clases finales pero el soporte es experimental y, además, es incompatible con el resto de test frameworks que modifiquen bytecode cómo puede ser <a href="https://github.com/robolectric/robolectric/issues/2677">Robolectric</a>.</p>

<p>Eso es todo, a partir de aquí sólo queda que lo pruebes, experimentes, que busques casos de uso dónde más te cuadre y nos cuentes la experiencia 😊.</p>]]></content:encoded></item><item><title><![CDATA[Propósitos para el 2017]]></title><description><![CDATA[<p>El comienzo de año es el típico momento dónde solemos dar un paso atrás para pararnos a pensar en <strong>dónde estamos</strong>, <strong>qué estamos haciendo</strong> y, no menos importante. <strong>qué podemos hacer</strong>. <br>
Eso hice y me di cuenta qué quiero empezar a hacer cosas que hasta hace unos meses no me</p>]]></description><link>https://arturogutierrez.com/blog/propositos-para-el-2017/</link><guid isPermaLink="false">fb40b9fd-7404-4198-ae11-74ad380b1d71</guid><category><![CDATA[objetivos]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Wed, 11 Jan 2017 21:45:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/propositos-2017.png" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/propositos-2017.png" alt="Propósitos para el 2017"><p>El comienzo de año es el típico momento dónde solemos dar un paso atrás para pararnos a pensar en <strong>dónde estamos</strong>, <strong>qué estamos haciendo</strong> y, no menos importante. <strong>qué podemos hacer</strong>. <br>
Eso hice y me di cuenta qué quiero empezar a hacer cosas que hasta hace unos meses no me planteaba ni hacer.</p>

<p>Ponerse objetivos no es más que un ejercicio de planificación de lo que se quiere conseguir durante el año. No es obligatorio hacerlo pero si no lo haces, probablemente, pierdas el rumbo en algún momento y termines viendo cómo pasan los días y meses sin darte cuenta sin haber conseguido mucho o nada de lo que te planteaste.</p>

<p>Con ese ejercicio de pararse a pensar es cómo ha nacido éste blog. Antes tenía posts sueltos escritos en inglés pero me he dado cuenta que quiero cambiar el <strong>target</strong>, quiero enfocarme en la comunidad <em>castellanoparlante</em> qué, por cierto, no tiene nada que envidiar a las demás, creo que es una comunidad suficientemente grande y madura y dónde además creo que puedo aportar 😊.</p>

<h3 id="objetivos2017">Objetivos 2017</h3>

<ul>
<li><p><strong>Blog</strong>. Comenzar o migrar mi blog a Español y empezar a escribir con asiduidad. El objetivo es conseguir al menos <strong>500 usuarios únicos</strong>.</p></li>
<li><p><strong>Facebook</strong>. Crear una página de Facebook como soporte al blog dónde potenciar mi marca personal y conseguir un mínimo de <strong>100 likes</strong>.</p></li>
<li><p><strong>YouTube</strong>. Crear un canal de YouTube dónde subir videotutoriales o cursos de las tecnologías que estoy acostumbrado a trabajar. Mi idea es intentar llegar a <strong>100 suscriptores</strong> a final de año.</p></li>
<li><p><strong>Curso Online</strong>. Me gustaría lanzar un curso online sobre Android, Kotlin o Unity 2D en Udemy o similar. Creo que es una plataforma con mucho potencial y dónde puedo aportar valor también.</p></li>
<li><p><strong>Libro</strong>. Siempre se dice que en la vida hay que hacer tres cosas: "<em>escribir un libro, plantar un árbol y tener un hijo</em>". Árbol e hijo ✅  así que me falta el libro para estar completo. Realmente siempre he querido escribir un libro así que este año me propongo como objetivo comenzar a escribir un libro técnico.</p></li>
</ul>

<p>La verdad es qué son objetivos muy ambiciosos pero quiero que este año 2017 sea un año importante para mí desde el punto de vista profesional y, al menos, conseguir poner los primeros ladrillos a mi marca personal. Veremos qué nos depara este excitante 2017 🙂.</p>]]></content:encoded></item><item><title><![CDATA[Creando enumerados con datos asociados en Kotlin]]></title><description><![CDATA[<p>Últimamente, he estado desarrollando en Swift por motivos de trabajo y, para ser sincero, me encantan los <a href="https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html">enumerados con datos asociados de Swift</a>. Si no sabes lo que es, no te preocupes, veremos ejemplos pero te puedo asegurar que luego no podrás vivir sin ellos.</p>

<p>Normalmente, un <code>enum</code> (enumerado) puede</p>]]></description><link>https://arturogutierrez.com/blog/creando-enumerados-con-datos-asociados-en-kotlin/</link><guid isPermaLink="false">469a429d-9610-400f-be16-fcf4d3c26cc7</guid><category><![CDATA[kotlin]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Fri, 16 Sep 2016 16:12:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/post_kotlin-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/post_kotlin-1.jpg" alt="Creando enumerados con datos asociados en Kotlin"><p>Últimamente, he estado desarrollando en Swift por motivos de trabajo y, para ser sincero, me encantan los <a href="https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html">enumerados con datos asociados de Swift</a>. Si no sabes lo que es, no te preocupes, veremos ejemplos pero te puedo asegurar que luego no podrás vivir sin ellos.</p>

<p>Normalmente, un <code>enum</code> (enumerado) puede contener información, pero el tipo tiene que ser el mismo para todos los casos. Ejemplo:</p>

<pre><code class="language-java">public enum DayOfWeek {  
   MONDAY(1),
   TUESDAY(2),
   WEDNESDAY(3),
   THURSDAY(4),
   FRIDAY(5),
   SATURDAY(6),
   SUNDAY(7);

   private int dayNumber;
   private DayOfWeek(int dayNumber) {
      this.dayNumber = dayNumber;
   }
   public int getDayNumber() {
      return dayNumber;
   }
}
</code></pre>

<p>Mismo código en Kotlin (mucho más bonito):</p>

<pre><code class="language-kotlin">enum class DayOfWeek(val dayNumber: Int) {  
  MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
  FRIDAY(5), SATURDAY(6), SUNDAY(7)
}
</code></pre>

<p>Los enumerados de Java no soportan diferentes tipos de valores por cada enum por lo que no podemos tener algo como esto:</p>

<pre><code class="language-java">   MONDAY(1),
   TUESDAY(2),
   WEDNESDAY(3),
   THURSDAY(4),
   FRIDAY(5),
   SATURDAY("WEEKEND"),
   SUNDAY("WEEKEND");
</code></pre>

<p>Lo sé, es un ejemplo un poco extraño, pero creo que es suficiente para entender cuál es la limitación en los enumerados de Java, ¿verdad?</p>

<p>Ahora, imagina que estás al cargo del desarrollo de una nueva aplicación de mensajería instantánea y estás trabajando en el diseño del modelo de todos los tipos que una conversación puede tener (aka Eventos):</p>

<ul>
<li>Mensajes de texto</li>
<li>Imágenes</li>
<li>Mensajes de voz</li>
</ul>

<p>Obviamente, existen varias propiedades en común para todos los tipos:</p>

<ul>
<li>Fecha del evento</li>
<li>Sí es entrante o saliente</li>
<li>Estado de entrega, etc.</li>
</ul>

<p>Quizá, tu primera aproximación sería crear una clase base llamada <code>Event</code> para empezar a crear subclases por cada tipo de evento. No pasa nada, yo probablemente hubiese hecho lo mismo pero, ¿y si te digo que hay una mejor forma de modelarlo usando enumerados con diferentes tipos de datos asociados? Suena bien, ¿verdad?</p>

<p>La idea es usar el poder de los datos asociados de los enumerados. Realmente, esto no se puede hacer en Kotlin directamente porque al ser un lenguaje que hereda de Java posee las mismas limitaciones en los enumerados pero los chicos de JetBrains ya pensaron en ello, añadieron una característica llamada <a href="https://kotlinlang.org/docs/reference/classes.html#sealed-classes">Sealed classes</a> en Kotlin que emula todo lo que hemos hablado directamente, de hecho los consideran como el reemplazo de los enumerados estándar de Java.</p>

<p>En vez de explicar que es una <a href="https://kotlinlang.org/docs/reference/classes.html#sealed-classes">Sealed classes</a> mostraré un ejemplo, para ser más exactos un ejemplo de la propiedad <code>DeliveryStatus</code>. La idea es almacenar el estado de un evento por lo que podemos tener tres posibilidades:</p>

<ul>
<li>Entregado</li>
<li>Entregando.</li>
<li>NoEntregado. Éste es un caso especial porque queremos almacenar el mensaje real de error para poder mostrárselo al usuario en la aplicación.</li>
</ul>

<p>Usando una sealed class llamada <code>DeliveryStatys</code> lo modelaríamos de la siguiente forma:</p>

<pre><code class="language-kotlin">sealed class DeliveryStatus {  
    class Delivered : DeliveryStatus()
    class Delivering : DeliveryStatus()
    class NotDelivered(val error: String) : DeliveryStatus()
}
</code></pre>

<p>Esta clase sellada actuan como un <code>enum</code> realmente porque no puede ser extendida y cada "clase interna" actua como un caso de enumerado, de esta forma puedes definir los datos asociados por cada caso individualmente. Puedes leer más (no mucho más realmente) sobre ellos en <a href="https://kotlinlang.org/docs/reference/classes.html#sealed-classes">Kotlin Docs</a>.</p>

<p>Seguimos, dirección del evento:</p>

<ul>
<li>Entrante. Debe incluir el <em>remitente</em> envío el evento,</li>
<li>Saliente. Debe incluir el estado de entrega que hablamos anteriormente.</li>
</ul>

<pre><code class="language-kotlin">sealed class Direction {  
    class Incoming(val from: String) : Direction()
    class Outgoing(val status: DeliveryStatus) : Direction()
}
</code></pre>

<p>Ahora, modelaremos el tipo de evento, recuerda que tenemos tres tipos de eventos: Menajes de Texto, Imágenes y Notas de Voz.</p>

<pre><code class="language-kotlin">sealed class ContentType {  
    class Text(val body: String) : ContentType()
    class Image(val url: String, val caption: String) : ContentType()
    class Audio(val url: String, val duration: Int) : ContentType()
}
</code></pre>

<p>Fíjate como cada tipo de evento tiene su propio tipo de dato asociado: el cuerpo para los mensajes, URL y título para las imágenes y URL y duración para las notas de voz.</p>

<p>Finalmente, sólo nos queda crear la clase que define el contenido de un evento completo:</p>

<pre><code class="language-kotlin">data class Event (val contentType: ContentType, val direction: Direction)  
</code></pre>

<p>Para ser un poco más claro aquí tienes un ejemplo de como usar este modelo:</p>

<pre><code class="language-kotlin">// An event list example but this could be retrieved from a Conversation data store in a real app
val events = listOf(  
    Event(ContentType.Text("Hey, I'm Tony"), Direction.Incoming("Tony Stark")),
    Event(ContentType.Image("URL_TO_IMAGE", "Avengers"),  Direction.Incoming("Bruce Banner")),
    Event(ContentType.Audio("URL_TO_AUDIO", 15), Direction.Outgoing(DeliveryStatus.Delivered()))
)

for(event in events) {  
    renderEvent(event)
}

fun renderEvent(event: Event): Unit {  
    when(event.contentType) {
        is ContentType.Text -&gt; println("${event.contentType.body}")
        is ContentType.Audio -&gt; println("Audio of ${event.contentType.duration} secs.")
        is ContentType.Image -&gt; println("Image (${event.contentType.caption})")
    }
}
</code></pre>

<p>Fíjate cómo <code>event.contentType</code> es casteado dentro de la cláusucla <code>is</code>, ésto nos permite acceder sus campos específicos en tiempo de compilación sin necesitas de hacer el casteo a mano (Kotlin ❤️ ).</p>

<p>Eso es todo, hemos modelado nuestros eventos usando clases selladas, pero además, esto nos ofrece aún más beneficios:</p>

<ul>
<li>El compilador conoce cuántos tipos de la clase sellada hay por lo que la sentencia <code>when</code> es capaz de detectar si falta algún caso en tiempo de compilación. </li>
<li>Todos los eventos son inmutables.</li>
<li>Todo es mucho más claro y conciso.</li>
</ul>

<p>Si estás interesado en <strong>jugar con el código fuente de ejemplo</strong> puedes hacerlo en <a href="http://try.kotlinlang.org/#/UserProjects/5pqf3jglalsp68m2gtppi13k19/b48uqn9onkngl8uh3qhmcihj9n">Try Kotlin</a>.</p>

<p>Para terminar, simplemente añadir que este tipo de modelado se está usando en la versión de iOS de Movistar TU que está escrita en Swift. Estamos muy contentos con el resultado ya que hemos conseguido que todo sea más legible y conciso y le hecho de poder hacer lo mismo en Android con Kotlin nos abre un montón de puertas nuevas.</p>]]></content:encoded></item><item><title><![CDATA[Confiando certificados autofirmados en Git]]></title><description><![CDATA[<p>Hoy, me he estado pegando con el problema de cómo aceptar de antemano el certificado autofirmado que tiene el servidor del trabajo cuándo estás clonando un repositorio <a href="https://git-scm.com">Git</a> usando una <strong>URL HTTPS</strong>. <br>
El tema está en que si intentar clonar un repositorio que está en hosteado en una máquina con</p>]]></description><link>https://arturogutierrez.com/blog/confiando-certificados-autofirmados-en-git/</link><guid isPermaLink="false">69823620-7a59-4cfd-8009-dcc44a22af26</guid><category><![CDATA[git]]></category><dc:creator><![CDATA[Arturo Gutierrez]]></dc:creator><pubDate>Tue, 03 Nov 2015 12:42:00 GMT</pubDate><media:content url="http://arturogutierrez.com/blog/content/images/2017/01/post_git.png" medium="image"/><content:encoded><![CDATA[<img src="http://arturogutierrez.com/blog/content/images/2017/01/post_git.png" alt="Confiando certificados autofirmados en Git"><p>Hoy, me he estado pegando con el problema de cómo aceptar de antemano el certificado autofirmado que tiene el servidor del trabajo cuándo estás clonando un repositorio <a href="https://git-scm.com">Git</a> usando una <strong>URL HTTPS</strong>. <br>
El tema está en que si intentar clonar un repositorio que está en hosteado en una máquina con un servidor autofirmado obtendrás el siguiente error:</p>

<pre><code>$ git clone https://www.myserver.com/myrepo.git
fatal: unable to access 'https://www.myserver.com/myrepo.git/': SSL certificate problem: Invalid certificate chain  
</code></pre>

<p><a href="https://git-scm.com">Git</a> no pregunta si quieres aceptar el certificado por lo que no se puede acceder al contenido si no nos saltamos la verificación SSL que lleva.</p>

<p>Probablemente te estarás preguntando porque no uso una conexión SSH para clonar el repositorio ¿no?. Por motivos que no vienen al caso no puedo usar conexión SSH y necesito acceder al respositorio por HTTP.</p>

<p>La primera opción que encontré es deshabilitar la verificación del certificado cuando clono el repositorio:</p>

<pre><code>GIT_SSL_NO_VERIFY=true git clone https://www.myserver.com/myrepo.git  
</code></pre>

<p>Funciona pero no es nada trivial (a vece imposible) añadir el flag <code>GIT_SSL_NO_VERIFY</code> en todos los comandos git cuándo el problema lo tiene la máquina de integración continua o, como es mi caso, cuándo estás usando <a href="https://cocoapods.org">CocoaPods</a>.</p>

<h3 id="formainsegura">Forma insegura</h3>

<p>La forma más fácil de solucionarlo es decirle a <a href="https://git-scm.com">Git</a> que no verifique ninguna conexión SSL en todos los repositorios:</p>

<pre><code>git config --global http.sslVerify false  
</code></pre>

<p>Por favor, <strong>NO LO HAGAS</strong> o te cargarás de un plumazo toda la seguridad que ofrece HTTPS.</p>

<h3 id="formasegura">Forma segura</h3>

<p>Resumen:</p>

<ol>
<li>Descargar el certificado autofirmado.</li>
<li>Decir a <a href="https://git-scm.com">Git</a> que confíe en ese certificado.</li>
</ol>

<h4 id="descargarelcertificadoautofirmado">Descargar el certificado autofirmado.</h4>

<p>Si tienes <code>openssl</code> instalado lo puedes hacer de forma muy sencilla:</p>

<pre><code>openssl s_client -connect myserver.com:443  
</code></pre>

<p>Captura la respuesta y crea un fichero con sólo el contenido entre las lineas <code>BEGIN CERTIFICATE</code> y <code>END CERTIFICATE</code> (ambas incluídas) y renómbralo a, por ejemplo, <strong>certificate.pem</strong>. Debe quedar algo así:</p>

<pre><code class="language- ">-----BEGIN CERTIFICATE-----
MIIGMDCCBRigAwIBAgIKGpFzcgADAABKojANBgkqhkiG9w0BAQUFADA/MRQwEgYK  
CZImiZPyLGQBGRYEaW5ldDESMBAGCgmSJomT8ixkARkWAmhpMRMwEQYDVQQDEwpJ  
U1NVRUNBVElEMB4XDTE1MDYwMzA2MTY1NFoXDTE3MDYwMjA2MTY1NFowZzELMAkG  
A1UEBhMCRVMxCzAJBgNVBAgTAk1BMQ8wDQYDVQQHEwZNYWRyaWQxEzARBgNVBAoT  
ClRlbGVmb25pY2ExDDAKBgNVBAsTA1RpRDEXMBUGA1UEAxMOcGRpaHViLmhpLmlu  
Oi8vb3JjYXRpZC5oaS5pbmV0L29jc3AwJgYIKwYBBQUHMAGGGmh0dHA6Ly9vcmNh  
dGlkLnRpZC5lcy9vY3NwMFUGCCsGAQUFBzAChklodHRwOi8vaXNzdWVjYXRpZC5o  
aS5pbmV0L0NlcnRFbnJvbGwvaXNzdWVjYXRpZC5oaS5pbmV0X0lTU1VFQ0FUSUQo  
MykuY3J0MFIGCCsGAQUFBzAChkZodHRwOi8vb3JjYXRpZC5oaS5pbmV0L0NlcnRF  
bnJvbGwvaXNzdWVjYXRpZC5oaS5pbmV0X0lTU1VFQ0FUSUQoMykuY3J0MFEGCCsG  
AQUFBzAChkVodHRwOi8vb3JjYXRpZC50aWQuZXMvQ2VydEVucm9sbC9pc3N1ZWNh  
dGlkLmhpLmluZXRfSVNTVUVDQVRJRCgzKS5jcnQwIQYJKwYBBAGCNxQCBBQeEgBX  
AGUAYgBTAGUAcgB2AGUAcjANBgkqhkiG9w0BAQUFAAOCAQEALn2uGPE5cuOsDVWC  
NJLJbFFH/+JwVWJjD7+oLg6z29fB17FJUdh7RgcV8ObPItvbqg2B5v773WSXRNp3  
LQ3pRxefbwZdg2dbKTkcU9HSIX/WZHUUIFYGtXeQq7+9OJ5UY+Ta/Wg7ljKeLb3+  
7gzyjDhBsipu/oXRMXInU3CppIoR802shofl4rXCoOTQNz9suQYISkLJJd2UBxsn  
v1ytyPhqpdFr6zdsr2p/jFcxvj/uKYtMp9xeenHS8Nm/6y0sfPnzNpGTbxAhAoD0  
jPIqRzg+X5Wo/A2bcS0hRkLWuQAWSnIJRUT1v+Bm62iB/C/OLR3zFRuxy+NwqHH5  
q8+fMA==  
-----END CERTIFICATE-----
</code></pre>

<p>Si no tienes <code>openssl</code> o no quieres instalarlo siempre puedes usar Firefox para descargar el certificado. Navega a tu servidor, clica en el <em>Candado</em> que aparece en la barra de direcciones para ver la información sobre la conexión segura, clica en <em>Más Información, clica _Ver Certificado</em>, ve a <em>Detalles</em> y clica en exportar para guardar el fichero, renómbralo a <strong>*certificate.pem</strong>.</p>

<h3 id="confiandoelcertificadoautofirmado">Confiando el certificado autofirmado</h3>

<p>Copia o mueve el fichero a la carpeta que quieras (personalmente prefiero crear una carpeta ocula en <code>~/.git-certs/</code>). Sólo queda decir a <a href="https://git-scm.com">Git</a> que confíe el certificado:</p>

<pre><code>git config --global http."https://www.myserver.com/".sslCAInfo ~/.git-certs/certificate.pem  
</code></pre>

<p>Eso es todo, <a href="https://git-scm.com">Git</a> no comprobará si el certificado es válido para nuestro servidor nunca más 🙂</p>]]></content:encoded></item></channel></rss>