<?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[David Rey]]></title><description><![CDATA[Software developer in a permanent beta mindset]]></description><link>https://dreyacosta.com/</link><image><url>https://dreyacosta.com/favicon.png</url><title>David Rey</title><link>https://dreyacosta.com/</link></image><generator>Ghost 5.89</generator><lastBuildDate>Mon, 02 Mar 2026 17:31:51 GMT</lastBuildDate><atom:link href="https://dreyacosta.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Sobre la CAS 2015]]></title><description><![CDATA[Mi experiencia sobre la Conferencia Agile Spain (CAS) 2015 celebrada en el Círculo de Bellas Artes de Madrid.]]></description><link>https://dreyacosta.com/sobre-las-cas-2015/</link><guid isPermaLink="false">66b7752012da6801457c22b2</guid><category><![CDATA[Events]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Tue, 08 Dec 2015 17:52:31 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2015/12/cover_cas2015.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2015/12/cover_cas2015.jpg" alt="Sobre la CAS 2015"><p>El pasado jueves y viernes asist&#xED; por primera vez a la que probablemente sea la conferencia Agile de referencia en Espa&#xF1;a. Este a&#xF1;o tuvo lugar en Madrid en un marco incomparable, el C&#xED;rculo de Bellas Artes.</p>
<h3 id="organizacin">Organizaci&#xF3;n</h3>
<p>La organizaci&#xF3;n estuvo impecable desde el primer momento. Bien es cierto que la acreditaci&#xF3;n fue en cierto modo ca&#xF3;tica debido al poco espacio que tiene la recepci&#xF3;n del C&#xED;rculo de Bellas Artes pero el estar organizada por nombres y en diferentes filas hizo que el proceso de registro fuese bastante r&#xE1;pido.</p>
<p>Estuve en 4 de las 6 salas habilitadas para el evento (Fernando de Rojas, Deiser, Antonio Palacios, Ra&#xFA;l Gomez de la Serna). Salas amplias y con buena sonorizaci&#xF3;n a excepci&#xF3;n de la sala Antonio Palacios en la que eche en falta m&#xE1;s espacio.</p>
<p>En cuanto a la zona de breaks, se me antoja que una diferente distribuci&#xF3;n de las mesas hubiera ayudado a tener algo m&#xE1;s de espacio y a molestar menos a la gente que quer&#xED;a acercarse a coger comida. No obstante, el catering estuvo muy bien.</p>
<h3 id="lascharlas">Las charlas</h3>
<p>La verdad que me esperaba mucho m&#xE1;s de las charlas de la gente <a href="https://8thlight.com/?ref=dreyacosta.com">8th light</a> ya que siendo un referente del movimiento craftsmanship creo que pod&#xED;an haber aportado mucho m&#xE1;s.</p>
<p>Enrique Comba explic&#xF3; c&#xF3;mo abstraer un controlador de una aplicaci&#xF3;n de Ruby On Rails, en mi opini&#xF3;n algo bastante b&#xE1;sico para una conferencia como la CAS.</p>
<p>Su compa&#xF1;ero Dave Moore dio una charla/workshop donde vimos los problemas que supone trabajar con servicios externos y prepar&#xF3; una API que fallaba de manera random para que desarroll&#xE1;ramos una aplicaci&#xF3;n resistente a los diferentes tipos de errores que arrojaba la API. Aunque estuvo entretenido, ech&#xE9; en falta una conclusi&#xF3;n m&#xE1;s all&#xE1; de lo complicado que es lidiar con los fallos random de servicios externos.</p>
<p>En cuanto al resto de charlas, me result&#xF3; interesante ver a Jorge Uriarte explicando el workflow de Cartodb, Ricardo Borillo explicando una alternativa al t&#xED;pico REST m&#xE1;s orientada a tasks, Luis Artola y Guillermo Guti&#xE9;rrez presentando una parte del estudio que est&#xE1;n haciendo sobre la econom&#xED;a del software, Joaqu&#xED;n Engelmo explicando t&#xE9;cnicas y patrones para mejores los tests, y Enrique Amodeo ofreciendo alternativas para lidiar con los tests de interfaces.</p>
<p>De cada una de ellas me quedo con un pedacito sobre el cual profundizar m&#xE1;s.</p>
<h3 id="keynotes">Keynotes</h3>
<p>Me quedo con 2 keynotes, bajo mi punto de vista bastante opuestas y chocantes en muchos aspectos.</p>
<p>En mi opini&#xF3;n la keynote de Leo Antoli tuvo un tono agresivo, con una argumentaci&#xF3;n m&#xE1;s bien pobre y falta de matices. Estoy bastante en desacuerdo con su posici&#xF3;n respecto a determinadas pr&#xE1;cticas.</p>
<p>A mi parecer las pr&#xE1;cticas que promueve el movimiento craftsmanship van m&#xE1;s all&#xE1; de los costes y beneficios. Creo que se trata de promover una serie de valores que buscan un equipo lo m&#xE1;s alineado posible donde se busca un respeto a las ideas, creencias o pr&#xE1;cticas de los dem&#xE1;s cuando son diferentes. Donde se pueda aprender y compartir conocimiento, experiencias y donde mejorar continuamente. Al final todo esto acabar&#xE1; emergiendo en un trabajo de calidad agregando valor constantemente.</p>
<p>Si rompemos los pilares b&#xE1;sicos conseguiremos un equipo desmotivado y poco comprometido, lo cual acabar&#xE1; reflejado en su trabajo.</p>
<p>Sin embargo, la keynote de Rachel Davies ven&#xED;a a contraponer bastantes de las cr&#xED;ticas de Leo Antoli buscando justamente esos valores mediante pr&#xE1;cticas como pair programming, mob programming, 20% del tiempo para compartir conocimiento o &#x201C;Strandcast&#x201D;.</p>
<p>Hubiera sido de lo m&#xE1;s interesante un debate entre Leo Antoli y Rachel Davies.</p>
<h3 id="conclusiones">Conclusiones</h3>
<p>Un evento bien organizado pero del que esperaba m&#xE1;s del track de software. Creo que el jueves se pod&#xED;a haber aprovechado m&#xE1;s con 2 charlas de 8th light mucho m&#xE1;s profundas.</p>
<p>Fue genial reencontrarse con amigos, la gente que pude conocer y las charlas con ellos, aunque si bien es cierto, inevitablemente debido a la gran cantidad de gente, algunas conversaciones quedaron a medias.</p>
<p>Al final lo mejor de este tipo de eventos es ver gente con talento, ultramotivada y con voluntad de aprender y compartir.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Último mes en Asia, Siem Reap, Cambodia]]></title><description><![CDATA[Mis 3 últimas semanas por Asia visitando la ciudad Siem Reap de Cambodia: Angkor Wat, Angkor Thom, AngkorHub.]]></description><link>https://dreyacosta.com/ultimo-mes-en-asia-siem-reap-cambodia/</link><guid isPermaLink="false">66b7752012da6801457c22b1</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Siem Reap]]></category><category><![CDATA[Cambodia]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Sun, 15 Nov 2015 14:11:00 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2015/11/siem_reap_cover.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2015/11/siem_reap_cover.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia"><p>Sal&#xED;a de Phuket el d&#xED;a 9 de marzo y ten&#xED;a una escala en Bangkok antes de llegar a Siem Reap, Cambodia. Este fue el itinerario:</p>
<ul>
<li>Phuket (HKT) 6:45 am &#x2708; Bangkok (DMK) 8:10 am</li>
<li>Bangkok (DMK) 2:50 pm &#x2708; Siem Reap (REP) 3:45 pm</li>
</ul>
<p>Los vuelos en orden, llegaba a Siem Reap el d&#xED;a 9 de marzo de 2015 a las 3:45 pm. Sin embargo, me esperaba cerca de 1 hora y media de idas y venidas para arreglar los papeles de inmigraci&#xF3;n en el aeropuerto de Siem Reap.</p>
<p>Nada m&#xE1;s llegar llama mucho la atenci&#xF3;n la parsimonia del personal del aeropuerto. Una mesa de recepci&#xF3;n bajo el cartel de &#x201C;Prohibido fotos&#x201D; con 6 trabajadores: 2 de ellos durmiendo la mona, 1 viendo videos en YouTube y otro jugando al Candy Crush.</p>
<p>Mientras tanto una cola de unas 100 personas esperando para sacarse el visado. Os pod&#xE9;is hacer una idea lo r&#xE1;pido que iba aquello con las 2 personas restantes que quedaban para realizar el trabajo.</p>
<p>No obstante, fui previsor y en Bangkok saqu&#xE9; la E-Visa a trav&#xE9;s de la aplicaci&#xF3;n oficial del gobierno de Cambodia. As&#xED; que iluso de m&#xED;, fui directamente al control de inmigraci&#xF3;n con la intenci&#xF3;n de evitar la enorme cola para obtener el visado on arrival. Presento mi m&#xF3;vil con el recibo del visado y tras comprobarlo, me dicen que no tienen constancia.</p>
<p>A partir de aqu&#xED; empez&#xF3; mi primera aventura en Cambodia. Os pod&#xE9;is imaginar entre ronquidos, videos de YouTube, sonidos del Candy Crush y gente que no tiene ni papa de ingl&#xE9;s, lo que me cost&#xF3; entrar en el pa&#xED;s. Acab&#xE9; comi&#xE9;ndome toda la cola y pagando el visado de nuevo pero esta vez m&#xE1;s caro por no tener d&#xF3;lares ni riels (el visado cuesta $30, pagu&#xE9; 50&#x20AC; y me devolvieron $20). Por lo visto el E-Visa necesita 24 horas para validarlo y tienes que llevarlo impreso.</p>
<p>Por fin en Cambodia y siguiendo con el ritual de siempre, saqu&#xE9; unos pocos riels para pagar el taxi del aeropuerto al centro ($7) y comprar una tarjeta SIM de Metfone ($5 por 2GB).</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/01_riels.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<h2 id="llegadaalaguesthouse">Llegada a la guesthouse</h2>
<p>20 minutos despu&#xE9;s llegaba a la <a href="http://www.advisorangkor.com/?ref=dreyacosta.com">Advisor Angkor Villa guesthouse</a> por la cual pagu&#xE9; $6 por noche. La habitaci&#xF3;n ten&#xED;a ventilador, televisi&#xF3;n, cuarto de ba&#xF1;o privado con ducha de agua fr&#xED;a y Wi-Fi. El desayuno tambi&#xE9;n estaba incluido (tostadas, huevos, arroz, caf&#xE9; o t&#xE9;).</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/02_angkorvilla.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p>Como veis en la foto, la habitaci&#xF3;n no era gran cosa pero suficiente para dormir y asearse. Lo peor de todo fue no tener aire acondicionado ya que la humedad y el calor en esa &#xE9;poca del a&#xF1;o (de marzo a junio) a duras penas baja de los 30 grados a la noche y ronda los 40 durante el d&#xED;a, por lo que os pod&#xE9;is imaginar que el tener una ducha de agua fr&#xED;a no fue ning&#xFA;n problema.</p>
<h2 id="elcoworking">El coworking</h2>
<p>El mismo d&#xED;a que llegu&#xE9; a Siem Reap fui a visitar el coworking desde el cual pensaba trabajar y que tan s&#xF3;lo estaba a 10 minutos andando de la guesthouse.</p>
<p>El coworking <a href="https://angkorhub.com/?ref=dreyacosta.com">AngkorHub</a> se encontraba en un local de tr&#xE1;nsito ya que estaban remodelando el negocio en lo que pod&#xE9;is ver a d&#xED;a de hoy en su <a href="https://angkorhub.com/?ref=dreyacosta.com">nueva Web</a>.</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/03_angkorhub_coworking.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p>La hospitalidad de su fundador <a href="https://twitter.com/jflaflamme?ref=dreyacosta.com">@jflaflamme</a> fue estupenda. Enseguida me inform&#xF3; de las limitaciones del espacio temporal que ten&#xED;an y me coment&#xF3; sus planes futuros. No dud&#xF3; en ense&#xF1;arme la ciudad, contarme sus peculiaridades y presentarme a amigos suyos. La relaci&#xF3;n durante mis 3 semanas de estancia en Siem Reap fue muy buena y pude aportar algunas opiniones de las nuevas ubicaciones del coworking. Me alegra ver que se han mantenido algunas de las conclusiones que sacamos.</p>
<h2 id="proyectos">Proyectos</h2>
<p>Durante la primera quincena del mes tocaba cerrar el proyecto de Seattle que hab&#xED;a conseguido a trav&#xE9;s de la plataforma de oDesk o ahora llamada Upwork.</p>
<p>Si algo no me hab&#xED;a gustado de esta plataforma era que supon&#xED;a demasiado esfuerzo conseguir un proyecto que tan solo iba a durar un par de semanas o 1 mes en la mayor&#xED;a de los casos. Adem&#xE1;s, en la mayor&#xED;a de ocasiones trabajas sin el apoyo de un equipo y no se busca calidad sino rapidez, por lo que normalmente no se valora tu trabajo.</p>
<p>Durante ese periodo estuve buscando proyectos fuera de la plataforma de m&#xE1;s largo plazo donde la cultura de empresa estuviera lo m&#xE1;s alineada posible con la m&#xED;a, donde los retos fueran interesantes y donde tener un equipo serio y comprometido del que aprender y compartir conocimiento.</p>
<p>As&#xED; es como di con <a href="http://www.socialbro.com/?ref=dreyacosta.com">SocialBro</a> una empresa que parec&#xED;a cumplir con lo que buscaba y de la cual ten&#xED;a buenas referencias. Y la verdad que as&#xED; fue y as&#xED; contin&#xFA;a a d&#xED;a de hoy.</p>
<p>Empec&#xE9; a trabajar desde Siem Reap en un timezone de +7 respecto al horario de Espa&#xF1;a lo que no supuso ning&#xFA;n problema gracias a un workflow muy bien definido y al compromiso del equipo.</p>
<h2 id="visitadelaciudadytemplos">Visita de la ciudad y templos</h2>
<p>Aunque durante mis semanas en Siem Reap ten&#xED;a la cabeza centrada en el trabajo y en mi vuelta a Espa&#xF1;a (por motivos familiares y por trabajo), aprovech&#xE9; algunas ma&#xF1;anas y los fines de semana para visitar lo poco que tiene esta ciudad.</p>
<p>La mayor parte de la actividad se concentraba en un radio de 2 kil&#xF3;metros, a partir de ah&#xED;, llama mucho la atenci&#xF3;n la pobreza que tiene este pa&#xED;s. Las chabolas de madera y los ni&#xF1;os ba&#xF1;&#xE1;ndose en el r&#xED;o es de lo m&#xE1;s habitual.</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/04_siem_reap_extra_radio_01.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/11/05_siem_reap_extra_radio_02.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p>Otra cosa que me choc&#xF3; mucho es que es un pa&#xED;s que no tiene plantas el&#xE9;ctricas por lo que importan la electricidad de Tailandia. As&#xED; es que, ver generadores de este tipo por la calle es de lo m&#xE1;s com&#xFA;n.</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/06_siem_reap_electricity.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p>El mayor atractivo de esta ciudad son los templos que tiene a las afueras y sin duda, si un d&#xED;a aterriz&#xE1;is en Siem Reap os recomiendo que los ve&#xE1;is.</p>
<p>Mi plan para ello fue alquilar una bici y levantarme a las 5:30 am para ir a verlos. La verdad que los casi 40 kil&#xF3;metros que me hice merecieron mucho la pena.</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/07_angkor_temples_01.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/11/08_angkor_temples_02.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/11/09_angkor_temples_03.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/11/10_angkor_temples_04.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<p>M&#xE1;s all&#xE1; de esto no hice mucha actividad salvo darme alguna vuelta por los mercados nocturnos los cuales estaban plagados de ropa.</p>
<p><img src="https://dreyacosta.com/content/images/2015/11/11_siem_reap_markets.jpg" alt="&#xDA;ltimo mes en Asia, Siem Reap, Cambodia" loading="lazy"></p>
<h2 id="conclusiones">Conclusiones</h2>
<p>El calor, la pobreza y la falta de actividad hicieron que no me vaya con muy buen sabor de boca de esta ciudad.</p>
<p>Fue complicado lidiar con el calor si no era meti&#xE9;ndote en alg&#xFA;n restaurante, cafeteria, tienda o cualquier otro tipo de local con aire acondicionado. Durante las noches intentaba lidiar el calor con varias duchas de agua fr&#xED;a y el ventilador. Tal vez fue un error viajar a Siem Reap en esta &#xE9;poca del a&#xF1;o, y m&#xE1;s, coger una habitaci&#xF3;n sin aire acondicionado.</p>
<p>La pobreza tambi&#xE9;n fue algo con lo que me cost&#xF3; vivir y m&#xE1;s cuando no puedes ayudar libremente debido a la corrupci&#xF3;n policial y las mafias organizadas que se intentan aprovechar de los turistas.</p>
<p>Por &#xFA;ltimo, no es una ciudad que tenga mucha actividad. La mayor&#xED;a de la gente est&#xE1; de paso para visitar un poco el centro y los templos. En cuanto a la mayor&#xED;a de gente local, no tienen ninguna aspiraci&#xF3;n aunque si pude conocer a unos cuantos con muchas ganas de hacer cosas. La verdad que la labor que est&#xE1; haciendo <a href="https://twitter.com/jflaflamme?ref=dreyacosta.com">@jflaflamme</a> en este aspecto es muy buena, intentando conectar turistas con gente local para intercambiar conocimientos.</p>
<p>Otra ciudad de la que me llev&#xF3;, en general, buenas experiencias pero que me pensar&#xED;a dos veces antes de volver.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[De vuelta a Tailandia, Phuket]]></title><description><![CDATA[Así pasé 21 días visitando el sur de Tailandia: Phuket Town, Rawai, Kata, Patong y Ko Phi Phi.]]></description><link>https://dreyacosta.com/de-vuelta-a-tailandia-phuket/</link><guid isPermaLink="false">66b7752012da6801457c22af</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Phuket]]></category><category><![CDATA[Tailandia]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Thu, 25 Jun 2015 18:15:12 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2015/06/phuket_cover.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2015/06/phuket_cover.jpg" alt="De vuelta a Tailandia, Phuket"><p>D&#xED;a 16 de Febrero de 2015 tocaba coger un vuelo de 3 horas, Bali (DPS) &#x2708; Kuala Lumpur (KUL), y otro de 2 horas, Kuala Lumpur (KUL) &#x2708; Phuket, para llegar al destino donde pasar&#xED;a los siguientes 21 d&#xED;as, Phuket Town.</p>
<p>Aterrice en el aeropuerto de Phuket sobre las 8:40pm para cumplir con la misma rutina de siempre: pasar inmigraci&#xF3;n con un nuevo visado Tailand&#xE9;s para 1 mes, sacar unos cuantos Baths y a por un taxi. Me esperaban unos 30 kil&#xF3;metros hasta Phuket Town ya que el aeropuerto est&#xE1; bastante a las afueras. El trayecto me sali&#xF3; por unos 400 bath (unos 10&#x20AC;).</p>
<p>En Phuket Town me esperaba la guesthouse que ten&#xED;a reservada para una semana, <a href="https://foursquare.com/v/backpacker-hostel-phuket/4bcf511b0ffdce72df62b2c0?ref=dreyacosta.com">The Backpackers</a> (13&#x20AC;/noche). As&#xED; que pague y me fui directo a descansar.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/01_phuket_the_backpackers.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"></p>
<p>Al d&#xED;a siguiente me dediqu&#xE9; a explorar la zona, visitar un coworking que ten&#xED;a fichado a tan solo 5 minutos andando de la guesthouse, y ver otras opciones de alojamiento. Encontr&#xE9; un hotel (<a href="https://foursquare.com/v/%E0%B9%82%E0%B8%A3%E0%B8%87%E0%B9%81%E0%B8%A3%E0%B8%A1%E0%B8%AA%E0%B8%99%E0%B8%97%E0%B8%A7-sinthavee-phuket-hotel/4d684029de28224b376033be?ref=dreyacosta.com">Sinthavee</a>) justo en frente del coworking por tan s&#xF3;lo 11&#x20AC;/noche, con aire acondicionado, frigor&#xED;fico y cuarto de ba&#xF1;o con ba&#xF1;era. As&#xED; que hice una reserva para los 14 d&#xED;as restantes que iba a estar por Phuket. Tambi&#xE9;n alquile una moto para moverme a las dem&#xE1;s zonas de Phuket (Rawai, Kata, Patong) por la que pagaba 3&#x20AC;/d&#xED;a.</p>
<h2 id="empezandoahacerrutina">Empezando a hacer rutina</h2>
<p>Una cosa que necesitaba al llegar a una nueva ciudad era empezar a establecer una peque&#xF1;a rutina lo antes posible. Esto me permit&#xED;a adem&#xE1;s de tener una disciplina, empezar a conocer a la gente de los diferentes caf&#xE9;s, restaurantes, laundries y dem&#xE1;s negocios.</p>
<h3 id="cafylectura900am1000am">Caf&#xE9; y lectura (9:00am - 10:00am)</h3>
<p><img src="https://dreyacosta.com/content/images/2015/06/02_phuket_eleven_two_cafe.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small><a href="https://foursquare.com/v/eleven-two--co--official-/5365df5a498e84d5099c672f?ref=dreyacosta.com">Eleven Two &amp; Co.</a> (Phuket Town)</small></p>
<p>Sobre esta hora me iba a desayunar a uno de los estupendos caf&#xE9;s que tiene Phuket Town. El caf&#xE9; de esta ciudad es excelente para acompa&#xF1;arlo de una buena lectura matinal.</p>
<h3 id="coworking1000am600pm">Coworking (10:00am - 6:00pm)</h3>
<p><img src="https://dreyacosta.com/content/images/2015/06/03_phuket_the_sea_coworking.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small><a href="https://foursquare.com/v/the-sea-coworking-space--marine-library-cafe/52ceb052498e289830ac2610?ref=dreyacosta.com">The Sea Coworking Space</a> (Phuket Town)</small></p>
<p>Una biblioteca, cafeter&#xED;a artesana y coworking donde pasaba pr&#xE1;cticamente todo el d&#xED;a, tanto cerrando el proyecto de Seattle en el que estaba trabajando como conociendo gente local o haciendo caf&#xE9; a lo craftsman con las due&#xF1;as del coworking.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/04_phuket_cafe_craftsman.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"></p>
<p>La gente local que conoc&#xED; me ayudaron a moverme mejor por la ciudad y me descubrieron varios rincones no tan transitados por turistas.</p>
<p>Adem&#xE1;s pude conocer varios programadores. 2 de ellos Italianos trabajando en remoto para empresas en Londres y un argentino montando su propio proyecto. Tuvimos unas conversaciones de lo m&#xE1;s interesantes y intercambiamos opiniones sobre los proyectos en los que estabamos involucrados.</p>
<h2 id="beachandsunsetafterwork">Beach and sunset (after work)</h2>
<p>Gracias a la gente local descubr&#xED; esta estupenda playa familiar donde desconectar despu&#xE9;s de un d&#xED;a de trabajo.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/05_phuket_yanui_beach.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Yanui Beach (Rawai, Phuket)</small></p>
<p>A tan solo un par de kil&#xF3;metros de la playa se encontraba un view point donde poder disfrutar de incre&#xED;bles puestas de sol.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/06_phuket_windmill_viewpoint.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Windmill Viewpoint (Rawai, Phuket)</small></p>
<h3 id="weekends">Weekends</h3>
<p>Los fines de semanas aprovech&#xE9; para coger la moto y explorar las zonas de Kata y Patong.</p>
<p>En Kata y tras perderme por unas carreteras amaz&#xF3;nicas, llegue a un view point con vista a gran parte de Phuket.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/07_phuket_unknown_road.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Unknown</small></p>
<p>{&lt;23&gt;}<img src="https://dreyacosta.com/content/images/2015/06/08_phuket_karon_view_point.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Karon View Point</small></p>
<p>Segu&#xED; el trayecto hasta llegar a Patong. Nada m&#xE1;s llegar ya puedes ver que es la zona de los turistas. Playas repletas de gente, fiesta y prostituci&#xF3;n pr&#xE1;cticamente las 24 horas del d&#xED;a.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/09_phuket_patong_beach.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Patong Beach (Patong, Phuket)</small></p>
<h2 id="kophiphiymayabaysleepaboard">Ko Phi Phi y Maya Bay Sleep Aboard</h2>
<p>No me pod&#xED;a ir de Phuket sin ver las famosas islas Phi Phi. A sabiendas que es una zona muy tur&#xED;stica, estuve buscando la manera de esquivar las multitudes.</p>
<p>Acabe por encontrar una excursi&#xF3;n organizada por las islas en un barco con 20 personas y que adem&#xE1;s era el &#xFA;nico autorizado a quedarse durante la noche en la famosa playa de Maya Bay.</p>
<p>Salimos del puerto de Ko Phi Phi a las 4:00pm direcci&#xF3;n Ko Phi Phi Le para ver las Vikings Caves y hacer snorkel en unas aguas turquesas incre&#xED;bles.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/10_phuket_viking_caves.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Viking Caves (Ko Phi Phi Le, Phuket)</small></p>
<p><img src="https://dreyacosta.com/content/images/2015/06/11_phuket_ko_phi_phi.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Ko Phi Phi Le (Phuket)</small></p>
<p>Algo m&#xE1;s de una hora despu&#xE9;s nos dirigimos a Maya Bay. Lleg&#xE1;bamos sobre las 8:00pm justo cuando todos los turistas abandonaban la playa. Tuvimos una peque&#xF1;a reuni&#xF3;n en la caseta donde &#xED;bamos a cenar y pasar la noche.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/12_phuket_maya_bay_beach01.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Maya Bay (Ko Phi Phi Le, Phuket)</small></p>
<p>Hasta la cena fui a dar una vuelta por los alrededores de la playa. Una sensaci&#xF3;n de paz incre&#xED;ble poder disfrutar de ese para&#xED;so pr&#xE1;cticamente solo.</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/13_phuket_maya_bay_beach02.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Maya Bay (Ko Phi Phi Le, Phuket)</small></p>
<p><img src="https://dreyacosta.com/content/images/2015/06/14_phuket_maya_bay_beach03.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Maya Bay (Ko Phi Phi Le, Phuket)</small></p>
<p><img src="https://dreyacosta.com/content/images/2015/06/15_phuket_maya_bay_beach04.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"><br>
<small>Maya Bay (Ko Phi Phi Le, Phuket)</small></p>
<p>Para cenar no s&#xF3;lo disfrutamos de un tip&#xED;co plato Tailand&#xE9;s de arroz y verduras sino tambi&#xE9;n de algo m&#xE1;s western como un pollo a la barbacoa. Tras la cena estuvimos charlando y tocando la guitarra bajo las estrellas (s&#xED;, de pel&#xED;cula xD) mientras tom&#xE1;bamos unos combinados en unos cubos de playa :-D</p>
<p><img src="https://dreyacosta.com/content/images/2015/06/16_phuket_maya_bay_drinks.jpg" alt="De vuelta a Tailandia, Phuket" loading="lazy"></p>
<p>Al d&#xED;a siguiente nos levantamos al amanecer con la playa des&#xE9;rtica. Cogimos el barco, desayunamos e hicimos una &#xFA;ltima parada en unas aguas turquesas para hacer el &#xFA;ltimo snorkel de la excursi&#xF3;n.</p>
<p>Desde luego si quer&#xE9;is disfrutar de Maya Bay evitando las multitudes no os pod&#xE9;is perder esta excursi&#xF3;n, <a href="http://www.mayabaytours.com/?ref=dreyacosta.com#!sleepaboard-trekksoft/cm1n">Maya Bay Sleep Aboard</a>.</p>
<p><div class="video-container">
<iframe src="https://player.vimeo.com/video/129286980" width="560" height="315" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div></p>
<h2 id="conclusiones">Conclusiones</h2>
<p>He estado muy c&#xF3;modo en Phuket. Ten&#xED;a todo a mano, el coworking cerca del hotel, de los caf&#xE9;s, de los restaurantes, de los mini markets y alquileres de motos.</p>
<p>Para el d&#xED;a a d&#xED;a pod&#xED;a hacer todo andando y las playas estaban a tan solo 15 - 20 minutos de moto.</p>
<p>Me he quedado con ganas de visitar Krabi, Koh Lanta, u otras islas como Ko Yao Yai, as&#xED; como sacarme la licencia de submarinismo. Tendr&#xE9; que volver para ello :D</p>
<p>Ahora a volar hac&#xED;a mi siguiente destino, Siem Reap (Cambodia).</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[45 días en Bali]]></title><description><![CDATA[Así fue mi estancia en la isla Indonesa de Bali durante el año nuevo 2015 y los meses de Enero y Febrero.]]></description><link>https://dreyacosta.com/45-dias-en-bali/</link><guid isPermaLink="false">66b7752012da6801457c22ae</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Bali]]></category><category><![CDATA[Indonesia]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Tue, 03 Mar 2015 12:54:00 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2015/03/bali_cover-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2015/03/bali_cover-1.jpg" alt="45 d&#xED;as en Bali"><p>El martes 30 de Diciembre de 2014, tan s&#xF3;lo 2 d&#xED;as despu&#xE9;s de que <a href="http://www.bbc.com/news/world-asia-30614627?ref=dreyacosta.com">AirAsia perdi&#xF3; una avi&#xF3;n de su flota</a>, me tocaba embarcar direcci&#xF3;n Bali. Os mentir&#xED;a si os digo que estaba tranquilo volando la mayor parte del tiempo y en &#xE9;poca de tormentas por encima del oc&#xE9;ano en un trayecto de 2948 kil&#xF3;metros.</p>
<p>Afortunadamente el viaje fu&#xE9; tranquilo y llegu&#xE9; sano y salvo a tierras Indonesas. Mi estancia aqu&#xED; ser&#xED;a de 45 d&#xED;as extiendo el visado de turista (30 d&#xED;as) un mes m&#xE1;s (28 d&#xED;as adicionales por ser Febrero por unos 48&#x20AC; m&#xE1;s).</p>
<h3 id="llegada">Llegada</h3>
<p>A las 11:25am atterizaba en el aeropuerto de Denpasar. Tocaba rellenar los papeles de immigraci&#xF3;n pero m&#xE1;s importante a&#xFA;n pagar 32&#x20AC; por el visado de turista (intentar dar justo ya que devuelven rupias, IDR, a un cambio p&#xE9;simo).</p>
<p>Una vez pasados los controles fui a sacar unas poquitas rupias, 2.000.000 IDR. Esto al cambio son unos 138&#x20AC;. Os pod&#xE9;is hacer una idea de la cantidad de rupias que v&#xE1;is a manejar si aterriz&#xE1;is en Indonesia.</p>
<p>Gracias a <a href="https://twitter.com/cataflu?ref=dreyacosta.com">@cataflu</a> que tiene un conocido en Bali que alquila habitaciones de su villa, ten&#xED;amos tanto el alojamiento como el traslado a la villa organizado con el host.</p>
<p>Por el camino paramos c&#xF3;mo no a comprar una tarjeta SIM para estar conectados. Tan s&#xF3;lo 50.000 IDR (3,45&#x20AC;) por un paquete de datos de 1.5GB con simPATI (Telkomsel). Las comunicaciones no son nada buenas y es raro que encuentres un sitio donde tu velocidad sea superior a 1mbps/1mbps.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/01_bali_mobile_shop.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h3 id="lavillaysuubicacin">La villa y su ubicaci&#xF3;n</h3>
<p>Desde el aeoropuerto de Denpasar pasar&#xF3;n f&#xE1;cil 30 minutos hasta llegar a la villa. Enseguida te das cuenta de la cantidad de tr&#xE1;fico y motos que hay en esta ciudad. Conform&#xE9; nos ibamos alejando del aeropuerto los caminos se volv&#xED;an m&#xE1;s salvajes pasando por &quot;carreteras&quot; como esta hasta llegar a la villa.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/02_bali_road_to_villa.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>La verdad que la villa perfecta: piscina, gran sal&#xF3;n, espacio para trabajar, 2 habitaciones con cama de matrimonio, 1 habitaci&#xF3;n con camas individuales, 2 ba&#xF1;os, terraza superior, servicio de desayuno y limpieza.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/03_bali_villa_room.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/04_bali_villa_pool.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>La ubicaci&#xF3;n, en el centro del Sur de Kuta, en el punto m&#xE1;s alto de esta especie de &quot;isla&quot;.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/05_bali_south_kuta_map.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>Gracias al host ten&#xED;amos motos de alquiler listas para usar en la puerta de la villa. Por el alquiler de las motos durante 45 d&#xED;as pagamos unas 750.000 IDR (unos 50&#x20AC;).</p>
<p>Resultaba un tanto curioso el camino que hab&#xED;a que cruzar para llegar a la carretera de gravilla donde se aparcaban las motos. Un camino de arbustos que sol&#xED;an cortar y en que te pod&#xED;as encontrar con s&#xED;mpaticos vecinos.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/06_bali_villa_neighboor.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h3 id="explorandolazona">Explorando la zona</h3>
<p>A 5 minutos en moto, por una carretera muy estrecha y sin apenas iluminaci&#xF3;n ten&#xED;a a mano un par de supermecados y unos cuantos restaurantes. Relativamente cerca pero que a pie te lleva tus 20 minutos f&#xE1;cil y teniendo en cuenta que Enero y Febrero es &#xE9;poca de lluvias en Bali y que anochece a las 06:30pm da bastante pereza recorrer ese camino a la noche, por ejemplo para cenar.</p>
<p>A 20 kil&#xF3;metros a la redonda, unos 20/30 minutos en moto, ten&#xED;a multitud de playas. Una sorpresa que te llevas cuando llegas a una playa es que tienes que pagar entre 2.000 y 5.000 IDR (0,15&#x20AC; - 0,35&#x20AC;) por aparcar. Muchas playas no tienen parking por lo que aparcas en el arc&#xE9;n.</p>
<p>No hab&#xED;an transcurrido ni 48 horas y el panor&#xE1;ma no ten&#xED;a muy buena pinta. Pagar por el visado, las distancias muy grandes, lluvias, seguir pagando por aparcar en las playas, ...</p>
<h3 id="yllegabanochevieja">Y llegaba nochevieja...</h3>
<p>Poco m&#xE1;s all&#xE1; de las 24 horas del aterrizaje llegaba la nochevieja. A diferencia de Tailandia, en Bali se celebra ya que se rigen por el mismo calendario que nosotros.</p>
<p>Un d&#xED;a un tanto especial para m&#xED; ya que siempre ha sido un momento de reencuentro con la familia, de saber que todos estamos bien, de debates y por supuesto de celebraci&#xF3;n.</p>
<p>Este a&#xF1;o me encontraba lejos muy lejos y reci&#xE9;n llegado a un pa&#xED;s del que todav&#xED;a no sab&#xED;a por que sitios moverme y que especialmente el d&#xED;a 31 de Diciembre llov&#xED;a, y mucho.</p>
<p>As&#xED; que decidi no quedarme en casa. En uno de esos momentos en los que la lluv&#xED;a se tom&#xF3; un respiro, sobre las 08:00pm, sali con la moto a ver que me encontraba por una de las playas m&#xE1;s cercanas.</p>
<p>Al llegar a la playa de Jimbaran empez&#xF3; a llover de nuevo. Aquello estaba oscuro y sin apenas actividad. No ten&#xED;a mucha pinta de que fuera un d&#xED;a especial para la gente, o lo m&#xE1;s probable, no estaba en el sitio adecuado para ello. El tiempo no acompa&#xF1;aba para andar movi&#xE9;ndose en moto, espere un poco a que dejar&#xE1; de llover y decid&#xED; volver a casa ya que no era un buen momento para explorar la zona. Definitivamente no volver&#xE9; a llegar a un destino desconocido a 24 horas vista de nochevieja.</p>
<p>De camino a casa vi un restaurante italiano donde me par&#xE9; a cenar. &#xA1;Por lo menos cenar fuera de casa! Tambi&#xE9;n con muy poca actividad pero donde cene una pizza 4 quesos para celebrar el fin de a&#xF1;o (quien me conozca sabe que no cambio esta cena por marisco, cochinillo o cualquier otra cosa tipica de estas fechas).</p>
<p>Tras la cena y llegar a casa vi alguna pel&#xED;cula. La verdad que fu&#xE9; muy grande el contraste con otras nocheviejas. Eche mucho de menos a esta pedazo familia!</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/07_bali_new_year.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h3 id="lasprimerassensaciones">Las primeras sensaciones</h3>
<p>Las sensaciones que tienes los primeros d&#xED;as no son nada comodas. Nada te gusta, todo te parece una mierda, ... y m&#xE1;s cuando tienes una nochevieja tan diferente.</p>
<p>Sin embargo si reflexionas y comienzas a cuestionarte... &#xBF;Tengo criterio suficiente para saber si esta ciudad me gusta? &#xBF;Y este pa&#xED;s? Claramente que en 2 d&#xED;as es imposible.</p>
<p>El m&#xF3;tivo es claro: has vuelto a salir de tu zona de confort, est&#xE1;s en un sitio que no conoces, que no sabes lo que te rodea, c&#xF3;mo moverte. Esto te hacer estar incomodo. No hay que desesperar...</p>
<h3 id="hayqueseguirexplorando">Hay que seguir explorando</h3>
<p>Los d&#xED;as siguientes viendo que el tiempo hab&#xED;a mejorado notablemente decid&#xED; coger la moto y recorrerme las playas del Sur de Kuta esperando tambi&#xE9;n encontrarme con m&#xE1;s actividad por el camino o en las propias playas.</p>
<h4 id="eltrfico">El tr&#xE1;fico</h4>
<p>Aparte de la multitud de tr&#xE1;fico y la impresionante cantidad de motos que te puedes encontrar, la carretera tambi&#xE9;n est&#xE1; llena de sorpresas. Te puedes encontrar a gallinas cruzando la carretera, perros en mitad de la carretera que ni se inmutan cuando pasa un veh&#xED;culo o gente transportando en la moto cualquier tipo de artilugio.</p>
<p><strong>Parking de motos</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/08_bali_motorbike_parking.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Como transportar cosas en Bali</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/09_bali_motorbike_road.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h4 id="surdekuta">Sur de Kuta</h4>
<p>Estas fueron alguna de las playas y templos que visite.</p>
<p><strong>Jimbaran beach</strong> (2000 IDR - 0,14&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/10_bali_jimbaran_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>Al ver esta playa se me cay&#xF3; el mito de las playas de Bali. Pero una vez m&#xE1;s, no pod&#xED;a juzgar viendo tan s&#xF3;lo una playa.</p>
<p><strong>Padang Padang beach</strong> (2000 IDR - 0,14&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/11_bali_padangpadang_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Blue Point Beach</strong> (2000 IDR - 0,14&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/12_bali_bluepoint_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/13_bali_bluepoint2_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Pandawa Beach</strong> (5000 IDR - 0,35&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/13_bali_pandawa1_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/14_bali_pandawa2_beach.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>Mi visi&#xF3;n sobre las playas cambiar&#xF3;n r&#xE1;dicalmente. Realmente hay playas que bajo mi punto de vista merecen la pena ver. A puntualizar que estuve en &#xE9;poca de lluvias por lo que probablemente la suciedad que arrastra la marea a las playas es mayor que en verano.</p>
<p><strong>Pura Luhur Uluwatu (Temple views)</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/15_bali_uluwatu_temple.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h4 id="ubud">Ubud</h4>
<p>Una ciudad de la isla Indonesa de Bali situada entre campos de arroz. Quer&#xED;a verla ya que se supone que tiene una cultura mucho m&#xE1;s tradicional que la tur&#xED;stica Kuta. Adem&#xE1;s all&#xED; se encuentra el famoso y car&#xED;simo coworking de Hubud.</p>
<p><strong>Rice fields</strong> (2000 IDR - 0,14&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/16_bali_ubud_rice_fields.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Monkey forest</strong> (no recuerdo el precio de la entrada :-()</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/17_bali_ubud_monkey_forest.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Hubud coworking</strong> ($280/mes unlimited, mucho hipster y car&#xED;simo!)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/18_bali_ubud_hubud_coworking.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h4 id="vidanocturna">Vida nocturna</h4>
<p>La mayor&#xED;a de la actividad nocturna se encuentra en Kuta en la calle <strong>Jalan Legian</strong> y en Seminyak en la calle <strong>Jalan Kayu Aya</strong>.</p>
<p>En estas calles te van a ofrecer todo tipo de drogas (marijuana, setas, etc...), adem&#xE1;s de encontraros prostituci&#xF3;n por la calle.</p>
<p>No obstante hay sitios muy chulos con m&#xFA;sica en vivo.</p>
<p><strong>Apache Surfer Bar</strong> (Jalan Legian, 2x1 en cerveza, 50.000 IDR - 3,45&#x20AC;)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/19_bali_kuta_nightlife.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Legian Caf&#xE9;</strong> (Jalan Legian)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/20_bali_kuta_nightlife2.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>La Favela</strong> (Jalan Kayu Aya, precioso sitio)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/21_bali_seminyak_nightlife.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>Por el Sur de Kuta el host de la villa, nos llevo a unos de los bares de la playa Blue Point donde suelen hacer fiestas los domingos hasta la 01:00am. Ambiente surfista, gente guapa y donde el sexo se respira en el aire.</p>
<p><strong>Single Fin</strong> (Blue Point Beach, Sur de Kuta)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/22_bali_singlefin.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/23_bali_singlefin2.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>Estaba conociendo muchas playas, muchos sitios donde comer, salir pero ning&#xFA;n sitio me convenc&#xED;a para hacer mi d&#xED;a a d&#xED;a.</p>
<p>Era momento de cambiar el enfoque y aprovechar la tranquilidad de la villa para centrarse en el trabajo.</p>
<h3 id="focuseneltrabajo">Focus en el trabajo</h3>
<p>Me puse mi rutina para buscar proyectos y a las 2 semanas estaba trabajando en un proyecto como freelance para una persona de Seattle.</p>
<p>Al principio hac&#xED;amos Skype diarios para definir bien el producto y luego a medida que fueron entrando m&#xE1;s desarrolladores fuimos cambiando las comunicaciones a Slack.</p>
<p>Empec&#xE9; trabajando en la villa 8 horas diarias para este proyecto y el resto del tiempo estudiando o en proyectos personales hasta que un d&#xED;a <a href="https://twitter.com/cataflu?ref=dreyacosta.com">@cataflu</a> recomend&#xF3; el <a href="http://thesanurspace.com/?ref=dreyacosta.com">coworking de Sanur</a>.</p>
<h3 id="sanurspaceelcoworkingquelocambitodo">Sanur Space, el coworking que lo cambi&#xF3; todo</h3>
<p>Un poco cansado de trabajar s&#xF3;lo en la villa y gracias a la recomendaci&#xF3;n de <a href="https://twitter.com/cataflu?ref=dreyacosta.com">@cataflu</a>, un d&#xED;a me fu&#xED; hasta el coworking de Sanur.</p>
<p>El espacio peque&#xF1;ito pero acogedor con un jard&#xED;n muy bien acondicionado. El precio muy asequible 50.000 IDR (3,45&#x20AC;) por d&#xED;a.</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/24_bali_sanur_coworking.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/25_bali_sanur_coworking2.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p>A parte del espacio de coworking, tambi&#xE9;n dan clases de Indonesian Bahasa por lo que te encuentras tanto con gente local como extrangera.</p>
<p>La due&#xF1;a es un sol y hace por integrarte entre los dem&#xE1;s miembros del coworking y profesores. Enseguida empec&#xE9; a conocer gente.</p>
<p>Conoc&#xED; a un dise&#xF1;ador franc&#xE9;s que vive en Bali y que trabaja en remoto para una empresa francesa con sede en Singapur.</p>
<p>Otro d&#xED;a conoc&#xED; a un indon&#xE9;s que me cont&#xF3; parte de la historia de Indonesia, c&#xF3;mo funcionan sus calendarios, porque acuden a los templos, las posibilidades que ven en la tecnolog&#xED;a y los problemas que tienen a la hora de crear cosas.</p>
<p>Adem&#xE1;s en el coworking procur&#xE1;n hacer actividades para que conozcas la cultura de Bali llevandote a granjas y arrozales o invitandote a una cena Balinesa en el propio coworking.</p>
<p>Gracias a la due&#xF1;a pude conocer mucho m&#xE1;s de Bali y como moverte en base a lo que voy buscando.</p>
<p>Es genial que a la vez que vas haciendo tu d&#xED;a a d&#xED;a y trabajando en proyectos puedas ir conociendo gente, experiencias y compartiendo conocimiento.</p>
<p>Los &#xFA;ltimos d&#xED;as de la estancia en Bali fueron estupendos con la gente del coworking disfrutando de la mejor puesta de sol que he visto a d&#xED;a de hoy y de una estupenda cena con m&#xFA;sica en vivo.</p>
<p><strong>Seminyak beach</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/26_bali_seminyak_beach_sunset.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><img src="https://dreyacosta.com/content/images/2015/03/27_bali_seminyak_beach_sunset2.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<p><strong>Casablanca restaurant</strong> (Sanur)</p>
<p><img src="https://dreyacosta.com/content/images/2015/03/28_bali_sanur_casablanca.jpg" alt="45 d&#xED;as en Bali" loading="lazy"></p>
<h3 id="theendalgunasconclusiones">The end, algunas conclusiones</h3>
<p>Me voy de Bali con un par de lecciones aprendidas:</p>
<ul>
<li>Estudia las diferentes zonas. Antes de reservar un alojamiento estudia los alrededores o reserva un alojamiento para 1 semana, muevete y decide donde quieres quedarte.</li>
<li>Un buen coworking lo cambia todo. Te permite conocer gente que te sirve como gu&#xED;a para moverte por la ciudad o para seleccionar mejor los sitios que visitar o donde estar.</li>
</ul>
<p>Algo bastante t&#xED;pico en Bali es quedarte sin agua o sin electricidad durante una tarde/noche entera, o al menos en la zona en la que estuve yo. Las infraestructuras dejan mucho que desear y hay bastante pobreza.</p>
<p>Por lo dem&#xE1;s, me faltar&#xF3;n bastantes inputs para la cantidad de d&#xED;a que estuve. Me pareci&#xF3; m&#xE1;s complicado socializar con la gente, necesitar&#xED;a hacer vida en otras zonas de Bali para poder contrastarlo. Me encantar&#xF3;n los paisajes tan salvajes, las playas y las puestas de sol (veremos las de Phuket).</p>
<p>Ah! Y por supuesto prepara 200.000 IDR (13,8&#x20AC;) para salir del pa&#xED;s. As&#xED; es Bali!</p>
<p>&#xBF;Volver&#xE9; a Bali? Es posible pero esta vez tengo los contactos y conozco mejor las zonas donde quedarme y moverme. Estudiar&#xED;a Seminyak o Sanur como posibles sitios.</p>
<p>&#xBF;Mi pr&#xF3;ximo destino? Vuelvo a Tailandia. Esta vez para visitar el sur, Phuket.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Functional JavaScript, some concepts]]></title><description><![CDATA[Basic concepts of functional programming like "First-Class" objects, Higher-order functions, pure functions, lexical closures, immutability, safe recursion.]]></description><link>https://dreyacosta.com/functional-javascript/</link><guid isPermaLink="false">66b7752012da6801457c22aa</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Functional Programming]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Wed, 11 Feb 2015 02:57:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://dreyacosta.com/content/images/2015/02/functional_js-2.png" alt loading="lazy"></p>
<p><small>Disclaimer: This is my first post in English. I know that my English is not very good so feel free to correct me.</small></p>
<p>Functional programming is actually one of the mainstream topic in the world of software development. JavaScript as a flexible lenguaje, allow us to use it in a functional way. In this post I will try to cover some of the basic concepts of functional programming and how to apply them in JavaScript.</p>
<ul>
<li>Functions are &quot;first-class&quot; objects</li>
<li>Functions can return functions (Higher-order functions)</li>
<li>Lexical closures</li>
<li>Functions are &quot;pure&quot;</li>
<li>Safe recursion</li>
<li>No mutating state</li>
</ul>
<h3 id="functionsarefirstclassobjects">Functions are &quot;first-class&quot; objects</h3>
<p>A functional programming language must facilitate the use and creation of <strong>first-class</strong>. The <strong>first-class</strong> means that something has a value. For example:</p>
<pre><code class="language-javascript">var age = 27;</code></pre>
<p><strong>A first-class function is a function that can go anywhere that any other value can go</strong>. In JavaScript is easy to define functions as variables.</p>
<pre><code class="language-javascript">var sum = function (a, b) { return a + b; }</code></pre>
<p>Nothing here is special, but <strong>an important feature of being first-class is the ability to pass functions as an argument</strong>.</p>
<pre><code class="language-javascript">var sum = function (a, b) { return a + b; }
var exec = function (fn, a, b) { return fn(a, b); }

exec(sum, 4, 6); // 10</code></pre>
<h3 id="functionscanreturnfunctionshigherorderfunctions">Functions can return functions (Higher order functions)</h3>
<p>As we see, functions that take functions as arguments and returns other functions are called <strong>Higher order functions</strong>.</p>
<pre><code class="language-javascript">var always = function (value) { 
  return function() { 
    return VALUE;
  }
}</code></pre>
<p>This is useful for illustrating closures. First, a closure will capture a single value (reference) and repeatedly return the same value.</p>
<pre><code class="language-javascript">var f = always(function(){});
f() === f(); // true</code></pre>
<h3 id="lexicalclosures">Lexical Closures</h3>
<p>Closures and scope are one of the main concepts to understand JavaScript.</p>
<blockquote>
<p>A Closure is when an inner function is able to have access to the scope of the parent function even if the parent function has been returned.</p>
</blockquote>
<pre><code class="language-javascript">function myFunc() {
  var message = &apos;Hello&apos;;
  
  function getMessage() {
    console.log(message);
  }
  
  getMessage();
}</code></pre>
<p><code>myFunc</code> function creates a local variable <code>message</code> and a nested function <code>getMessage</code>. <code>getMessage</code> is a Closure because he has the ability to access to the variables of the parent function.</p>
<p>You can learn <a href="http://dreyacosta.com/javascript-closures/">more about Closures here</a>.</p>
<h3 id="functionsarepure">Functions are pure</h3>
<p>A pure function is a function that for an input returns the same output without modifying anything out of it&apos;s scope. Their purity makes them:</p>
<ul>
<li>Testable</li>
<li>Portable</li>
<li>Memoizable</li>
<li>Parallelizable</li>
</ul>
<pre><code class="language-javascript">var double = function (value) {
  return value * 2;
}

var initialValue = 30;
double(initialValue); // 60
initialValue; // still 30
</code></pre>
<h3 id="moreaboutfunctionalprogramming">More about functional programming</h3>
<p>Functional programming languages also worry about safe recursion and immutability. Here are some notes about it:</p>
<h5 id="saferecursion">Safe recursion</h5>
<p>Although you can call a function recursively, it&apos;s not compiled with tail-recursion optimizations so you have to be careful to avoid stack overflow errors.</p>
<h5 id="nomutatingstate">NO mutating state</h5>
<p>JavaScript is not immutable by default but you can write code that doesn&apos;t mutate variables. Pure functions are another way to say NO mutating state.</p>
<p>This is just some of the basics of functional programming with JavaScript. I will try to cover more in the future.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[1 mes en Tailandia, primer mes reseteando mi vida]]></title><description><![CDATA[Mis primeras experiencias en Tailandia (Chiang Mai y Bangkok) y sensaciones reseteando mi vida.]]></description><link>https://dreyacosta.com/1-mes-en-tailandia-primer-mes-reseteando-mi-vida/</link><guid isPermaLink="false">66b7752012da6801457c22ad</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Chiang Mai]]></category><category><![CDATA[Bangkok]]></category><category><![CDATA[Tailandia]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Tue, 13 Jan 2015 06:04:00 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2015/01/thailand_cover_1month.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2015/01/thailand_cover_1month.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida"><p>Ha pasado ya algo m&#xE1;s de 1 mes desde que decid&#xED; <a href="http://dreyacosta.com/resetear-tu-vida/">resetear mi vida</a>. Un mes extra&#xF1;o pero cargado de nuevas experiencias.</p>
<h3 id="madridchiangmai">Madrid &#x2708; Chiang Mai</h3>
<p>No me puedo quejar en absoluto de este vuelo a bordo de la aerolinea Thai que iba casi vac&#xED;o y en el cada pasajero pudo disfrutar tranquilamente de 3 asientos.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/thai_flight.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>As&#xED;, a 11277 metros de altitud y a 1004 km/h, pude disfrutar de una buena lectura, m&#xFA;sica e incluso cabezada para pasar las 13 horas de vuelo.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/thai_info.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Tal y como estaba previsto, a las 6h de la ma&#xF1;ana (hora Thai), llegaba a Bangkok. Todav&#xED;a quedaban 11 horas de escala por delante hasta coger el vuelo Bangkok &#x2708; Chiang Mai.</p>
<p>Aprovech&#xE9; esas horas para comprar una tarjeta SIM con la compa&#xF1;&#xED;a TrueMove (3,5G de datos + acceso gratuito a sus puntos WiFi) por tan s&#xF3;lo 11&#x20AC; y reservar una noche en la guesthouse Boonthavon de Chiang Mai.</p>
<p>As&#xED; pues sobre las 17h de la tarde, cog&#xED; el vuelo hac&#xED;a Chiang Mai que tardo a penas 1 hora. En el aeropuerto de Chiang Mai cog&#xED; un taxi hasta la guesthouse, ducha y en busca de un sitio donde cenar.</p>
<h3 id="chiangmaia966080kmdecasa">Chiang Mai, a 9.660,80 km de casa</h3>
<p>Result&#xF3; bastante sencillo instalarse por lo que los <a href="http://dreyacosta.com/primeros-dias-en-chiang-mai/">primeros d&#xED;as en Chiang Mai</a> no fueron complicados. En pocos d&#xED;as coges la din&#xE1;mica sobre c&#xF3;mo buscar alojamiento, comer, lavar la ropa, comprar y alquilar veh&#xED;culos entre otras cosas.</p>
<ul>
<li>Alojamiento con ventilador: 200 baht (5&#x20AC;/noche).</li>
<li>Comer: unos 80 baht (2&#x20AC;)  la comida Thai y entre 120 (3&#x20AC;) / 200 baht (5&#x20AC;) la comida occidental.</li>
<li>Lavar la ropa: unos 30 baht / kilo (0,76&#x20AC;).</li>
<li>Alquiler scooter 125cc:  350 baht / d&#xED;a (9&#x20AC;).</li>
<li>Comprar: para las necesidades b&#xE1;sica (agua, gel, desodorante, &#x2026;) en los 7 Eleven que encuentras en cualquier esquina. Para ropa, accesorios, etc&#x2026; tienes el bazar nocturno de Chiang Mai con muy buenos precios.</li>
</ul>
<p>Hay que destacar la amabilidad de los Thais muy predispuestos a ayudarte. La verdad que me sorprendi&#xF3; bastante la facilidad con la que puedes iniciar una conversaci&#xF3;n. Es una ciudad muy turista donde sorprentemente hay much&#xED;simos franceses. Mucha gente abierta a contarte cosas sobre Chiang Mai, sus viajes y experiencias.</p>
<p>Los d&#xED;as pasaban y segu&#xED;a andando por la ciudad visitando templos, caf&#xE9;s, restaurantes y trabajando en cualquier sitio con buena conectividad (algo muy f&#xE1;cil en Tailandia y m&#xE1;s teniendo acceso a la WiFi de TrueMove).</p>
<p>Sin embargo no me sentia totalmente realizado.</p>
<h4 id="unamezcladesensaciones">Una mezcla de sensaciones...</h4>
<p>Mi cuerpo estaba inestable con sensaciones un poco extra&#xF1;as. Me hab&#xED;a ido casi a 10.000 km de casa con el fin de aprovechar m&#xE1;s el tiempo y las primeras sensaciones que tuve fueron justamente lo contrario.</p>
<p>Cuando dedicaba demasiado tiempo a hacer turismo sent&#xED;a que no estaba evolucionando profesionalmente y cuando trabajaba demasiado sent&#xED;a que no estaba aprovechando mi tiempo en la ciudad.</p>
<p>No saber si est&#xE1;s de vacaciones, trabajando o dedicando tiempo a ti mismo es bastante incomodo. Encontrar el equilibrio vida profesional y personal me estaba costando m&#xE1;s de lo que pensaba.</p>
<p>As&#xED; que nada como un poco de reflexi&#xF3;n y confianza en uno mismo. Durante casi 7 a&#xF1;os he estado trabajando en el mundo de las tecnolog&#xED;as y mis vacaciones no hab&#xED;an ido mucho m&#xE1;s all&#xE1; de visitar mi ciudad de origen o los respectivos pueblos de mis padres. No iba a pasar nada por tomarme un mes un poco m&#xE1;s relajado, no se me iba a olvidar todo lo que s&#xE9; en 1 mes.</p>
<p>Me apasiona mi trabajo as&#xED; que era cuesti&#xF3;n de tiempo que mi cuerpo me pidiera dedicar tiempo a ello. El coworking de PunSpace me sirvi&#xF3; para ir encontrando el equilibrio en el que dediqu&#xE9; tiempo a estudiar y un poco de code.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/punspace_coworking.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Gracias a las distancias tan cortas y lo manejable que es Chiang Mai, tan s&#xF3;lo hac&#xED;an falta 5 minutos andando desde la Guesthouse para llegar al coworking de PunSpace. Sin duda es toda una maravilla no tener que lidiar con tr&#xE1;fico y distancias largas. Aprovechas mucho m&#xE1;s el d&#xED;a.</p>
<p>Cada d&#xED;a que pasaba me iba sintiendo m&#xE1;s comodo.</p>
<h4 id="ylanavidad">&#xBF;Y la navidad?</h4>
<p>Teniendo en cuenta que los calendarios de Tailandia muestran la era budista, que el a&#xF1;o nuevo se celebra en Abril y que actualmente est&#xE1;n en el a&#xF1;o 2557, lo que se dice  &#x201C;Merry Christmas&#x201D; no hay mucho.</p>
<p>Pero a sabiendas que en Chiang Mai todos los d&#xED;as hay fiesta por la noche, decid&#xED; salir a ver que me encontraba.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/chiangmain_night.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Varios gorros de navidad, sobretodo por parte de los extranjeros, y alguna Thai dese&#xE1;ndome feliz navidad.</p>
<p>La fiesta de Chiang Mai tiene un encanto especial. Varios sitios con m&#xFA;sica en vivo de mucha calidad desde Jazz, Rock y Reggae d&#xF3;nde adem&#xE1;s es muy f&#xE1;cil socializar con la gente.</p>
<p>A diferencia de Espa&#xF1;a la red Line es el principal medio de comunicaci&#xF3;n. Es una pasada la obsesi&#xF3;n que tienen los Thais con los stickers.</p>
<p>El mes iba llegando a su f&#xED;n y tocaba coger el tren para regresar a la capital.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/chiangmai_train_station.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<h3 id="bangkoklaciudaddeltrfico">Bangkok, la ciudad del tr&#xE1;fico</h3>
<p>26 d&#xED;as hab&#xED;an pasado desde mi llegada a Tailandia y tocaba regresar a Bangkok. Esta vez para pasar los &#xFA;ltimos 4 d&#xED;as de visado explorando la capital de Tailandia.</p>
<p>La diferencia de temperatura con respecto a Chiang Mai es de +10 grados. Las distancias son bestiales teni&#xE9;ndote que desplazar en barco, skytrain, metro, taxi o tuk-tuk.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/tuk_tuk.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Opt&#xE9; por dormir en una guesthouse de Rambuttri por la que pagu&#xE9; 250 baht / noche por una habitaci&#xF3;n con ventilador. El cuarto de ba&#xF1;o compartido. La zona m&#xE1;s tur&#xED;stica y los precios de alojamiento m&#xE1;s elevados.</p>
<p>Cerca se encontraba la famosa calle de Khao San Road. Te puedes encontrar de todo en esa calle (tiendas de ropa, restaurantes, clubs, venta de pasaportes/carnet de conducir/&#x2026;, escorpiones cocinados para comer, etc&#x2026;). Aqu&#xED; un contraste curioso de la calle a las 7h de la ma&#xF1;ana y a las 22h de la noche.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/khao_san_road.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Al d&#xED;a siguiente me levant&#xE9; dispuesto a patear Bangkok. S&#xF3;lo cog&#xED; un barco que me dejo a 1.7 km del templo Wat Arun. A partir de ah&#xED; fui andando el resto del d&#xED;a neg&#xE1;ndome a todas las ofertas que me hac&#xED;an los taxistas.</p>
<p><strong>Wat Arun</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/01/wat_arun.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p><strong>Alrededores de Chinatown</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/01/chinatown.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p><strong>Lumpini park</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/01/lumpini_park.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p><strong>Baiyoke Sky Hotel @ 84th floor</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/01/baiyoke.jpg" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p><strong>Siam Square traffic</strong></p>
<p><img src="https://dreyacosta.com/content/images/2015/01/bangkok_traffic.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Tambi&#xE9;n me fui por la famosa calle de Soi Cowboy. Una calle bastante lamentable, llena de turismo sexual muy desagradable. Sinceramente creo que estas chicas podr&#xED;an estar haciendo algo mejor.</p>
<p>Al final del d&#xED;a llegaba a casa con unas ganas de una buena ducha. La poluci&#xF3;n se hab&#xED;a acumulado en mi cuerpo tras un d&#xED;a andando por la capital.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/bangkok_body_pollution.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<p>Es una ciudad inmensa, muy desarrollada, con much&#xED;simo tr&#xE1;fico, mucha contaminaci&#xF3;n y que me ha resultado incomoda al cabo de un par de d&#xED;as. As&#xED; que decid&#xED; tomarme mis &#xFA;ltimas horas mucho m&#xE1;s relajado en una cafeter&#xED;a muy acogedora, con muy buen caf&#xE9; y buena conectividad.</p>
<p><img src="https://dreyacosta.com/content/images/2015/01/bangkok_truecoffee.JPG" alt="1 mes en Tailandia, primer mes reseteando mi vida" loading="lazy"></p>
<h3 id="elfinal">El final</h3>
<p>D&#xED;a 30 de Diciembre, justo 1 d&#xED;a antes de final de a&#xF1;o se me acaba el visado y debo marchar de un pa&#xED;s que me ha gustado bastante sobretodo en lo que respecta Chiang Mai. Bangkok bajo mi punto de vista es una ciudad que est&#xE1; muy bien conocer pero en la que no me quedar&#xED;a m&#xE1;s de unos d&#xED;as.</p>
<p>Por lo dem&#xE1;s muy sorprendido con lo desarrollado que est&#xE1; el pa&#xED;s y lo amable y amigable que es la gente.</p>
<p>Sin duda volver&#xE9; pero tal vez para visitar el sur Tailandia.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Primeros días en Chiang Mai]]></title><description><![CDATA[Primeras aventuras en la ciudad de Chiang Mai, la ciudad más grande y cultural situada en el norte de Tailandia.]]></description><link>https://dreyacosta.com/primeros-dias-en-chiang-mai/</link><guid isPermaLink="false">66b7752012da6801457c22ac</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Chiang Mai]]></category><category><![CDATA[Tailandia]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Mon, 08 Dec 2014 05:32:59 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2014/12/chiangmai_cover.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_cover.jpg" alt="Primeros d&#xED;as en Chiang Mai"><p>Hace apenas 6 d&#xED;as llegabamos a Chiang Mai con una mochila en la espalda totalmente a la aventura y sin alojamiento reservado. As&#xED; es que la primera noche optamos por quedarnos en <a href="http://www.booking.com/hotel/th/boonthavon.html?ref=dreyacosta.com">Boonthavon Guesthouse</a> hasta encontrar una mejor relaci&#xF3;n calidad/precio para pasar el resto de los d&#xED;as del mes de Diciembre.</p>
<p>Una vez dejamos las mochilas y cerca de la Guesthouse donde nos alojabamos encontramos un buen sitio para cenar en el <a href="https://foursquare.com/v/kanjana-cooking-school--restaurant/4e43dbc4fa76eeb2dabbcf3d?ref=dreyacosta.com">Kanjana Restaurant</a> donde probe mi primer Pad Thai.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_pad_thai.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>Tras la cena nos deplazamos hasta el Bazar Nocturno de Chiang Mai. Impresionante la cantidad de cosas que puedes encontrar a unos precios muy baratos.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_bazar_nocturno.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>Al d&#xED;a siguiente de aterrizar en Chiang Mai y viendo las alternativas de la zona, decidimos pasar el resto de los d&#xED;as en <a href="http://www.tripadvisor.com/Hotel_Review-g293917-d1226745-Reviews-Kavil_Guesthouse-Chiang_Mai.html?ref=dreyacosta.com">Kavil Guesthouse</a>. Centritico, limpio y barato.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_kavil_guesthouse.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>A destacar los desayunos que preparan en Kavil por tan s&#xF3;lo 2&#x20AC;.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_kavil_breakfast.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>Tambi&#xE9;n hay tiempo para un poco de <code>code</code> y aunque obviamente no ha sido el &#xFA;nico sitio, el nuevo espacio de coworking de <a href="http://www.punspace.com/?ref=dreyacosta.com">PunSpace</a> situado en pleno centro de Chiang Mai (Tha Phae Gate) est&#xE1; muy bien.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_punspace.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>El s&#xE1;bado una peque&#xF1;a ruta en moto disfrutando de los paisajes del parque nacional de Doi Suthep.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_doi_suthep_park.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>Y el domingo para acabar la semana un paseo por los templos de Chiang Mai como el Wat Chedi Luang.</p>
<p><img src="https://dreyacosta.com/content/images/2014/12/chiangmai_wat_chedi_luang-1.jpg" alt="Primeros d&#xED;as en Chiang Mai" loading="lazy"></p>
<p>Este ha sido el primer foto resumen del comienzo de la aventura por las tierras de Chiang Mai :-D</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Vacunas para viajar al Sudeste Asiático]]></title><description><![CDATA[Una de las primeras cosas que se te vienen a la cabeza para viajar al Sudeste Asiático son las vacunas. Estas son algunas de las preguntas que me hice.]]></description><link>https://dreyacosta.com/vacunas-viajar-sudeste-asia/</link><guid isPermaLink="false">66b7752012da6801457c22ab</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Travel]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Mon, 10 Nov 2014 09:52:00 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2014/11/asia.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2014/11/asia.jpg" alt="Vacunas para viajar al Sudeste Asi&#xE1;tico"><p>Una vez tomas la decisi&#xF3;n de <a href="http://dreyacosta.com/resetear-tu-vida/">resetear tu vida</a> y comenzar la aventura por el Sudeste Asi&#xE1;tico, las vacunaciones es una de las primeras cosas que se te vienen a la cabeza. Estas son algunas de las preguntas que me hice yo.</p>
<h3 id="esobligatoriovacunarse">&#xBF;Es obligatorio vacunarse?</h3>
<p>No es obligatorio vacunarse y la mayor&#xED;a de viajeros con los que he tenido ocasi&#xF3;n de hablar no se han puesto ninguna de las vacunas recomendables. Es cierto que todo depende el tipo de viaje que vayas a hacer y generalmente no hay demasiado peligro estando en ciudades como Bangkok, Chiang Mai, Bali, etc...</p>
<h3 id="quvacunassonrecomendables">&#xBF;Qu&#xE9; vacunas son recomendables?</h3>
<p>Si consultas en los <a href="http://www.msssi.gob.es/profesionales/saludPublica/sanidadExterior/salud/centrosvacu.htm?ref=dreyacosta.com">centros de vacunaci&#xF3;n internacional</a> te van a recomendar las siguientes vacunas:</p>
<ul>
<li><strong>Hepatitis A y B</strong></li>
<li><strong>Fiebre tifoidea</strong> (vacuna oral)</li>
<li><strong>C&#xF3;lera</strong> (vacuna oral)</li>
<li><strong>Gripe</strong></li>
</ul>
<p>Bajo tu criterio dejan la vacuna contra la Encefalitis japonesa. Se transmite por picadura de mosquitos del g&#xE9;nero &quot;Culex&quot; presentes sobretodo en zonas rurales, granjas de cerdos y campos de arrozales. No est&#xE1; cubierta por la seguridad social y tiene un coste de 80&#x20AC;. En mi caso particular he optado por no ponermela.</p>
<p>En cuanto a la vacuna de la gripe te la ponen por currarse en salud de modo que si vienes con fiebre puedan descartar que se trate de una gripe.</p>
<h3 id="qutrmitessonnecesarios">&#xBF;Qu&#xE9; tr&#xE1;mites son necesarios?</h3>
<p>Teniendo en cuenta que vivo en Espa&#xF1;a he tenido que solicitar cita en un centro de vacunaci&#xF3;n internacional donde en funci&#xF3;n de donde vas a viajar te recomiendan unas vacunas u otras. Con el informe que te dan tienes que ir a tu m&#xE9;dico de familia y solicitar cita con una enfermera para ponerte las vacunas.</p>
<h3 id="cmoseadministran">&#xBF;C&#xF3;mo se administran?</h3>
<p>Las vacunas de la Hepatitis A y B te las pueden poner en vacunas independientes o en una vacuna conjunta. Esto puede variar en funci&#xF3;n de las que ya tengas por tu calendario vacunal. Si como en mi caso tienes dudas sobre las vacunas que tienes puestas, puedes solicitar una serolog&#xED;a.</p>
<p>Hepatitis, vacunas independientes:</p>
<ul>
<li><strong>Hepatitis A</strong>: 2 dosis con un intervalo de 6 meses entre cada una.</li>
<li><strong>Hepatitis B</strong>: 3 dosis. La segunda dosis se pone al mes y la tercera a los 6 meses.</li>
</ul>
<p>Hepatitis, vacuna conjunta:</p>
<ul>
<li><strong>Hepatitis A y B</strong> (vacuna conjunta): 3 dosis. La segunda dosis se pone al mes y la tercera a los 6 meses.</li>
</ul>
<p>Resto de vacunas recomendables:</p>
<ul>
<li><strong>Fiebre tifoidea</strong> (oral): 3 dosis a tomar con un intervalo de 2 d&#xED;as entre dosis.</li>
<li><strong>C&#xF3;lera</strong> (oral): 2 dosis a tomar con un intervalo de 7 d&#xED;as entre dosis.</li>
</ul>
<p>Espero que mi experiencia con las vacunas para el Sudeste Asi&#xE1;tico os sirva de ayuda. Os seguir&#xE9; contando mis aventuras.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Resetear tu vida]]></title><description><![CDATA[Necesito un cambio radical. Deshacerme de todo lo que no entre una mochila y viajar por el mundo. Quiero experimentar y buscar nuevas experiencias.]]></description><link>https://dreyacosta.com/resetear-tu-vida/</link><guid isPermaLink="false">66b7752012da6801457c22a9</guid><category><![CDATA[Nomad]]></category><category><![CDATA[Asia]]></category><category><![CDATA[Travel]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Tue, 21 Oct 2014 12:28:00 GMT</pubDate><media:content url="https://dreyacosta.com/content/images/2014/11/long-road-into-the-sunset.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/2014/11/long-road-into-the-sunset.jpg" alt="Resetear tu vida"><p>Mi vida es bastante buena, tengo 27 a&#xF1;os, y llevo 6 a&#xF1;os dedic&#xE1;ndome a lo que me apasiona. Vivo por mi cuenta en un apartamento de Madrid, tengo buenos amigos y todas las comodidades de una gran ciudad.</p>
<p>Sin embargo no estoy del todo feliz. &#xDA;ltimamente nada cambia. Me levanto, me desplazo hasta la oficina, vuelvo a casa 10 horas despu&#xE9;s, ceno, trabajo en proyectos personales. Los d&#xED;as se han convertido en una gran rutina.</p>
<p>Tengo esa sensaci&#xF3;n constante de estacamiento que mi naturaleza inconformista no puede sorportar. Tras muchas reflexiones y debates conmigo mismo he llegado a la conclusi&#xF3;n que no soy due&#xF1;o de mi vida. Son muchos los condicionantes que me hacen sentir que no estoy aprovechando el tiempo, que no estoy creciendo y que no estoy disfrutando la vida todo lo que deber&#xED;a.</p>
<p>Necesito un cambio radical. Deshacerme de todo lo que no entre una mochila y viajar por el mundo. Quiero experimentar, buscar nuevas experiencias y decidir como quiero vivir.</p>
<blockquote>
<p>The world is a book and those who do not travel read only one page.</p><p><cite title="Augustine of Hippo">Augustine of Hippo</cite></p><p></p>
</blockquote>
<p>Empezar&#xE9; por el Sudeste Asi&#xE1;tico. Voy como turista, as&#xED; que en principio no estar&#xE9; m&#xE1;s de 30 d&#xED;as en cada pa&#xED;s. Creo que Tailandia e Indonesia pueden ser buenos sitios para comenzar. Pa&#xED;ses tranquilos, con una cultura diferente y baratos para vivir.</p>
<p>La idea es muy sencilla: conocer nueva gente, nuevas culturas, buscar nuevas experiencias, dedicar m&#xE1;s tiempo a mi mismo, ser due&#xF1;o de mi vida.</p>
<p>Como dice Henry Miller, quiero aprender del mejor maestro: la vida.</p>
<blockquote>
<p>I think the teacher (with a capital T) ranks with the sage and the seer. It is our misfortune not to be able to breed such animals. What is called education is to me utter nonsense and detrimental to growth. Despite all the social and political upheavals we have been through the authorized educational methods throughout the civilized world remain, in my mind at least, archaic and stultifying. They help to perpetuate the ills which cripple us. William Blake said: &#x201C;The tigers of wrath are wider than the horses of instruction.&#x201D; I learned nothing of value at school. I don&#x2019;t believe I could pass a grammar school test on any subject even today. I learned more from idiots and nobodies than from professors of this and that. Life is the teacher, not the Board of Education.</p><p><cite title="Henry Miller">Henry Miller</cite></p><p></p>
</blockquote>
<p>Por suerte mi profesi&#xF3;n me permite trabajar de manera deslocalizada as&#xED; que seguir&#xE9; haciendo lo que m&#xE1;s me gusta. Quiero evolucionar mucho m&#xE1;s en este area y estoy convencido que tener esta experiencia me ayudar&#xE1; a tener una visi&#xF3;n m&#xE1;s amplia de las cosas as&#xED; como a desarrollar mejor mi trabajo.</p>
<p>Constantemente me recuerdo que s&#xF3;lo vivimos una vez por lo que debemos perseguir nuestros sue&#xF1;os y buscar la felicidad el m&#xE1;ximo tiempo posible.</p>
<p>Es el momento de resetear y afrontar un nuevo camino&#x2026;</p>
<p>Os seguir&#xE9; contando todos los avances, preparativos y decisiones que tengo tomar de aqu&#xED; a mi marcha.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Continuous deployment con GitHub, Bitbucket, DigitalOcean y dploy.io]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Despu&#xE9;s de estar investigando posibles soluciones para montar un sistema de &apos;integraci&#xF3;n continua&apos; sencillo y mantenible compatible con <strong>GitHub</strong>, <strong>Bitbucket</strong> y <strong>DigitalOcean</strong>, mont&#xE9; esta soluci&#xF3;n apoyada en un servicio de despliegue continuo llamado <a href="http://dploy.io/?ref=dreyacosta.com">dploy.io</a>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_00_landing.png" alt loading="lazy"></p>
<h3 id="entornodeproduccin">Entorno de producci&#xF3;n</h3>
<p>Antes</p>]]></description><link>https://dreyacosta.com/continuous-deployment-con-github-bitbucket-digitalocean-y-dploy-io/</link><guid isPermaLink="false">66b7752012da6801457c22a8</guid><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Thu, 10 Jul 2014 11:48:09 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Despu&#xE9;s de estar investigando posibles soluciones para montar un sistema de &apos;integraci&#xF3;n continua&apos; sencillo y mantenible compatible con <strong>GitHub</strong>, <strong>Bitbucket</strong> y <strong>DigitalOcean</strong>, mont&#xE9; esta soluci&#xF3;n apoyada en un servicio de despliegue continuo llamado <a href="http://dploy.io/?ref=dreyacosta.com">dploy.io</a>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_00_landing.png" alt loading="lazy"></p>
<h3 id="entornodeproduccin">Entorno de producci&#xF3;n</h3>
<p>Antes de nada vamos a repasar el entorno de producci&#xF3;n:</p>
<ul>
<li>Servidor Debian 7.0 x32</li>
<li>Node.js</li>
<li>Grunt.js</li>
<li>pm2</li>
</ul>
<p>La aplicaci&#xF3;n se encuentra en la ruta <code>/www/continuous-deployment-dploy.io/</code> corriendo con <strong>pm2</strong> y la opci&#xF3;n de <strong>watching</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/pm2_01_before_success_deploy.png" alt loading="lazy"></p>
<p>El proyecto est&#xE1; hosteado en <a href="https://github.com/dreyacosta/continuous-deployment-dploy.io?ref=dreyacosta.com">GitHub</a>.</p>
<h3 id="objetivo">Objetivo</h3>
<p>El objetivo que queremos conseguir con todo esto es el siguiente:</p>
<ul>
<li>Al hacer un <strong>push</strong> a la rama <strong>master</strong> de nuestro repositorio se desplieguen los cambios en una ruta segura de nuestro servidor de producci&#xF3;n. <code>/checker/continuous-deployment-dploy.io/</code></li>
<li>En esa ruta segura se ejecute toda la bater&#xED;a de test.</li>
<li>Si los tests pasan entonces desde la ruta donde est&#xE1; la aplicaci&#xF3;n en producci&#xF3;n se hace un <strong>pull</strong> al repositorio y se recogen los nuevos cambios.</li>
<li><strong>pm2</strong> detecta que hay nuevos cambios en la aplicaci&#xF3;n y la reinicia.</li>
</ul>
<h3 id="configuracindedployio">Configuraci&#xF3;n de dploy.io</h3>
<p>Tenemos todo listo para iniciar la configuraci&#xF3;n en <a href="http://dploy.io/?ref=dreyacosta.com">dploy.io</a>. As&#xED; que nos logueamos con nuestra cuenta y vamos al apartado <strong>Repositories</strong> y le damos al bot&#xF3;n <strong>Connect a repository</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_01_repositories.png" alt loading="lazy"></p>
<p>En la siguiente ventana conectamos con nuestro repositorio de <strong>GitHub</strong>, <strong>Bitbucket</strong> o el nuestro propio. En este caso usaremos el de <strong>GitHub</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_02_connect_repository.png" alt loading="lazy"></p>
<p>Ahora veremos los repositorios conectados a nuestra cuenta. Antes de seguir adelante configurando el despliegue continuo, vamos a integrar nuestra cuenta de <strong>DigitalOcean</strong> con la de <strong>dploy</strong> haciendo clic en <strong>Integrations</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_03_repositories_02.png" alt loading="lazy"></p>
<p>Tan sencillo como rellenar nuestro datos de <strong>DigitalOcean</strong> para conectar la cuenta.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_04_integrations.png" alt loading="lazy"></p>
<p>Ahora ya estamos listos para volver a nuestra lista de <strong>Repositories</strong> y pinchar en el que queremos configurar. En este caso <strong>continuous-deployment-dploy.io</strong>. Una vez dentro veremos la siguiente pantalla en la que tendremos que configurar nuestros entornos y servidores. Para ello pinchamos en <strong>Create Environment &amp; Server</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_05_repository_overview.png" alt loading="lazy"></p>
<p>Puesto que queremos a&#xF1;adir un servidor de nuestra cuenta de <strong>DigitalOcean</strong> seleccionamos esa opci&#xF3;n y hacemos clic en <strong>Next Step</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_07_add_server.png" alt loading="lazy"></p>
<p>A continuaci&#xF3;n le damos un nombre al servidor, configuramos que carpetas del repositorio queremos desplegar, el droplet de <strong>DigitalOcean</strong> y ruta sobre la que queremos desplegar. Fijaros que <strong>la ruta de despliegue no es la misma ruta que la de nuestra aplicaci&#xF3;n en producci&#xF3;n</strong> (esta es la ruta segura donde se lanzar&#xE1; la bater&#xED;a de tests).</p>
<p><strong>Importante asegurarse que nuestro servidor de DigitalOcean dispone de la clave SSH</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_08_new_digitalocean_server.png" alt loading="lazy"></p>
<p>Realizadas las configuraciones obligatorias, vamos con las opcionales. No obstante son muy importantes ya que le vamos a indicar una serie de comandos para ejecutar nuestra bater&#xED;a de tests y si todo va bien que se haga el despliegue en la ruta donde est&#xE1; la aplicaci&#xF3;n en producci&#xF3;n.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_09_add_server.png" alt loading="lazy"></p>
<p>Ya tenemos nuestro sistema de &quot;integraci&#xF3;n continua&quot; configurado. Para probar que todo funciona podemos hacer un primer despliegue manual pulsando el bot&#xF3;n <strong>Deploy</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_10_ready_set_deploy.png" alt loading="lazy"></p>
<p>Seleccionamos la revisi&#xF3;n que queremos desplegar y un mensaje opcional. Seguimos, pulsando en el bot&#xF3;n <strong>Review Deployment</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_11_manualdeploy_01.png" alt loading="lazy"></p>
<p>Veremos un review del deploy. Si todo est&#xE1; correcto pulsamos en <strong>Start Deployment</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_12_manualdeploy_02.png" alt loading="lazy"></p>
<p>A continuaci&#xF3;n veremos el hist&#xF3;rico de nuestros despliegues y como vemos el despliegue ha fallado. Podemos ver lo que ha pasado pulsando el bot&#xF3;n <strong>Transfer Log</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_13_deploy_history_fail.png" alt loading="lazy"></p>
<p>Se puede observar claramente un fallo en un Unit test de <strong>Mocha</strong>.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_14_deploy_transfer_log_fail.png" alt loading="lazy"></p>
<p>Arreglamos nuestro c&#xF3;digo para que pase el test, hacemos un nuevo <strong>push</strong> a nuestra rama de <strong>master</strong> y esta vez vemos que es despliegue se ha realizado correctamente.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/dployio_15_deploy_fixed.png" alt loading="lazy"></p>
<p>Si revisamos la monitorizaci&#xF3;n de <strong>pm2</strong> vemos que ha reiniciado la aplicaci&#xF3;n.</p>
<p><img src="https://dreyacosta.com/content/images/2014/Jul/pm2_02_after_success_deploy.png" alt loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[JavaScript Closures]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Las Closures son funciones que se refieren a variables independientes.</p>
<p>Un ejemplo vale m&#xE1;s que mil palabras:</p>
<pre><code class="language-javascript">function myFunc() {
  var message = &apos;Hello&apos;;
  
  function getMessage() {
    console.log(message);
  }
  
  getMessage();
}</code></pre>
<p>La funci&#xF3;n <code>myFunc</code> crea una variable local <code>message</code> y una funci&#xF3;n anidada <code>getMessage</code>. La</p>]]></description><link>https://dreyacosta.com/javascript-closures/</link><guid isPermaLink="false">66b7752012da6801457c22a7</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Closures]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Mon, 24 Mar 2014 08:43:36 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Las Closures son funciones que se refieren a variables independientes.</p>
<p>Un ejemplo vale m&#xE1;s que mil palabras:</p>
<pre><code class="language-javascript">function myFunc() {
  var message = &apos;Hello&apos;;
  
  function getMessage() {
    console.log(message);
  }
  
  getMessage();
}</code></pre>
<p>La funci&#xF3;n <code>myFunc</code> crea una variable local <code>message</code> y una funci&#xF3;n anidada <code>getMessage</code>. La funci&#xF3;n anidada <code>getMessage</code> es una Closure y aunque no tiene variables locales es capaz de acceder a las variables de la funci&#xF3;n padre.</p>
<p>Vamos a hacerlo m&#xE1;s interesante:</p>
<pre><code class="language-javascript">function myFunc() {
  var message = &apos;Hello&apos;;
  
  function getMessage() {
    console.log(message);
  }
  
  return getMessage;
}

var fn = myFunc();
fn(); // Hello</code></pre>
<p>Este c&#xF3;digo tiene exactamente el mismo efecto que el anterior. La principal ventaja es que estamos exponiendo p&#xFA;blicamente la funci&#xF3;n <code>getMessage</code>, la &#xFA;nica en tener acceso a la variable local <code>message</code> de la funci&#xF3;n <code>myFunc</code>. Esto hace que la variable <code>message</code> no se pueda modificar y cada vez que se quiera acceder a ella se tenga que invocar la funci&#xF3;n devuelta por <code>myFunc</code>, en este caso la que dejamos en la variable <code>fn</code>.</p>
<h3 id="funcionesyvariablesprivadas">Funciones y variables privadas</h3>
<p>A diferencia de otros lenguajes, JavaScript no ofrece la posibilidad de declarar m&#xE9;todos privados.</p>
<p>Sin embargo gracias a las Closures podemos emular funciones privadas adem&#xE1;s de poder encapsular el c&#xF3;digo.</p>
<p>Veamos un ejemplo:</p>
<pre><code class="language-javascript">var counter = (function() {
  var value = 0;
  
  function modify(val) {
    value += val;
  }
  
  return {
    increment: function() {
      modify(1);
    },
    decrement: function() {
      modify(-1);
    },
    getValue: function() {
    	return value;
    }
  }
})();

counter.getValue(); // 0

counter.increment();
counter.getValue(); // 1

counter.decrement();
counter.getValue(); // 0</code></pre>
<p>En este ejemplo tenemos una funci&#xF3;n <code>counter</code>. Esta funci&#xF3;n tiene una variable local <code>value</code> privada y m&#xE9;todo <code>modify</code> privado. As&#xED; mismo se est&#xE1;n devolviendo 3 m&#xE9;todos <code>increment</code>, <code>decrement</code> y <code>getValue</code> que son p&#xFA;blicos.</p>
<p>De esta manera para incrementar el valor del <code>counter</code> tenemos que llamar al m&#xE9;todo p&#xFA;blico <code>increment</code>, para disminuir el valor hay que invocar el m&#xE9;todo <code>decrement</code> y para obtener el valor en curso del <code>counter</code> el m&#xE9;todo <code>getValue</code>.</p>
<p>Usar Closures de este modo tambi&#xE9;n se conoce como Module Pattern.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[JavaScript Hoisting]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Teniendo en cuenta el siguiente c&#xF3;digo:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;
console.log(message); // Hello World</code></pre>
<p>Vale, creo que todos estamos de acuerdo con el resultado. Vamos a a&#xF1;adir una funci&#xF3;n autoejecutable:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  console.log(message); // Hello</code></pre>]]></description><link>https://dreyacosta.com/javascript-hoisting/</link><guid isPermaLink="false">66b7752012da6801457c22a6</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Hoisting]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Mon, 10 Mar 2014 08:55:54 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Teniendo en cuenta el siguiente c&#xF3;digo:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;
console.log(message); // Hello World</code></pre>
<p>Vale, creo que todos estamos de acuerdo con el resultado. Vamos a a&#xF1;adir una funci&#xF3;n autoejecutable:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  console.log(message); // Hello World
})();</code></pre>
<p>Bastante l&#xF3;gico, creo que seguimos de acuerdo. Vamos a crear pues una variable local dentro de la funci&#xF3;n an&#xF3;nima:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  console.log(message); // undefined
  var message = &apos;Local World&apos;;
})();</code></pre>
<p>WAT! &#xBF;Por qu&#xE9; la variable <code>message</code> no est&#xE1; definida? &#xBF;La variable declarada no deber&#xED;a tener efecto?</p>
<h3 id="hoistingdevariables">Hoisting de Variables</h3>
<p>Dentro del scope de la funci&#xF3;n, el int&#xE9;rprete interno pasa a ubicar las variables al inicio del scope independientemente de donde se declaren. Sin embargo, s&#xF3;lo la <code>declaration</code> es &quot;Hosteada&quot;. Si la variable est&#xE1; <code>initialized</code>, su valor, al inicio del scope, pasar&#xE1; a <code>undefined</code>.</p>
<p>Es importante diferenciar entre <code>declaration</code> y <code>initialization</code>.</p>
<h4 id="declaration">Declaration</h4>
<pre><code class="language-javascript">var message; //  the declaration</code></pre>
<h4 id="initialization">Initialization</h4>
<pre><code class="language-javascript">message = &apos;Hello World&apos;; // the initialization</code></pre>
<p>As&#xED; pues el siguiente c&#xF3;digo ser&#xED;a una mala pr&#xE1;ctica:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  var one = &apos;Message 1&apos;;
  // Your code...
  var two = &apos;Message 2&apos;;
  // More code...
  var three = &apos;Message 3&apos;;
  // And more...
})();</code></pre>
<h3 id="declaralasvariablesalprincipio">&#xA1;Declara las variables al principio!</h3>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  var one, two, three; // variables declared
  one = &apos;Message 1&apos;; // initialized
  // Your code...
  two = &apos;Message 2&apos;; // initialized
  // More code...
  three = &apos;Message 3&apos;; // initialized
  // And more...
})();</code></pre>
<p>As&#xED; que volviendo al c&#xF3;digo original:</p>
<pre><code class="language-javascript">var message = &apos;Hello World&apos;;

(function() {
  console.log(message); // undefined
  var message = &apos;Local World&apos;;
})();</code></pre>
<p>Entendemos que en el momento de la declaraci&#xF3;n la variable pasa a ubicarse al inicio (hoisted) del contexto pero como la inicializaci&#xF3;n no es &quot;Hosteada&quot; su valor pasa a ser <code>undefined</code>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Sobre Node, npm, package.json y Express]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://dreyacosta.com/content/images/2014/Jan/nodejs.png" alt loading="lazy"></p>
<p>Vamos a repasar alguno de los conceptos que conviene tener claros a la hora de trabajar con un proyecto de <strong>Node</strong>.</p>
<p class="text center"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- dreyacosta responsive x1 -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-auto-format="rspv" data-full-width>
  <div overflow></div>
</amp-ad></p>
<p></p>
<p>Si quer&#xE9;is instalaros un entorno de desarrollo os recomiendo que ech&#xE9;is un vistazo a estos dos <a href="http://dreyacosta.com/instalacion-de-nodejs-en-osx-y-debian-ubuntu/">screencasts de Nettuts+ sobre Node</a></p>]]></description><link>https://dreyacosta.com/webserver-con-node-y-express/</link><guid isPermaLink="false">66b7752012da6801457c22a5</guid><category><![CDATA[ExpressJS]]></category><category><![CDATA[NodeJS]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Mon, 20 Jan 2014 08:15:19 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://dreyacosta.com/content/images/2014/Jan/nodejs.png" alt loading="lazy"></p>
<p>Vamos a repasar alguno de los conceptos que conviene tener claros a la hora de trabajar con un proyecto de <strong>Node</strong>.</p>
<p class="text center"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- dreyacosta responsive x1 -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-auto-format="rspv" data-full-width>
  <div overflow></div>
</amp-ad></p>
<p></p>
<p>Si quer&#xE9;is instalaros un entorno de desarrollo os recomiendo que ech&#xE9;is un vistazo a estos dos <a href="http://dreyacosta.com/instalacion-de-nodejs-en-osx-y-debian-ubuntu/">screencasts de Nettuts+ sobre Node</a>.</p>
<p class="text center"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- dreyacosta responsive x1 -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-auto-format="rspv" data-full-width>
  <div overflow></div>
</amp-ad></p>
<p></p>
<h3 id="quesnodejs">&#xBF;Qu&#xE9; es Node.js?</h3>
<p><strong>Node.js es una plataforma construida sobre el motor de JavaScript de Google Chrome (V8)</strong> que permite un f&#xE1;cil y r&#xE1;pido desarrollo de aplicaciones escalables.</p>
<p>En otros terminos <strong>permite la ejecuci&#xF3;n de JavaScript en el lado del servidor</strong>.</p>
<h3 id="usosdenodejs">Usos de Node.js</h3>
<p>Las posibilidades que ofrece <strong>Node</strong> van m&#xE1;s haya de un simple <strong>Web Server</strong> as&#xED; es que muchos desarrolladores la utilizan como una herramienta m&#xE1;s de <strong>Workflow</strong>.</p>
<h4 id="webserver">Web server</h4>
<p>Uno de los usos m&#xE1;s comunes de <strong>Node</strong> es montarse un <strong>servidor HTTP</strong>. Para ello podemos utilizar el m&#xF3;dulo <strong>http</strong> que viene incluido en el core de <strong>Node</strong>.</p>
<pre><code>// Load the http module to create an http server.
var http = require(&apos;http&apos;);

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/plain&quot;});
  response.end(&quot;Hello World\n&quot;);
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log(&quot;Server running at http://127.0.0.1:8000/&quot;);
</code></pre>
<h4 id="workflowtool">Workflow tool</h4>
<p>La impresionante comunidad de <strong>Node</strong> ha desarrollado multitud de paquetes para hacer de <strong>Node</strong> una herramienta casi imprescindible en el proceso de desarrollo.</p>
<p>Lenguajes como <strong>CoffeeScript</strong> que compilan a <strong>JS</strong>, preprocesadores <strong>CSS</strong> como <strong>Stylus</strong> o linters de <strong>JS</strong> como <strong>JSHint</strong> corren bajo <strong>Node</strong>.</p>
<p>Pero esto no ser&#xED;a tan bonito sin un <strong>gestor de tareas JavaScript como Grunt o Gulp</strong> que permiten centralizar y automatizar est&#xE1;s tareas para que con un simple comando o con un watcher tengamos <strong>CoffeScript</strong> compilado a <strong>JS</strong>, <strong>Stylus</strong> en <strong>CSS</strong> o <strong>JSHint</strong> pasado.</p>
<p>Ejemplo de Gruntfile.js:</p>
<pre><code>module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON(&apos;package.json&apos;),

    stylus: {
      compile: {
        options: {
          compress: true
        },
        files: {
          &apos;stylesheets/xpressio.css&apos;: [&apos;stylesheets/xpressio.styl&apos;]
        }
      }
    }
     
    watch: {
      stylus: {
        files: [&apos;stylesheets/*.styl&apos;],
        tasks: [&apos;stylus&apos;]
      }
    }
  });

  grunt.loadNpmTasks(&apos;grunt-contrib-stylus&apos;);
  grunt.loadNpmTasks(&apos;grunt-contrib-watch&apos;);

  // Default task(s).
  grunt.registerTask(&apos;default&apos;, [&apos;stylus&apos;, &apos;jshint&apos;]);

};</code></pre>
<h3 id="nodepackagedmanagernpm">Node Packaged Manager (npm)</h3>
<p><img src="https://dreyacosta.com/content/images/2014/Jan/npm.png" alt loading="lazy"></p>
<p>Todo este tipo de herramientas que comentaba (CoffeeScript, Stylus, JSHint, Grunt, Gulp, ...) est&#xE1;n disponibles en el gestor de paquetes de <strong>Node</strong>, <strong>npm</strong>.</p>
<p class="text center"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- dreyacosta responsive x1 -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-auto-format="rspv" data-full-width>
  <div overflow></div>
</amp-ad></p>
<p>La enorme y activa comunidad de <strong>Node</strong> ha hecho que a d&#xED;a de hoy est&#xE9;n disponibles m&#xE1;s de <strong>55 400 paquetes</strong>.</p>
<p>El uso de <strong>npm</strong> es muy sencillo.</p>
<pre><code># Package installation
npm install &lt;packageName&gt;

# Global package installation (probably need sudo)
sudo npm install &lt;packageName&gt; -g

# Save package dependency on package.json
npm install &lt;packageName&gt; --save

# Save package as devDependency on package.json
npm install &lt;packageName&gt; --save-dev
</code></pre>
<p>Ejemplos pr&#xE1;cticos:</p>
<pre><code># Grunt
sudo npm install grunt-cli -g

# CoffeeScript
sudo npm install coffee-script -g

# Stylus
sudo npm install stylus -g

# Grunt and Grunt plugins
npm install grunt --save-dev
npm install grunt-contrib-coffee --save-dev
npm install grunt-contrib-stylus --save-dev
npm install grunt-contrib-watch --save-dev
</code></pre>
<h3 id="paraqusirveelarchivopackagejson">&#xBF;Para qu&#xE9; sirve el archivo package.json?</h3>
<p>En este archivo, que debe estar en la ra&#xED;z del proyecto, va a quedar reflejada la configuraci&#xF3;n del proyecto de <strong>Node</strong> tales como:</p>
<ul>
<li>Nombre del proyecto.</li>
<li>Autor.</li>
<li>Versi&#xF3;n.</li>
<li>Dependencias.</li>
<li>Scripts.</li>
<li>Repositorio Git.</li>
<li>Motor de Node.</li>
<li>...</li>
</ul>
<p>Tal y como se indica en la <a href="https://npmjs.org/doc/json.html?ref=dreyacosta.com">documentaci&#xF3;n del package.json</a>:</p>
<blockquote>
<p>The most important things in your package.json are the name and version fields. Those are actually required, and your package won&apos;t install without them. The name and version together form an identifier that is assumed to be completely unique. Changes to the package should come along with changes to the version.</p>
</blockquote>
<p>El archivo <strong>package.json</strong> puede crearse con el asistente de <strong>npm</strong>:</p>
<pre><code>npm init
</code></pre>
<p>Aqu&#xED; un ejemplo de parte del <strong>package.json</strong> de Ghost:</p>
<pre><code>{
  &quot;name&quot;        : &quot;ghost&quot;,
  &quot;version&quot;     : &quot;0.4.0&quot;,
  &quot;description&quot; : &quot;Just a blogging platform.&quot;,
  &quot;author&quot;      : &quot;Ghost Foundation&quot;,
  &quot;homepage&quot;    : &quot;http://ghost.org&quot;,
  &quot;keywords&quot;    : [
    &quot;ghost&quot;,
    &quot;blog&quot;,
    &quot;cms&quot;
  ],
  &quot;repository&quot;  : {
    &quot;type&quot;: &quot;git&quot;,
    &quot;url&quot;: &quot;git://github.com/TryGhost/Ghost.git&quot;
  },
  &quot;bugs&quot;        : &quot;https://github.com/TryGhost/Ghost/issues&quot;,
  &quot;contributors&quot;: &quot;https://github.com/TryGhost/Ghost/graphs/contributors&quot;,
  &quot;private&quot;     : true,
  &quot;licenses&quot;    : [
    {
      &quot;type&quot;: &quot;MIT&quot;,
      &quot;url&quot;: &quot;https://raw.github.com/TryGhost/Ghost/master/LICENSE&quot;
    }
  ],
  &quot;main&quot;: &quot;./core/index&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node index&quot;,
    &quot;test&quot;: &quot;grunt validate --verbose&quot;
  },
  &quot;engines&quot;: {
    &quot;node&quot;: &quot;~0.10.0&quot;
  },
  &quot;engineStrict&quot;: true,
  &quot;dependencies&quot;: {
    &quot;bcryptjs&quot;: &quot;0.7.10&quot;,
    &quot;connect-slashes&quot;: &quot;1.2.0&quot;,
    &quot;downsize&quot;: &quot;0.0.4&quot;,
    &quot;express&quot;: &quot;3.4.6&quot;,
    &quot;express-hbs&quot;: &quot;0.5.2&quot;,
    &quot;when&quot;: &quot;2.7.0&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;blanket&quot;: &quot;~1.1.5&quot;,
    &quot;grunt&quot;: &quot;~0.4.1&quot;,
    &quot;grunt-contrib-compress&quot;: &quot;~0.5.2&quot;,
    &quot;grunt-contrib-concat&quot;: &quot;~0.3.0&quot;,
    &quot;should&quot;: &quot;~2.1.1&quot;,
    &quot;sinon&quot;: &quot;~1.7.3&quot;,
    &quot;supertest&quot;: &quot;~0.8.2&quot;
  }
}</code></pre>
<h3 id="expressunwebframework">Express, un Web framework</h3>
<p><img src="https://dreyacosta.com/content/images/2014/Jan/expressjs.png" alt loading="lazy"></p>
<p>Uno de los frameworks por excelencia cuando queremos montar un Web server con <strong>Node</strong> es <strong>Express</strong>.</p>
<p>Esta es la definici&#xF3;n que pod&#xE9;is encontrar en la <a href="http://expressjs.com/?ref=dreyacosta.com">Web de Express</a>:</p>
<blockquote>
<p>Express is a minimal and flexible node.js web application framework, providing a robust set of features for building single and multi-page, and hybrid web applications.</p>
</blockquote>
<p>Nos facilita el manejo de:</p>
<ul>
<li>
<p><strong>Est&#xE1;ticos</strong>: ruta p&#xFA;blica donde generalmente se alojan assets (CSS, images, JS).</p>
<pre><code>  app.use(express.static(path.join(__dirname, &apos;public&apos;)));
</code></pre>
</li>
<li>
<p><strong>Controladores</strong>: encargados de controlar las peticiones <strong>http</strong>.</p>
<pre><code>  app.post(&apos;/login&apos;, function(req, res) {});
</code></pre>
</li>
<li>
<p><strong>Sesiones y cookies</strong>:</p>
<pre><code>  app.use(express.cookieParser(&apos;your secret here&apos;));
  app.use(express.session());
</code></pre>
</li>
<li>
<p><strong>Templates</strong>: ruta de la vistas y motor de templates (Handlebars, Jade, Mustache, ...).</p>
<pre><code>  app.set(&apos;views&apos;, path.join(__dirname, &apos;views&apos;));
  app.set(&apos;view engine&apos;, &apos;jade&apos;);
</code></pre>
</li>
<li>
<p><strong>Preprocesador CSS</strong>:</p>
<pre><code>  app.use(require(&apos;stylus&apos;).middleware(path.join(__dirname, &apos;public&apos;)));
</code></pre>
</li>
<li>
<p>...</p>
</li>
</ul>
<p>Como cualquier paquete de <strong>Node</strong> su instalaci&#xF3;n es muy sencilla:</p>
<pre><code>sudo npm install express -g
</code></pre>
<p>Una vez instalado podremos ver el usage con el flag <strong>-h</strong>.</p>
<pre><code>express -h

Usage: express [options] [dir]

Options:

-h, --help          output usage information
-V, --version       output the version number
-s, --sessions      add session support
-e, --ejs           add ejs engine support (defaults to jade)
-J, --jshtml        add jshtml engine support (defaults to jade)
-H, --hogan         add hogan.js engine support
-c, --css &lt;engine&gt;  add stylesheet &lt;engine&gt; support (less|stylus) (defaults to plain css)
-f, --force         force on non-empty directory
</code></pre>
<p>Crear una <strong>WebApp con Express</strong> y que tenga soporte para sesiones y <strong>Stylus</strong> es tan sencillo como:</p>
<pre><code>express --sessions --css stylus myapp
</code></pre>
<p>Si omitimos la configuraci&#xF3;n de la <strong>App</strong>, podemos ver lo sencillo que es manejar las peticiones y sus diferentes m&#xE9;todos:</p>
<pre><code>var express = require(&apos;express&apos;);
var http = require(&apos;http&apos;);
var path = require(&apos;path&apos;);

var app = express();

app.get(&apos;/&apos;, function(req, res){
  // Do your stuff with request and response
});

app.post(&apos;/login&apos;, function(req, res){
  // Do your stuff with request and response
});

http.createServer(app).listen(app.get(&apos;port&apos;), function(){
  console.log(&apos;Express server listening on port &apos; + app.get(&apos;port&apos;));
});
</code></pre>
<p>Haciendo un breve resumen sobre los conceptos:</p>
<ul>
<li><strong>Node</strong>: permite la ejecuci&#xF3;n de JavaScript en el server adem&#xE1;s de servir como herramienta de desarrollo.</li>
<li><strong>npm</strong>: es el gestor de paquetes de Node desde donde puedes instalar los m&#xF3;dulos.</li>
<li><strong>package.json</strong>: el archivo de configuraci&#xF3;n de un proyecto de Node.</li>
<li><strong>Express</strong>: un Web framework que a menudo lo ver&#xE9;is en proyectos 100% Node.</li>
</ul>
<p class="text center"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- dreyacosta responsive x1 -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-1014557301975761" data-ad-slot="3045224680" data-auto-format="rspv" data-full-width>
  <div overflow></div>
</amp-ad></p><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2013.stop(); 2014.start();]]></title><description><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/old/new_year_2014.jpg" width="620" height="388">
<p>Otro a&#xF1;o m&#xE1;s llega a su fin y como viene siendo habitual os dejo este post en el que me gusta hacer un breve repaso de lo sucedido. Cierto es que la actividad del blog ha sido nula desde Septiembre pero espero plasmar todo lo aprendido</p>]]></description><link>https://dreyacosta.com/2013-stop-2014-start/</link><guid isPermaLink="false">66b7752012da6801457c22a4</guid><category><![CDATA[Happy New Year]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Tue, 31 Dec 2013 12:33:32 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://dreyacosta.com/content/images/old/new_year_2014.jpg" width="620" height="388">
<p>Otro a&#xF1;o m&#xE1;s llega a su fin y como viene siendo habitual os dejo este post en el que me gusta hacer un breve repaso de lo sucedido. Cierto es que la actividad del blog ha sido nula desde Septiembre pero espero plasmar todo lo aprendido en estos &#xFA;ltimos meses durante el 2014.</p>
<p>En lo que respecta al 2013 ha sido un inicio de a&#xF1;o de mucho esfuerzo &quot;en la sombra&quot; para estudiar, investigar y probar algunas de las tecnolog&#xED;as que a d&#xED;a de hoy me permiten desarrollar los proyectos en los que actualmente estoy involucrado.</p>
<p>A destacar de este a&#xF1;o la cantidad de personas que he podido conocer en cursos, eventos y sobretodo gracias a la plataforma de <a href="http://www.meetup.com/?ref=dreyacosta.com" title="Helps groups of people with shared interests plan meetings and form offline clubs in local communities around the world." target="_blank">meetup</a>. Sin duda hemos compartido muy buenos momentos y aprendido mucho los unos de los otros.</p>
<p>Por otro lado 2013 ha supuesto pasar de cap&#xED;tulo y abandonar un equipo/amigos que me ha/han ense&#xF1;ado mucho, para afrontar nuevos retos de los que estoy aprendiendo much&#xED;simo tanto de lo negativo como de lo positivo.</p>
<p>Sin duda una de las cosas con las que me quedo y que he podido confirmar este a&#xF1;o es que, con esfuerzo y constancia es posible alcanzar cualquier meta que te propongas.</p>
<p>Desde aqu&#xED; desearos a todos una feliz nochevieja y una mejor entrada de a&#xF1;o.</p>
<div style="font-size:5em;line-height:1.2em"><div><strong>&lt;happy&gt;</strong></div><div style="text-align:center">New Year 2014</div><div style="text-align:right"><strong>&lt;/happy&gt;</strong></div></div>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Seguridad básica en servidores Linux]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Lo simple es lo que funciona y la seguridad de un servidor no tiene que ser complicada. Mis costumbres son sencillas y protegen de los vectores de ataques m&#xE1;s frecuentes.</p>
<h3>Cambia la contrase&#xF1;a de root</h3>
<p>Cuando pedimos un nuevo servidor a nuestro proveedor nos env&#xED;</p>]]></description><link>https://dreyacosta.com/seguridad-basica-en-servidores-linux/</link><guid isPermaLink="false">66b7752012da6801457c22a3</guid><category><![CDATA[iptables]]></category><category><![CDATA[ssh]]></category><category><![CDATA[VPS]]></category><dc:creator><![CDATA[David Rey]]></dc:creator><pubDate>Wed, 04 Sep 2013 07:34:02 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Lo simple es lo que funciona y la seguridad de un servidor no tiene que ser complicada. Mis costumbres son sencillas y protegen de los vectores de ataques m&#xE1;s frecuentes.</p>
<h3>Cambia la contrase&#xF1;a de root</h3>
<p>Cuando pedimos un nuevo servidor a nuestro proveedor nos env&#xED;an por mail los datos del mismo junto con la contrase&#xF1;a en claro. <strong>&#xA1;C&#xE1;mbiala!</strong></p>
<pre><code>passwd</code></pre>
<h3>Actualiza el sistema</h3>
<p>B&#xE1;sico en cualquier sistema operativo. <strong>&#xA1;Actualiza!</strong></p>
<pre><code>apt-get update
apt-get upgrade</code></pre>
<h3>Instalaci&#xF3;n de fail2ban</h3>
<p>Se encarga de banear <strong>IPs</strong> si se detectan actividades an&#xF3;malas en accesos al server.</p>
<pre><code>apt-get install fail2ban</code></pre>
<h3>sudo, nuevo usuario y deshabilitar el acceso ssh a root</h3>
<p>Importante dejar al usuario <strong>root</strong> fuera de la ecuaci&#xF3;n. Trabajar con un usuario no privilegiado nos evitar&#xE1; sustos. Para casos en los que necesitemos privilegios elevados utilizaremos <strong>sudo</strong> (necesario a&#xF1;adir nuestro usuario al grupo de sudoers).</p>
<pre><code>apt-get install sudo

adduser your_username
usermod -a -G sudo your_username
logout

ssh your_username@120.93.23.54

sudo vi /etc/ssh/sshd_config</code></pre>
<p>En el archivo de configuraci&#xF3;n del servicio <strong>ssh</strong> deshabilitamos el acceso a <strong>root</strong>.</p>
<pre><code>PermitRootLogin no</code></pre>
<h3>Usar una clave de autenticaci&#xF3;n ssh</h3>
<p>Las <strong>SSH Key</strong> son un m&#xE9;todo m&#xE1;s seguro de acceder al servidor. Primero hay que crear el <strong>SSH Key</strong> en la m&#xE1;quina desde la que queramos acceder al server.</p>
<pre><code>ssh-keygen</code></pre>
<p>Por defecto crea dos claves una privada y una p&#xFA;blica.</p>
<pre><code>~/.ssh/id_rsa # privada
~/.ssh/id_rsa.pub # p&#xFA;blica</code></pre>
<p>Tenemos que copiar la clave p&#xFA;blica en nuestro servidor.</p>
<pre><code>scp ~/.ssh/id_rsa.pub your_username@120.93.23.54:~/.ssh/id_rsa.pub</code></pre>
<p>En el server verificar los permisos de la carpeta <strong>.ssh</strong> y en caso necesario modificarlos.</p>
<pre><code>chown -R your_username:your_username .ssh
chmod 700 .ssh
chmod 600 .ssh/authorized_keys</code></pre>
<h3>Configuraci&#xF3;n del Firewall</h3>
<p>Importante dejar cerrar las puertas que no sean necesarias. Me gusta dejar el archivo con las reglas en <strong>/etc/</strong>.</p>
<pre><code>sudo vi /etc/iptables.rules</code></pre>
<p>Aqu&#xED; os dejo un buen filtro de partida.</p>
<pre><code>*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn&apos;t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix &quot;iptables denied: &quot; --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT</code></pre>
<p>Terminada la edici&#xF3;n es necesario restablecer <strong>iptables</strong> con las nuevas reglas.</p>
<pre><code>sudo iptables-restore &lt; /etc/iptables.rules
sudo iptables -L # para verificar que se han cargado las reglas
</code></pre>
<p>Visto que <strong>iptables</strong> no conserva las reglas tras un reboot del server, es necesario crear un script que se ejecute en el arranque. Se puede editar <strong>/etc/network/interfaces</strong> o crear un nuevo script en <strong>/etc/network/if-pre-up.d/</strong>.</p>
<pre><code>sudo vi /etc/network/if-pre-up.d/iptables</code></pre>
<pre><code>#!/bin/sh
/sbin/iptables-restore &lt; /etc/iptables.rules</code></pre>
<p>Importante dar permisos de ejecuci&#xF3;n al script.
<pre><code>sudo chmod +x /etc/network/if-pre-up.d/iptables</code></pre>
</p><p>Con estos pasos tenemos una buena base de seguridad en el servidor.</p><!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>