Cómo hacer llamadas y enviar SMS desde páginas Web móviles

06/07/2017
Artículo original


Foto: Esparta Palma - CC BY 2.0

Si creamos una página web que sabemos que va a ser utilizada desde dispositivos móviles, o si se trata de una aplicación que luego desplegaremos usando algún entorno de empaquetado de aplicaciones como Apache Cordova/PhoneGap, puede resultar muy útil permitir que los usuarios marquen un número de teléfono o envíen un SMS solamente pulsando un botón o un enlace.

El acceso al teléfono, entendiendo por ello la posibilidad de realizar llamadas, es muy limitado en aplicaciones HTML5. De hecho, no hay manera de acceder a los contactos en una aplicación web pura. Aunque el W3C estuvo trabajando en una especificación al respecto se abandonó hace años y no está soportada por ningún navegador. Mediante tecnologías como Apache Cordova o PhoneGap sí es posible, pero no en HTML puro que es lo que estamos tratando aquí.

En este caso lo único que puede hacerse es generar un enlace (etiqueta <a />) y que al pulsarlo realice una llamada a un número de teléfono determinado.

El esquema tel:

Para que se realice una llamada al pulsar un enlace basta con que dicho enlace apunte a un URI que use el esquema tel. Dicho esquema es muy simple:

<a href="tel:+34123456789">Llamar a la central</a>

Es recomendable usar siempre el formato internacional para el número de teléfono a marcar (es decir empezar el número con el signo + y el código del país). No sabemos dónde pueden estar nuestros visitantes en cada momento y el formato internacional funciona siempre (incluso si el usuario está dentro del propio país al que se llama).

Lo que ocurre cuando el usuario pulse el enlace ya depende de cada sistema operativo móvil. Así en iOS y Android p. ej., aparece una alerta que muestra el número y permite decidir al usuario si quiere realizar la llamada o no. Otros sistemas operativos muestran una lista con varias opciones. Por ejemplo el iPad, que no admite llamadas de voz, permite añadir el número a la agenda de contactos.

Otras aplicaciones pueden registrar esquemas propios de URI para ser abiertas desde páginas web. Por ejemplo, la aplicación Facetime en iOS registra el esquema facetime, lo que permite abrir dicha aplicación con enlaces cuya href sea algo parecido a facetime:+34123456789. El esquema que registra cada aplicación y su formato es totalmente dependiente de la aplicación.

El esquema sms

Dicho esquema permite mostrar la pantalla de mensajería para permitir mandar un SMS:

<a href="sms:+34123456789?body=Hola!">¡Pulsa para decirnos hola!</a>

Este enlace mostraría la página de enviar un sms con el texto Hola! pre-escrito en el mismo.

Algunos dispositivos no soportan el parámetro ?body. Por ejemplo en iOS no puedes usarlo y debes utilizar tan solo sms:<numero> sin posibilidad de incorporar un texto por defecto en el mensaje. Como todos los esquemas su soporte depende de cada sistema operativo.

El misterio de los archivos imposibles en Windows

04/07/2017
Artículo original

Hay algunos archivos que sin difíciles de crear en Windows, pero que en otros sistemas operativos no tienen problema alguno.

Por ejemplo, los archivos que no tienen nombre, solo extensión, es algo que el Explorador de Windows lleva muy mal. ¿Te parece algo raro? Pues prueba a crear el típico archivo .gitignore desde el explorador de archivos, verás que se produce un error:

Intentar crear .gitignore desde el explorador de archivos

Como vemos no nos permite hacerlo porque no le hemos dado nombre, solo extensión.

En los sistemas operativos basados en UNIX, como Linux o Mac OS X, la creación de este tipo de archivos se suele hacer desde un terminal (línea de comandos) usando el comando touch. Pero en Windows no disponemos de dicho comando, aunque es muy fácil de simular su acción a la hora de crear un archivo.

Podemos simplemente abrir una línea de comandos (escribir cmd en la barra de direcciones de la carpeta actual) y escribir:

echo. > .gitignore.txt

echo. escribe una línea vacía en la consola, y el operador > redirige la salida de la consola a un archivo. Es equivalente a crear un archivo vacío con el nombre que le hemos dado:

 

Hasta aquí la cosa no va tan "fina" como sería de esperar, pero tampoco es muy complicado.

Puede que tengas un problema más grave si intentas crear archivos con cierto nombres especiales. Por ejemplo, imagina que quieres crear un archivo con el nombre aux.js para guardar un código auxiliar en una aplicación.

Si lo intentas, tanto desde el explorador de archivos como desde la línea de comandos, verás que todo el tiempo obtienes un error: "El nombre de dispositivo que has especificado no es válido", algo que no pasa con otros como auxliar.txt por ejemplo. Solo con ciertos nombres especiales que enseguida veremos:

Intentado crear un archivo aux.txt

¿Qué diantres pasa aquí?

Nombres de archivos y carpetas especiales "prohibidos"

Lo que ocurre es un ejemplo de libro de herencia tecnológica.

Para entenderlo nos tenemos que remontar nada más y nada menos que al año 1974, año en el que se lanzó el mítico sistema operativo CP/M creado por el visionario de Seattle Gary Kildall. Este sistema operativo no tenía todavía carpetas, solo archivos, con el formato 8.3 (8 letras para el nombre y 3 para la extensión). Para poder intercambiar información entre los programas y los distintos dispositivos se definían unos archivos especiales (o pseudo-archivos) denominados: COM1, COM2, COM3, COM4 (puertos de comunicaciones en serie), LPT1, LPT2 (puertos paralelo), CON (consola, o sea, la pantalla), AUX (dispositivos auxiliares), PRN (impresión) y NUL (descartar la salida).

En 1980 una empresa de Seattle llamada Seattle Computer Products (SCP) creó un sistema operativo llamado 86-DOS que pretendía ser un clon "barato" de CP/M, y que por lo tanto tenía todos esos archivos especiales incluidos. Adicionalmente a lo que ya hacía CP/M, estos archivos y cualquiera con el mismo nombre y cualquier extensión eran equivalentes. Así, por ejemplo, COM1 y COM1.txt eran el mismo archivo. Aquí tienes una explicación de los motivos.

Al año siguiente, 1981, una pequeña empresa de la misma ciudad, poco conocida por entonces, llamada Microsoft compra el sistema operativo 86-DOS a SCP y lo renombra como MS-DOS 1.0, haciendo la que probablemente haya sido la jugada maestra más importante de la historia de la informática. El resto, como suele decirse, es historia (peliculón friki con la historia de Apple y Microsoft hasta los '90).

En 1983 sale la versión 2.0 de MS-DOS, mucho más avanzada y con soporte para carpetas y jerarquías de carpetas. Para mantener la compatibilidad hacia atrás con MS-DOS 1.0, incluye los archivos especiales mencionados, con todas sus posibles extensiones, en todas las carpetas del sistema operativo.

Cuando Microsoft prepara su nueva generación de sistemas operativos llamada NT, incluye nuevamente compatibilidad hacia atrás con MS-DOS y por lo tanto incluye todos esos archivos especiales (ampliados en el caso de los puertos, siendo los COM y los LPT desde el 1 al 9, es decir, COM1, COM2... COM9 y LP1 ... LPT9).

Dado que incluso los Windows más modernos siguen basándose en la arquitectura y la base (por muy mejorada que esté) de Windows NT, todos estos archivos siguen "pululando" por ahí, y nos limitan su uso.

De hecho, estos archivos tienen efectos no deseados más allá del propio sistema de archivos, aunque relacionado con éste. Por ejemplo, si desarrollas para la Web bajo Windows (con ASP.NET u otras tecnologías) si en cualquier punto de una ruta tienes alguno de estos nombres, con o sin extensión, no te lo permitirá.

Cómo podemos crear archivos con nombres especiales

Lo cierto es que en realidad deberíamos evitarlos, pero si queremos crearlos es perfectamente posible, pero hay que saberse el truco.

Para conseguirlo tenemos que usar la línea de comandos y emplear una sintaxis especial para escribir las rutas. Esta sintaxis especial se basa en comenzar las rutas con el prefijo \\?\ y luego escribir la ruta entera. Es decir, no llega con usar ese prefijo y luego el nombre del archivo: hay que poner la ruta completa al mismo si queremos que funcione.

En el siguiente GIF animado vemos cómo intento crear un archivo aux.txt en una carpeta y no me lo permite, y cómo lo creamos desde la línea de comandos usando ese prefijo. Al mismo tiempo, una vez creado, no podremos borrarlo ni desde el explorador de archivos ni desde la línea de comandos (lo cual a veces podría ser útil) y solo se borrará si usamos la sintaxis especial:

Creando y borrando archivos especiales desde la línea de comandos

En resumen

En este artículo hemos visto cómo el tratamiento de archivos en Windows es, digámoslo así, un tanto "sui generis", lo cual nos causa algunos problemas con ciertos nombres.

Hemos visto cómo crear archivos sin nombre pero con extensión (muy utilizados en desarrollo como archivos auxiliares de ciertas herramientas como Git, Jekyll, etc..).

Pero también hemos visto ciertos archivos que están reservados por el sistema y que, en principio, no podemos crear nunca. Hemos conocido las razones históricas para su existencia y cómo la herencia tecnológica hace que cosas diseñadas hace más de 40 años nos sigan impactando hoy en día.

Finalmente hemos conocido un truco para saltarse esa limitación y poder crear y gestionar archivos con nombres reservados sin preocuparnos de las limitaciones que existen en el sistema de archivos.

¡Espero que te haya resultado interesante!

Un primer vistazo a las co-rutinas de Kotlin en Android

04/07/2017
Artículo original

co-rutines

Las co-rutinas han sido la mayor incorporación en Kotlin 1.1. Son absolutamente geniales debido a su potencia, y la comunidad aún sigue descubriendo como aprovecharlas al máximo.

Explicado de forma simple, las co-rutinas son una manera de escribir código asíncrono de forma secuencial. En lugar de llenarlo todo de callbacks, puedes escribir tus líneas de código una detrás de otra. Algunas de ellas tendrán la capacidad de suspender la ejecución y esperar hasta que el resultado esté disponible.

Si te has formado como desarrollador de C#, async/wait es el concepto más parecido. Pero las co-rutinas en Kotlin son más potentes, porque en lugar de ser una implementación especifica de la idea, son una característica del lenguaje que puede implementarse de diferentes maneras para solucionar distintos problemas.

Las co-rutinas están basadas en la idea de funciones de suspensión: funciones que pueden parar la ejecución cuando son llamadas y reanudarla una vez que han terminado de ejecutar su propia tarea

Puedes escribir tu propia implementación, o usar una de las múltiples opciones que el equipo de Kotlin y otros desarrolladores independientes han construido.

Necesitas entender que las co-rutinas son una característica experimental en Kotlin 1.1. Esto quiere decir que la implementación podría cambiar en el futuro, y aunque la antigua aún será compatible, podrías querer migrar a la nueva definición. Como veremos después, necesitas optar por esta característica, de lo contrario verás un warning cuando la utilices.

Esto quiere decir que debes tomar este artículo como un ejemplo de que puedes hacer, no como una regla general. Las cosas pueden cambiar mucho en los próximos meses.

Entendiendo como trabajan las co-rutinas

Mi meta con este artículo es que seas capaz de tomar algunos conceptos básicos y ponerlos en práctica usando las librerías que hay, no construir tus propias implementaciones. Pero creo que es importante entender algo de cómo funcionan por dentro para que no te limites a usar ciegamente lo que te proveen las librerías.

Las co-rutinas están basadas en la idea de funciones de suspensión (suspending functions): funciones que pueden parar la ejecución cuando son llamadas y reanudarla una vez que han terminado de ejecutar su propia tarea.

Las funciones de suspensión se señalan con la palabra reservada suspend, y sólo pueden ser llamadas dentro de otras funciones de suspensión o de una co-rutina.

Esto significa que no puedes llamar a una función de suspensión en cualquier lugar. Es necesario que exista una función circundante que construya la co-rutina y proporcione el contexto requerido para que se haga. Algo como esto:

fun  async(block: suspend () -> T)

No voy a explicar cómo implementar la función de arriba. Es un proceso complejo que se sale del cometido de este artículo, y como comentaba ya hay soluciones implementadas que cubrirán la mayoría de los casos.

Si estás realmente interesado en construir la tuya, puedes leer la especificación escrita en el Github de co-rutinas. Sólo necesitas saber que la función puede tener cualquier nombre que quieras darle, y que tendrá al menos un bloque de suspensión como parámetro.

Entonces implementarías una función de suspensión y la llamarías dentro de ese bloque:

suspend fun mySuspendingFun(x: Int) : Result {
    ...
}

async { 
    val res = mySuspendingFun(20)
    print(res)
}

¿Entonces las co-rutinas son hilos? No exactamente. Funcionan de manera parecida, pero son mucho más ligeras y eficientes. Puedes tener millones de co-rutinas ejecutándose en unos pocos hilos, lo que abre un mundo de posibilidades.

Puedes usar las co-rutinas de tres maneras:

  • Implementación desde cero: esto implica construir tu propia manera de usar las co-rutinas. Es bastante complicado y por lo general no es necesario en absoluto.
  • Implementaciones de bajo nivel: Kotlin ofrece un conjunto de librerías que puedes encontrar en el repositorio kotlinx.coroutines, que resuelven algunas de las partes más difíciles y ofrecen una implementación especifica para diferentes escenarios. Hay una para Android, por ejemplo.
  • Implementaciones de más alto nivel: Si sólo buscas una solución que proporcione todo lo necesario para empezar a usar co-rutinas, hay muchas librerías que hacen todo el trabajo sucio por ti, y la lista no deja de crecer. Me voy a quedar con Anko, que proporciona una solución que funciona estupendamente con Android, y que probablemente te será familiar.

Usar Anko para las co-rutinas

Desde la versión 0.10, Anko ha proporcionado un par de maneras de usar co-rutinas en Android.

La primera es muy parecida a lo que hemos visto en el ejemplo de arriba, y también es similar a lo que hacen otras librerías.

Primero, necesitas crear un bloque asíncrono donde las funciones de suspensión puedan ser llamadas:

async(UI) {
    ...
}

El argumento UI es el contexto de la ejecución para el bloque async.

Entonces puedes crear bloques que sean ejecutados en un hilo en segundo plano y devolver el resultado al hilo de la UI. Estos bloques se definen usando la función bg:

async(UI) {
    val r1: Deferred = bg { fetchResult1() }
    val r2: Deferred = bg { fetchResult2() }
    updateUI(r1.await(), r2.await())
}

bg devuelve un objeto Deferred, el cual suspenderá la co-rutina cuando la función await() sea llamada, sólo hasta que el resultado sea devuelto. Usaremos esta solución en el ejemplo que hay más abajo.

Como puede que sepas, una de las características más interesantes cuando estás aprendiendo Kotlin, es que el compilador es capaz de inferir el tipo de las variables, así que esto puede hacerse más sencillo:

async(UI) {
    val r1 = bg { fetchResult1() }
    val r2 = bg { fetchResult2() }
    updateUI(r1.await(), r2.await())
}

La segunda alternativa es hacer uso de la integración con los listeners que proporcionan sub-librerias especificas, dependiendo del listener que vayas a utilizar.

Por ejemplo, en anko-sdk15-coroutines, existe un onClick listener cuya lambda es de hecho una co-rutina. Así que puedes empezar a usar funciones de suspensión inmediatamente dentro del bloque del listener.

textView.onClick {
    val r1 = bg { fetchResult1() }
    val r2 = bg { fetchResult2() }
    updateUI(r1.await(), r2.await())
}

Como puedes ver el resultado es bastante similar al anterior. Solo estás ahorrándote un poco de código.

Para usarla, necesitarás añadir algunas de estas dependencias, dependiendo del listener que quieras usar:

compile "org.jetbrains.anko:anko-sdk15-coroutines:$anko_version"
compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
compile "org.jetbrains.anko:anko-design-coroutines:$anko_version"

Usando co-rutinas en un ejemplo

En el ejemplo que desarrollo en el libro (que puedes encontrar aquí en Github), se crea una sencilla aplicación de tiempo.

Para usar las co-rutinas de Anko, primero necesitamos incluir la nueva dependencia:

compile "org.jetbrains.anko:anko-coroutines:$anko_version"

A continuación, si recuerdas, te dije que necesitabas activar esta característica, de lo contrario mostrará un warning. Para hacer esto, simplemente añade esta linea a el fichero gradle.properties en el directorio raíz (créalo si no existe aún):

kotlin.coroutines=enable

Ahora sí, ya tienes todo lo que necesitas para empezar a usar co-rutinas. Vamos primero a la actividad del detalle. Sólo llama a la base de datos (que se encarga de almacenar el pronostico semanal) utilizando un comando especifico.

Este es el código resultante:

async(UI) {
    val id = intent.getLongExtra(ID, -1)
    val result = bg { RequestDayForecastCommand(id).execute() }
    bindForecast(result.await())
}

¡Es estupendo! La previsión del tiempo se solicita en un hilo en segundo plano gracias a la función bg, que devuelve un resultado diferido. La espera de este resultado suspende la co-rutina por la llamada al await, hasta que el pronóstico esté listo para ser devuelvo.

Pero no todo es tan bonito. ¿Qué está pasando aquí? Las co-rutinas tienen un problema: están guardando una referencia a DetailActivity, provocando un leak si la petición nunca termina por ejemplo.

No te preocupes, ya que Anko tiene una solución. Puedes crear una referencia débil a tu actividad, y usarla en su lugar:

val ref = asReference()
val id = intent.getLongExtra(ID, -1)
async(UI) {
    val result = bg { RequestDayForecastCommand(id).execute() }
    ref().bindForecast(result.await())
}

Esta referencia permitirá llamar a la actividad cuando esté disponible, y cancelará la co-rutina en caso de que la actividad haya sido eliminada. Asegúrate de que todas las llamadas a métodos de la actividad o propiedades se realizan a través de este objeto ref.

Pero esto puede resultar un poco complicado si la co-rutina interactúa varias veces con la actividad. En MainActivity, por ejemplo, el uso de esta solución va a ser un poco más complicado.

Esta actividad llamará a un endpoint para solicitar un pronóstico semanal basado en un zipCode:

private fun loadForecast() {
    val ref = asReference()
    val localZipCode = zipCode
    async(UI) {
        val result = bg { RequestForecastCommand(localZipCode).execute() }
        val weekForecast = result.await()
        ref().updateUI(weekForecast)
    }
}

No puedes usar ref() dentro del bloque bg, porque el código dentro de ese bloque no es un contexto de suspensión, por lo que necesitas guardar el zipCode en otra variable local.

Personalmente creo que provocar un leak de la actividad durante 1-2 segundos no es tan malo, y probablemente no valdrá la pena el boilerplate. Por lo tanto, si puedes asegurarte de que tu proceso en segundo plano no puede durar para siempre (por ejemplo, estableciendo un tiempo máximo de espera en sus solicitudes de servidor), estarás a salvo de no usar asReference().

De esta manera, los cambios a MainActivity serían más simples:

private fun loadForecast() = async(UI) {
    val result = bg { RequestForecastCommand(zipCode).execute() }
    updateUI(result.await())
}

Así que con todo esto, ahora tienes tu código asíncrono escrito de forma síncrona fácilmente.

Este código es bastante simple, pero imagina otras situaciones complejas en las que el resultado de una operación en segundo plano es utilizado por la siguiente, o cuando necesitas iterar sobre una lista y ejecutar una solicitud por cada elemento.

Todo esto se puede escribir como código síncrono normal, que será mucho más fácil de leer y mantener.

Para simplificarlo, las co-rutinas son una manera de escribir código asíncrono secuencialmente

Aún hay mucho más que aprender para sacar el máximo provecho de las co-rutinas. Así que si tienes algo más de experiencia sobre esto, utiliza los comentarios para contarnos más sobre ello.

También te recomendamos

Ni Twitter ni Facebook ni Google, ¿cómo se lo montan los chinos en Internet?

¿Será 2017 el año de Kotlin? Repasamos su evolución y por qué deberías darle una oportunidad

Kotlin 1.1 también es para desarrolladores Android

-
La noticia Un primer vistazo a las co-rutinas de Kotlin en Android fue publicada originalmente en Genbeta Dev por Antonio Leiva .

Como ingeniero de software, ¿cuál es el mejor conjunto de habilidades que hay que tener para los próximos 5-10 años?

04/07/2017
Artículo original


Foto: Rob Sinclair / CC BY-SA

Buceando por Quora nos encontramos con la siguiente pregunta: como ingeniero de software, ¿cuál es el mejor conjunto de habilidades que hay que tener para los próximos 5-10 años?. Nos encontramos con dos respuestas que nos llamaron especialmente la atención. Una que trata sobre habilidades no técnicas y otra más centrada en tecnología. Las vamos a compartir aquí con vosotros en español y esperamos que sean de vuestro interés.

Habilidades no técnicas

Empecemos por el testimonio de Brian Knapp, que aboga por cuestiones no técnicas.

Solo hay una única "mejor destreza" que tendrás que tener en los próximos 5-10 años y no es técnica en absoluto.

Déjame que te lo explique...

Una vez había un tipo en una fiesta hablando con su amigo, que era un artista excepcional. Le preguntó a su amigo, cuyo arte estaba en una exposición: "¿cómo es que haces obras tan geniales?"

"Pinto todos los días" contestó su amigo.

Pintar todos los días es la mejor destreza que puedes tener como ingeniero de software.

Obviamente no quiero decir pintar físicamente todos los días, sino que necesitas tener momentos de mucha concentración para practicar tus destrezas y aprender algo nuevo todos los días.

Los mejores desarrolladores de software que he conocido están constantemente creando proyectos personales, probando nuevos lenguajes, ideas de diseño, tecnologías. Son máquinas del aprendizaje continuo.

"Pintan" todos los días, metafóricamente hablando. Al igual que hace el artista.

Si tienes la capacidad, el hábito o un sistema para pulir tu oficio y mejorar cada día, los pequeños avances diarios suman en ganancias, experiencia y habilidades.

El sector del software en particular es cambiante y siempre está evolucionando, así que las probabilidades de que necesites aprender un nuevo lenguaje, framework, plataforma o tecnología cada 10 años simplemente para tener oportunidades laborales son muy altas.

Pero decir que un único lenguaje, destreza, framework o plataforma es clave es un mal consejo. Si hoy aprendes temas web y de un día para otro todas las oportunidades están en el campo de la realidad virtual, quizás te quedes fuera por poner todos los huevos en la misma cesta.

Yo no soy de apostar en una tecnología o destreza para ir tirando. Tengo un sistema.

Mi sistema consiste en pintar todos los días para mejorar mi conjunto de habilidades. A veces estoy aprendiendo un nuevo lenguaje, framework o plataforma. A veces es diseño, gestión, liderazgo, marketing u otros temas "oscuros"...

Todo suma para ser más valioso y estar más cotizado el día de mañana.

La mejora y el aprendizaje continuo es la verdadera destreza que hay que dominar. Una tecnología en concreto es simplemente un detalle.

Habilidades tecnológicas

Este es el punto de vista de John L. Miller, que propone una serie de habilidades tecnológicas.

Siempre estoy esperando a que el mundo de la programación experimente una revolución. Llevo 30 años esperándolo. Estoy seguro de que llegará cualquier día de estos. ¡Quizás sea en los próximos 5 o 10 años!

Salvo que eso suceda, esto es en lo que yo creo que los programadores y diseñadores deben empezar a centrarse:

  1. Lenguajes de alto nivel como Java e incluso el más reciente y grandioso C++, que incluye unas funcionalidades muy chulas. Acostúmbrate a estos lenguajes, ya llevan mucho tiempo rondando, y se van a quedar un buen rato más. Python también es útil. Lo demás son lenguajes muy guays pero aún no sabemos qué alcance tendrán, quizás con la excepción de JavaScript.
  2. Siéntete cómodo con Big Data. No es para todo el mundo, pero hay mucho dinero ahí, y es muy útil para las empresas, asistentes digitales e interfaces entre ordenadores y humanos. Los agentes inteligentes (software que aprende cuáles son tus preferencias y encuentra cosas por ti) están a la vuelta de la esquina. El Big data (el tratamiento de datos masivos de Internet para entender qué es lo que te gusta, y lo que te puede gustar) será parte de ello. Acostúmbrate a SQL y lenguajes análogos a SQL de tipo distribuido, para búsqueda y transformación de datos.
  3. Programación en la nube. Familiarízate con el cloud computing. Piensa que es una forma fácil de ser capaz de escalar y "de-escalar" soluciones, dependiendo de la cantidad de datos / clientes que tengas un mes, una semana, o incluso a una hora determinada. Hazte con las riendas de al menos AWS y Azure. Y por supuesto, de las cosas que salgan del equipo en el que estoy en Oracle ;)
  4. Interfaces táctiles y otras que no sean QWERTY. No necesitas saber cómo se rastrea lo táctil, ni la mecánica de los sistemas de reconocimiento de voz. Simplemente asegúrate de que eres capaz de incorporar estás técnicas (y otras como el lenguaje gestual) en tus aplicaciones.
  5. Crea para la pantalla universal. Microsoft está intentando unificar su ecosistema de sistemas operativos desde lo más pequeño a lo más grande, y yo pienso que es BRILLANTE. Familiarízate con las tecnologías que abarcan diferentes categorías de dispositivos.
  6. Mandan los móviles. En el lado del cliente, mandan la movilidad. Hay más teléfonos inteligentes y tabletas en el mercado que PCs y portátiles. Esta tendencia solo irá en aumento. El tiempo que dediques a aprender a crear aplicaciones e interfaces para dispositivos móviles estará bien invertido.
  7. Tecnologías web. Ya me rindo. La web no va a desaparecer, pero sí que se aproxima la muerte definitiva de Flash. HTML5 y los protocolos web parecen ser una buena inversión de tiempo para aquellos que se puedan beneficiar de ellos.

Fijaos en que no puse nada del estilo "llegar a ser un genio matemático" o "experto en sistemas distribuidos". Hay valor en esas ramas, pero la realidad es que un grupo muy pequeño de personas solucionarán los problemas más complejos en esos campos, y los adaptarán con un bonito arreglo equilibrando potencia y usabilidad.

Ahora es tu turno, ¿qué respuesta te ha gustado más? ¿Qué añadirías?

El resurgir de la programación funcional

03/07/2017
Artículo original

Function Io

Aunque nunca hayas trabajado con ella, seguro que has oído hablar de la programación funcional. Y cada día más, ya que parece que hay un hype con ella. Este paradigma de programación, que parecía haber sido olvidado por la gran masa de desarrolladores, lleva unos cuantos años resurgiendo.

Es cierto que han sido otros lenguajes imperativos, en especial los imperativos y orientados objetos, los que se han llevado la fama de ser más productivos y eficaces para un mayor número de tareas. Pero no todo el mundo piensa igual. Últimamente ha aparecido una corriente crítica, argumentando que la mayoría de las ventajas que este tipo de lenguajes proponen, quizá no sean tan definitivas. Si bien la POO siempre ha prometido modelar el mundo real y proporcionar código reutilizable, cuando adquirimos algo de experiencia nos damos cuenta que eso no es nada sencillo.

Así que no ha tardado en aparecer gente que piensa que es más fácil programar con un enfoque funcional, afirmando incluso, que se es mucho más productivo y que se reduce el número de bugs y errores.

Si los lenguajes funcionales son la solución a todos nuestros problemas (seguramente no), es algo que el tiempo dirá, pero mientras tanto podemos analizar qué opciones tenemos.

¿Por qué el resurgimiento de la programación funcional?

La programación funcional lleva muchos años entre nosotros, pero siempre se asociaba más a entornos académicos que a empresariales y productivos. Es algo que parece que empieza a cambiar y muchas empresas, algunas muy importantes, están apostando fuerte por este paradigma. ¿Por qué?

Una de las razones puede ser que las aplicaciones son cada vez más difíciles de ejecutar en una sola máquina. Cada vez es más necesario poder soportar grandes dosis de concurrencia y paralelismo. No obstante el hardware actual, nos proporciona unas capacidades de paralelismo nunca vistas, y la nube hace cada vez más sencillo (y barato) construir sistemas distribuidos en distintos servidores. Y claro, para tareas como estas, un lenguaje funcional puede desenvolverse como pez en el agua.

La programación funcional tiene conceptos muy interesantes, tanto que que muchos lenguajes no funcionales están poco a poco adoptándolos

Está claro también, que la programación funcional tiene conceptos muy interesantes, tanto que que muchos lenguajes no funcionales están poco a poco adoptándolos. Las últimas versiones de Java ya incluyen expresiones lambda, cosa ya incluida C# hace mucho tiempo. Cada versión de C# incluye más características funcionales y de hecho en su última versión, la 7, incluye el concepto funcional del pattern matching. Ruby, Python o Go, son otros lenguajes que incorporan algunas características funcionales.

Tampoco debemos olvidar JavaScript, que tiene muchos conceptos funcionales desde hace tiempo (funciones anónimas, funciones como miembros de primera clase etc.). Al ser uno de los lenguajes más populares, es fácil que estos conceptos lleguen cada vez a más programadores, haciendo que la revolución funcional llegue un poquito más lejos.

Pero esto no acaba aquí, ya que a los viejos rockeros funcionales, se están añadiendo muchos nuevos lenguajes, con muchas otras características modernas. Es el caso de Elixir, Clojure, Scala o Elm, por citar algunos.

¿Pero esto es ruído o es una tendencia de verdad?

A los programadores nos encanta estar a la última. Antes que aprender Cobol, seguramente prefiramos aprender algo más moderno (que no tiene porque ser mejor). Tanto nos gusta aprender, que muchas veces acabamos cayendo en el hype sin pararnos a pensar en las consecuencias.

Pensando en los fríos datos, y mirando el índice Tiobe del último mes, podemos ver que los lenguajes funcionales están muy lejos de los primeros puestos. Hay más datos que nos ayudan a corroborar este punto y si nos vamos a la famosa encuesta de Stack Overflow de 2017, los datos son parecidos. Los lenguajes funcionales no están ni de lejos entre los más populares. En el mundo laboral, pasa más o menos lo mismo. Podemos ver en Indeed que el número de empleos en lenguajes funcionales, es muy bajo comparado con el de otros lenguajes más populares como Java o C#.

Jobs

Esto no quiere decir que debamos dejar de lado la programación funcional, simplemente que debemos ponerla en su contexto. Si queremos encontrar un trabajo como programador, es más fácil encontrar un trabajo utilizando un lenguaje no funcional. Pero si es cierto que numerosas startups, de esas que están cambiando las reglas del juego, apuestan cada vez más por ese paradigma. Así que quizá no sea descabellado empezar a invertir tiempo en aprender alguno de estos lenguajes. Y si no, al menos habremos aprendido mucho por el camino.

¿Qué opciones tengo si quiero aprender programación funcional?

Si queremos aprender programación funcional, a día de hoy tenemos muchísimas opciones. Para todos los gustos y para todos los sabores. Vamos algunos de ellos:

Haskell

Haskell es uno de esos lenguajes funcionales conocidos como puros. Esto quiere decir que no permite mutar los datos y que las operaciones se tratan como la evaluación de funciones matemáticas.

Haskell Logo With Name

Haskell está basado en el cálculo lambda (de ahí su logo) y debe su nombre a Haskell Brooks Curry, matemático estadounidense, que curiosamente da nombre a otro lenguaje de programación (Curry) y al concepto de currificación.

Si queréis probar Haskell, lo podéis hacer desde el mismo navegador.

Nuestro compañero Jose Juan, ya nos habló de Haskell por aquí.

Erlang/Elixir

La comunidad de Erlang está viviendo un resurgir, gracias a Elixir y es por ello que debemos tenerlo en cuenta. Erlang fue un lenguaje creado inicialmente para la gestión de centralitas telefónicas de Ericsson allá por 1986. Con esta premisa acabó siendo un lenguaje funcional, pensado para aplicaciones distribuidas y tolerantes a fallos. Erlang al igual que Elixir es un lenguaje de tipado dinámico.

Erlang Elixir

Con el resurgir de la programación funcional, José Valim creó Elixir. Un lenguaje con una sintaxis basada en Ruby, que se ejecuta sobre la máquina virtual de Erlang y es totalmente compatible con él (de hecho se pueden utilizar librerías de Erlang en Elixir). De esta manera, Elixir puede aprovechar las características concurrentes de Erlang, con una sintaxis más cercana para muchos programadores. De hecho muchos programadores de Ruby están empezando a adoptar Elixir, dado su rendimiento. La llegada de programadores a Elixir, está haciendo que llegue savia nueva a Erlang, reforzando ambas comunidades.

Si queréis más información, en GenbetaDev, también hemos hablado de Elixir.

Scala

La máquina virtual de Java es una de las más avanzadas, y esto está haciendo que se generen muchos lenguajes nuevos en torno a ella. Scala es probablemente uno de los más famosos. Aunque Scala soporta todas las características típicas de la POO de Java, también posee muchas características funcionales como: funciones anónimas, funciones de orden superior, lazy evaluation, currificación, pattern matching, tuplas etc.

Scala

Obviamente Scala no se puede definir como lenguaje funcional puro (es más bien multiparadigma), pero aun siendo lenguaje orientado a objetos, se aleja de la programación imperativa.

El código de Scala es compatible con los programas ya existentes en Java, lo cual siempre es un plus.

Antonio Leiva ya entrevistó a los chicos de 47 Degrees, que nos contaron su experiencia con Scala.

Clojure

Otro lenguaje funcional que corre sobre la máquina virtual de Java es Clojure. Clojure es un dialecto de Lisp, por lo que parte de la idea de representar de igual forma código y datos. El tipado de Clojure, al igual que el de otros lenguajes funcionales como Elixir es dinámico. Y también como en otros lenguajes funcionales Clojure promueve la inmutabilidad de los datos. Clojure hace uso del concepto de identidad, que es algo así como una entidad lógica asociada a distintos valores a lo largo del tiempo.

Clojure

Si queremos probar este lenguaje podemos hacerlo directamente desde el navegador

Si queremos sustituir nuestro JavaScript por un lenguaje funcional, podemos usar ClojureScript, que permite crear código de Clojure que se compila a JavaScript y es compatible con los navegadores web.

F#

F# es el lenguaje funcional de Microsoft, compatible con el stack de .NET. Por defecto los datos son inmutables, aunque podemos especificar que puedan mutar su estado. La sintaxis de F# se basa en la de OCaml, aunque con diferencias. Una de las curiosidades de F# es que es un lenguaje estático, en el que no hay que definir tipos, ya que estos son casi siempre inferidos por el compilador.

Fsharp

F# es multiparadigma, por lo que tiene toques de programación imperativa, como bucles while y for y también soporta programación orientada a objetos.

Este lenguaje se puede utilizar para una gran variedad de funciones, desde generar JavaScript (con Fable, hacer aplicaciones web, o aplicaciones para móviles con Xamarin.

Si queréis probar F# podéis hacerlo desde un navegador

Vale, hay muchos lenguajes funcionales, pero ¿por qué debo usarlos?

Aunque es cierto que los programadores vivimos muchas veces de las modas, también es cierto que una mala herramienta rara vez llega a ser popular. Así que si la programación funcional está recibiendo más atención será por algo. Estas son algunas de las supuestas ventajas que podemos obtener:

  • El código tiende a ser más conciso y expresivo
  • Que el estado sea inmutable, evita muchos errores ya que no hay efectos secundarios
  • Que el estado sea inmutable, nos ayuda en sistemas concurrentes o paralelos
  • Las funciones reciben parámetros y devuelven un resultado, por lo que son siempre previsibles (si son funciones puras).
  • El testing tiende a ser más sencillo, ya que si escribimos funciones puras, los resultados son más previsibles.

De todas maneras, aunque esas ventajas no sean suficientes, aunque en nuestro día a día usemos otro tipo de lenguajes, es muy recomendable aprender otros paradigmas de programación. Nos abre la mente a ideas nuevas, y eso nos hace mejore programadores. Y es que a veces, enriquece mucho más aprender un lenguaje nuevo, que aprender más cosas del lenguaje que usamos todos los días.

En Genbeta Dev | Aterrizando en la programación funcional

También te recomendamos

Pliegues, una forma de encapsular las iteraciones en listas

Métodos de extensión en C#

Ni Twitter ni Facebook ni Google, ¿cómo se lo montan los chinos en Internet?

-
La noticia El resurgir de la programación funcional fue publicada originalmente en Genbeta Dev por rubenfa .

Si quieres ganar más dinero ¿tienes que cambiarte de trabajo?

30/06/2017
Artículo original

Salario programadores españa

En una ocasión, escuché—si a un empleado le pagas el doble de lo que vale, querrá permanecer en tu empresa durante mucho tiempo—. En ese momento, me di cuenta que nadie te regala nada a cambio de nada; que no siempre se paga a un profesional por el valor que aporta y mucho peor; por qué todos en algún momento de nuestra vida, nos habíamos encontrado con el típico incompetente que gana más que nosotros y no se marcha de la empresa ni con agua caliente.

Seguramente, a lo largo de tu experiencia profesional, has vivido o te has contado, ciertas situaciones que te han descolocado y te han hecho pensar que, tal vez, pudieras estar haciendo algo mal porque no tienes el salario que mereces:

  • Un conocido te cuenta lo bien que pagan en su empresa
  • Otro, que a pesar de lo mal que pagan en la suya, le hicieron una increíble oferta económica
  • Te ha llama un recruiter, ofreciendo mejores condiciones profesionales que las tienes actualmente
  • E incluso, te aconsejan que si quieres ganar más dinero, digas en tu empresa que te marchas para provocar una contraoferta.

Es probable que la mayoría de nosotros, hayamos pasado por cada uno de esos escenarios y tal vez, no hemos sabido gestionarlo de la mejor manera posible. Por eso, si te estás preguntando qué puedes hacer para mejorar económicamente, recuerda que tanto si te cambias de trabajo como si recibes una contraoferta en tu empresa, tiene una responsabilidad y por supuesto, un riesgo que debes estar dispuesto a asumir.

1. Si el salario es la única razón que te desmotiva, solicita un aumento en tu empresa

Si el salario es la razón por la que no estás satisfecho, busca un aumento antes de valorar un cambio de empleo.

Partiendo de la base que todos trabajamos a cambio de dinero, hay momentos vitales, donde el salario es prioritario. Cada uno, tenemos nuestras circunstancias, y nadie es mejor ni peor persona (ni mucho menos profesional) por ganar más o menos dinero. Por tanto, querer tener un mejor salario a final del mes, es absolutamente lícito, pero no siempre es lo más importante.

Evalúa si lo que le falta (o le sobra) a tu puesto actual, se puede solucionar con dinero. Si el salario es la única razón por la que no estás satisfecho en tu trabajo, quizás deberías buscar un aumento antes de valorar un cambio de empleo.

Si la mejora salarial que te gustaría, no es viable en tu empresa y para ti, es imprescindible tener un mayor salario para sentirte motivado. Sí es recomendable que valores un cambio de trabajo.

2. Aprende a gestionar ofertas y contraofertas

Como comentaba en el punto anterior, antes de valorar un cambio de trabajo, es aconsejable hablar primero con tu empresa para ver si pueden ofrecerte lo que necesitas. Si no es así, entonces es el momento de empezar a ver otras opciones profesionales.

La mayoría de nosotros, nos hemos sentido valorados cuando no han hecho una contraoferta. Tendemos a pensar que uno no sabe lo que tiene hasta que lo pierde y en el fondo de nuestro corazón, somos unos románticos, pero para qué engañarnos más, toda esta historia es mucho más fría de lo que pensamos.

Voy a comentar distintos escenarios que pueden darse a la hora de aceptar (o no) contraofertas. Lo más importante es identificarlos y aprender a gestionarlos:

La empresa va a hacer todo lo posible porque te quedes

Los ultimátums nos hacen reaccionar a todos

Cuando tu empresa no se espera que te quieras marchar y le pilla de sorpresa, como norma general, harán todo lo posible para que te quedes. De hecho, es bastante probable que jamás de los jamases te hayas sentido más valorado que en ese momento.

Me encantaría decirte que siempre que una empresa hace una contraoferta, el único motivo que les empuja a hacerlo es tu profesionalidad, lo que te valoran y lo indispensable que eres, pero no siempre es así. A veces, hay otro motivo: buscar y contratar a tu sustituto, es más costoso.

El mundo del software, es un sector con un bajo índice de desempleo, encontrar un sustituto no es fácil y si además, aportas un valor diferencial, harán todo lo imposible para que no te marches. Los ultimátums nos hacen reaccionar a todos, por eso, es probable que te hagan promesas, solo escuches lo que quieres oír y tal vez, veas pasar el tiempo sin que se cumplan tus expectativas.

Verdad o mentira, es una realidad que ocurre con bastante frecuencia. Si llega ese momento, analiza si quedarte en tu empresa te puede suponer un paso atrás.

Si tomas la decisión de cambiar de trabajo, mira hacia delante

Una de las mayores ventajas que tenéis los desarrolladores de software es que no os faltará trabajo. A día de hoy, tenéis mucha oferta y por tanto, tenéis poder de elección. Eso sí, un gran poder conlleva una gran responsabilidad.

Si has tomado la decisión de cambiar de trabajo, significa que has invertido tiempo, ilusión e incluso has organizado tu vida buscando nuevas ofertas de empleo, investigando y conociendo a las empresas, haciendo entrevistas, pensando, analizando y valorando una nueva vida profesional con nuevos retos, aprendizajes, jefes, cultura, compañeros, horarios, tecnologías, proyectos, etc..

No es una tontería, te lo has tomado muy en serio y por eso, es importante que lo tengas en el mente y lo recuerdes cuando tu empresa te haga una contraoferta.

El sentimiento de miedo y tener dudas, es inherente en un proceso de cambio

Hasta que no veas materializada la oferta, no serás consciente que ese cambio de trabajo es una realidad

De hecho, es bastante probable que hasta que no veas materializada la oferta, no seas consciente que ese cambio de trabajo es una realidad. Además, si hablas con tu jefe para comunicarle tu baja e intenta convencerte para que no te vayas, sentirás inseguridad e incluso, tal vez, tengas una extraña sensación de culpabilidad. Esta situación es de libro de contraofertas, así que te aconsejo frialdad para que nadie decida por ti.

Todos tenemos miedo al cambio, la diferencia entre unos y otros, es cómo lo afrontamos.

Si son otros factores los que te desmotivan, el dinero no será la solución

Si realmente no estás a gusto en tu empresa, aceptar una contraoferta económica, no solucionará tu problema

Antes de aceptar una contraoferta, piensa si lo que te ofrece tu empresa, va a solucionar lo que ha hecho que quieras irte a otro sitio.

Cuando realmente no estás a gusto en tu empresa, porque lo que te afecta son otros factores que no son salariales, aceptar una contraoferta económica, no solucionará tu problema. De hecho, seguirás teniendo los mismos problemas en tu día a día, habrás perdido una buena oportunidad y es posible que tu profesionalidad, pueda verse afectada.

Si estás desmotivado, agotado e incluso quemado, tu permanencia en la empresa, no es sostenible a golpe de talonario.

Si decides cambiar de trabajo, el cambio tiene que ser a mejor

Antes de cambiar de trabajo, analiza si tu nuevo trabajo, cumple tus expectativas. Es cierto que es un riesgo, y hasta que no te incorpores en tu nueva empresa, no sabrás si el cambio es a mejor o a peor. Pero si sabes lo que quieres, has hecho un buen proceso de selección y por supuesto, has pedido referencias, tendrás información para decidir, si es el momento y la empresa para comenzar una nueva aventura profesional.

Intenta tomar una decisión objetiva, no te cambies de trabajo por impulso, pero tampoco te queden tu empresa por resignación. Si decides cambiar de trabajo, haz un análisis de pros y contras y si el resultado es positivo, adelante. Por si puede ayudarte, suelo realizar con los desarrolladores, un ejercicio muy sencillo: la comparación entre la situación profesional actual y la deseada.

Situación Actual:

Lo que te gusta

Lo que no te gusta

Situación Deseada:

Lo que te gustaría

Lo que no te gustaría

Haz una comparativa de lo que más y menos te gusta de tu situación actual, además de lo que te gustaría y no te gustaría tener en su nuevo trabajo, te ayudará a tomar decisiones.

Si vas a aceptar una contraoferta, negocia muy bien las nuevas condiciones

Si aceptas una contraoferta, negocia muy bien las nuevas condiciones y cuida la forma en la que se puede interpretar por tus compañeros

Si eres de los que has utilizado esta estrategia para que tu empresa te ofrezca mejor salario o “simplemente” cambiaste de opinión en el último momento, es aconsejable que negocies muy bien las nuevas condiciones profesionales. Si no lo haces, no solo tendrás el mismo problema a corto plazo sino que además, habrás hecho visible tus intenciones, te habrás expuesto y tanto tu permanencia en la empresa como tu lealtad, se pondrán en duda.

Si aceptas una contraoferta, negocia muy bien las nuevas condiciones y gestiona de la mejor manera posible que tus jefes y tus compañeros, no te perciban de forma distinta. Es decir, deja claro que eres un profesional firme en tu decisión y cuida que no desconfíen de ti.

La contraoferta de la contraoferta es el peor de los escenarios

Recuerda dejar siempre la puerta abierta

Ya hemos visto que se pueden dar distintos escenarios a la hora de aceptar o no una contraoferta, pero hay uno que desde mi punto de vista, no lo recomiendo: el juego a dos bandas e incluso a tres.

Recomiendo ser honestos y no utilizar a los demás. Si queréis mejorar vuestra situación actual, el fin no justifica los medios, se pueden hacer las cosas bien. Lo mejor es dejar una puerta abierta ya sea con el recruiter, la empresa interesada en contratarte o en tu propia empresa, pero como juegues mal tus cartas, perderás la confianza de todos y de cada uno.

Si lo haces, recuerda que todo acto tiene una repercusión. Valora hasta qué punto te compensa.

Conclusión

Cambiar de trabajo es una decisión importante que impactará no solo en tu vida profesional sino también en tu vida personal. Intenta tener mayor control en la toma de decisiones,sin olvidar que tendrás que asumir riesgos.

Si te cambias de empresa, puedes ganar más dinero, puedes equivocarte …pero también, si te quedas. No dejes que los demás decidan por ti. La decisión es tuya.

Foto | Flickr

También te recomendamos

La industria que más puestos demanda es la informática

Estamos estudiando el chiste de los mil millones de robots en el mundo y aún no lo entendemos

Metáforas sobre el desarrollo de software

-
La noticia Si quieres ganar más dinero ¿tienes que cambiarte de trabajo? fue publicada originalmente en Genbeta Dev por Emma Salamanca .

WebMaker: excelente entorno de pruebas Front-End para Chrome, que funciona sin conexión

30/06/2017
Artículo original

Un tipo de herramientas muy de moda en los últimos años entre los desarrolladores Web son los llamados "code playground" o "entornos de juego con código". Se trata de espacios on-line que permiten escribir código y ver el resultado inmediatamente, usando por debajo ya ciertos lenguajes y bibliotecas que podamos necesitar. Los más conocidos son CodePen (más orientado a lo visual, y con verdaderas "virguerías" en su colección), CSSDeck (para CSS y efectos), JSFiddle (el más conocido de JavaScript) o JSBin (que hasta tiene una consola JavaScript visible).

Estas herramientas son geniales pues nos permiten probar código rápidamente, colaborar con otras personas en resolver ciertos problemas o colgar código de ejemplo para nuestro blog, una formación o para pasar a algún amigo. Además soportan múltiples lenguajes o meta-lenguajes. Por ejemplo, podemos escribir directamente Sass o Less y obtener el CSS compilado. Lo mismo con ECMAScript 2015 o posterior, CoffeeScript o TypeScript (compilados automáticamente a ECMAScript 5) o con HAML, Slim o markdown, compilados directamente a HTML.

Todo esto está muy bien y nos permite colaborar con otros también. Pero ¿qué pasa si queremos poder hacer lo mismo sin conexión (en un avión o cuando estamos en el extranjero)? ¿Por qué tenemos que esperar varios segundos a que carguen todos los recursos necesarios antes de poder empezar a experimentar?

Esto mismo es lo que se preguntaba el desarrollador indio Kushagra Gour, que tantas ganas tenía de algo así que lo creó él mismo y construyó Webmaker.

¿Qué es Webmaker?

Se trata de una extensión para Google Chrome (no funcionará en toros navegadores) que coloca un botón en tu navegador para abrir instantáneamente una nueva pestaña con un entorno de pruebas muy potente, parecido a lo que ofrece CodePen.

La filosofía, de hecho, es muy parecida a la de esta conocida herramienta on-line, con varios paneles para escribir código (HTML, CSS y JavaScript, con sus múltiples variantes), y un panel para ver el resultado.

Lo más interesante es que es totalmente off-line, de modo que no necesitas conexión para utilizarlo. Y además es rapidísimo ya que no hay nada que descargar: está disponible al instante para poder hacer pruebas o prototipos de páginas. Además, cada pequeño cambio que haces en la aplicación que estés creando se ve reflejado al momento en el panel de vista previa.

Aparte de la base (HTML, CSS y JavaScript), soporta también los pre-procesadores más comunes para HTML (Markdown y Pug), CSS (Sass y SCSS, Less, Stylus y Atomic CSS) y JavaScript (ECMAScript 2015, TypeScript y CoffeeScript):

También es posible añadir diversas bibliotecas de desarrollo para que estén disponibles en el proyecto. Incluye muchas de serie: jQuery, Angular, React, Vue.js... y también bibliotecas CSS: Bootstrap 3 y 4, Foundation, Bulma... aunque para añadirlas sí que necesitarás conexión, pues las descarga desde una CDN.

Permite guardar y recuperar los proyectos, que quedan preservados en el almacenamiento local del navegador (por lo que no estarán disponibles en otras máquinas que utilices, aunque tengan Chrome y la extensión).

También tiene botones para cambiar la distribución de las ventanas, sacar una captura de pantalla del resultado, guardarte todo el ejemplo a disco en un único archivo HTML e incluso otro muy útil: enviar a CodePen, de modo que cuando estemos satisfechos con el resultado podemos enviarlo a esa herramienta on-line que Web Maker trata de suplir off-line ?

Cuando lo añades a Chrome te saca una ventana para que decidas si lo quieres utilizar bajo demanda (pulsando sobre su botón) o directamente convertirlo en tu página por defecto cuando abras el navegador:

El proyecto es además Open Source, con su código disponible en GitHub, por lo que puedes aprender sobre cómo está hecho e incluso aportar al proyecto alguna característica que eches en falta.

Puedes sacarle mucho partido a esta interesante herramienta para, por ejemplo:

  • Hacer prototipos rápidos de formularios, páginas, efectos y aplicaciones, sin ni siquiera tener conexión a Internet en un momento dado
  • Depurar problemas creando versiones mínimas de lo que te está fallando y probando los cambios instantáneamente, sin tener que compilar nada o sin siquiera recargar el navegador
  • Aprender alguno de los lenguajes soportados, sin tener que montar todo lo necesario para, digamos, compilar SCSS o TypeScript
  • Diseñar componentes HTML que luego puedes incorporar a tus aplicaciones Angular, React o Vue.js

¿A qué esperas para instalarlo?

Cómo prevenir ataques Ransomware a través de SMB

29/06/2017
Artículo original

Como seguramente sabrás, ya que se está comentando a todas horas en las noticias y en la prensa, miles de empresas de todo el mundo han estado siendo atacadas, y muchas infectadas, por un tipo de malware denominado Ransomware.

Este tipo de software malicioso se suele recibir a través de correo electrónico y aprovecha una vulnerabilidad de una versión antigua (la 1.0) del protocolo SMB para compartir archivos en redes Windows.

Para evitar este tipo de malware se recomienda utilizar sistemas operativos modernos (desde luego jamás Windows XP, pero tampoco Windows Vista ni otros sistemas ya no soportados) y tener el sistema actualizado con los últimos parches  disponibles, preferiblemente teniéndolo en actualización automática.

El protocolo SMB vulnerable no es necesario en redes modernas, pero viene activado por defecto en todos los equipos, incluso en Windows 10, para facilitar la compatibilidad. Por ello, para disminuir la probabilidad de ser infectado recomendamos desactivarlo.

Para ello lo único que hay que hacer es buscar "Panel de Control" en el menú de inicio, y una vez en éste ir a "Activar o desactivar las características de Windows". Una vez dentro buscamos "Compatibilidad con el protocolo para compartir archivos SMB 1.0/CIFS" y lo desactivamos. El proceso se puede ver aquí:

Desactivar SMB 1.0
Pulsa para aumentar si lo necesitas

Tras unos segundos nos pedirá que reiniciemos el equipo. Lo hacemos y ya tendremos el protocolo desactivado, y una superficie de ataque menos de la que preocuparse.

Esperamos que te resulte útil.

10 de las Mejores Herramientas en la Línea de Comandos

28/06/2017
Artículo original

Comandos

Escribir commandos en una terminal puede parecer tedioso, pero con las herramientas correctas, la línea de comandos puede ser increíblemente poderosa. Aquí están nuestras herramientas de línea de comandos favoritas que hacen impresionantes cosas que simplemente no puedes encontrar en una GUI (Interfaz Gráfica de Usuario).

Nota: Mientras que un montón de tutoriales y videos en esta página son Linux-central, estos comandos son útiles para todos. Los usuarios de Mac pueden usar todos estos comandos en sus Terminales de la misma forma, y los usuarios de Windows pueden chequear Cygwin para una mayor experiencia de terminal como-UNIX donde estas herramientas vienen de la mano. Además no todas las herramientas vienen preinstaladas en cada sistema, por lo que puedes necesitar instalar algunas de ellas por separado antes de que puedas usarlas.

10. Top

Cuando tu computadora comienza a congelarse, realentarse, o simplemente comportarse de forma extraña, el comando top puede ayudarte a enderezarla. Simplemente escribiendo *top *en una terminal, puedes obtener una lista de cada programa que está corriendo en tu sistema, así como cuántos recursos del sistema están consumiendo. Luego, si encuentras uno que se haya vuelto un poco loco, puedes matarlo y volver tu sistema a la normalidad, rápidamente. Esto en su totalidad lleva unos pocos segundos y no necesitas esperar que ningunas ventanas o atractivas imágenes carguen. Revisa esta rápida introducción a top para más información, y si quieres algo un poco más amigable, el comando htop es un reemplazo mucho mejor.

9. Ifconfig

Si tienes más de una computadora en tu casa, es probable que necesites entrar en la configuración de tu red reiteradas veces. Conocer tu red puede ayudarte a controlar tu HTPC, monitorear tus descargas de BitTorrent, o compartir archivos entre computadoras. Cuando llegue el momento, ifconfig será tu mejor amigo. Muestra la dirección IP de tu computadora, la dirección MAC de tu tarjeta Ethernet y Wi-Fi, y mucho más. Revisa esta introducción a ifconfig para ver cómo se usa.

8. Chmod y Chown

De vez en cuando, te encuentras con un error de “permiso denegado” al intentar acceder a un archivo, y eso puede ser exasperante. Correr chmodeditará los permisos de cualquier archivo, permitiéndote leer, escribir y/o ejecutar un archivo dado, acorde a tus especificaciones. Puedes hacer esto desde la GUI, pero chmod es un poco más poderoso, especialmente si estás trabajando con múltiples archivos. Para ver cómo se usa, revisa esta guía de chmod y su hermano chown, que te ayudará a obtener total propiedad de un archivo.

7. SSH

Para qué configurar un sistema de pantalla completa compartida cuando todo lo que necesitas es checkear una sencilla cosa? SSH te conecta a otra computadora y te permite usar su terminal como si estuvieras sentado justo en frente de ella. Puedes checkear procesos activos, cambiar permisos, y acceder a archivos en tu máquina remota justo desde la máquina que está frente a ti. Puede hacer mucho más también, desde controlar un servidor sin monitor hasta encriptar tu navegador web en una conexión menos-que-segura. Incluso puede ayudarte a controlar tu dispositivo iOS .

6. Wget

Puedes ingresar a un sitio web y bajar un archivo en un click, pero si quieres serio contro sobre tus descargas wget es lo mejor para la tarea. Con unos pocos tipeos puedes descargar automáticamente toda la música de un sitio web, continuar reactivar descargas que son interrumpidas, o incluso capturar el archivo entero de la “Imagen Astronómica del Día” (“Astronomy Picture of the Day”) de la NASA. Revisa nuestra guía de capacitación en wget para ver todo lo que esta pequeña herramienta puede hacer.

5. Vi y Vim

A pesar de todos las embellecidas herramientas para escritura que hay por ahí, el texto plano sigue siendo una de las formas más útiles para manejar información. Puede ser para crear una extremadamente versátil lista de tareas, ayudarte a ajustar la configuración de tu aplicación favorita, o incluso permitirte construir un sitio web completo. Y si bien hay una gran cantidad de editores de texto excelentes, muchos usuarios poderosos eligen decididamente Vi y Vim. Vi y Vim son editores de texto de línea de comandos que son totalmente basados en teclado, permitiéndote navegar por grandes bloques de texto con sólo tipear unas pocas teclas. Si te tomas en serio la edición de texto, estos editores son el camino a seguir, a pesar de su curva de aprendizaje. Afortunadamente, la web está llena de tutoriales sobre cómo usarlos.

4. Grep

No todo el trabajo de línea de comandos es limpio y simple. A veces, correrás un comando y obtendrás una pared gigante de texto que es imposible de vadear. Por suerte, grep te ayudará a encontrar lo que estás buscando. Por sí solo, puede buscar una frase específica a través de todo el texto dentro de un archivo en tu sistema (por ejemplo, grep Laundry todo.txt), que es útil en sí mismo. Sin embargo, el verdadero poder de grep viene cuando se utiliza junto con otros comandos. ¿No encuentras lo que estás buscando en la salida de top? Puedes utilizar grep para buscar el programa que estás buscando. Echa un vistazo a este tutorial para aprender a usar grep, y combinarlo con otros comandos, sólo necesitas aprender …

3. Pipes

Pipes no es el nombre de una herramienta específica, sino más bien una clase de herramientas que te ayudan a enviar la salida de un comando a otro comando. Tomando el ejemplo de #4, en donde queríamos encontrar algo específico en la salida de top. Para ello, deberías ejecutar algo como 2 top-l | grep firefox. El símbolo | conecta la salida de top a grep, que busca entonces firefox y encuentra la información relevante. También puedes conectar la salida de un comando a un archivo de texto con el símbolo>, como por ejemplo:* ifconfig > myip.txt.* Para más ejemplos de como usar *pip*es, visita nuestro manual de línea de comandos para principiantes.

2. Find

A diferencia de grep, que busca texto dentro de archivos, find es una herramienta que te ayuda a encontrar archivos en función de otros criterios, como nombre, tipo de archivo, o fecha de última edición. Es mucho más poderosa que el tradicional buscador Spotlight o el de Windows, y una de las mejores maneras de encontrar rápidamente archivos en tu sistema. Además, si quieres buscar algo dentro de un archivo, puedes conectar la salida del find a grep y resolverlo. Para ver cómo se hace, checkea este gran tutorial para el comando find.

1. Apt-get y otros gestores de paquetes

Si estás cansado de abrir un navegador web y visitar un sitio web sólo para descargar un programa, los gestores de paquetes son un regalo del cielo. Gestores de paquetes - como apt-get de Ubuntu, pacman de Arch Linux, o algún brebaje casero de un Sistema Operativo X que hace a la instalación muy fácil. Con ellos, puedes buscar en una gran base de datos de aplicaciones, así como descargarlas e instalarlas con sólo tipear unas teclas. Todo lo que necesitas saber es el nombre de la aplicación que estás buscando. Incluso te permite instalar los requisitos previos necesarios para ese programa -como Java- , para que no tengas que hacerlo tú mismo. el gestor de paquetes que utilizas generalmente depende de tu sistema operativo, entonces googlea para ver qué gestores están disponibles para tu sistema y qué aplicaciones están disponibles en sus repositorios.

Si te has cansado de la interfaz gráfica de usuario, checkea nuestra lista de aplicaciones de línea de comandos no convencionales y si no lo has hecho todavía, asegúrate de leer sobre cómo convertirse en un ninja de línea de comandos con atajos para ahorrar tiempo.


Fuente | lifehacker

Códigos secretos y ocultos para Android

28/06/2017
Artículo original

Si te gusta jugar con tu Android, estos Códigos secretos y ocultos para Android son para tí. Con ellos tendrás mejor control de tu dispositivo Android.

He probado estos códigos yo mismo, no asumo ninguna responsabilidad si algún código causa algún problema. Este artículo es solo para usuarios avanzados.

  • *#*#4636#*#*

Da datos muy interesantes sobre la batería y el teléfono. Te llevará a un menú con 4 opciones: información del teléfono, información de la batería, historial de batería y estadísticas de uso.

  • *#*#7780#*#*

Este es el código que formatea el teléfono al estado de fábrica (factory reset). Borra todas las configuraciones de la cuenta de google de tu teléfono (muy útil si tienes que dejar el teléfono a alguien por unos días). Además borra todos los datos del sistema y aplicaciones descargadas. Puedes probar este código con seguridad, ya que una vez que lo introduzcas, solicita confirmación. Si lo reseteas, no se borran los archivos de la tarjeta de memoria.

  • *2767*3855#

Piénsalo dos veces antes de usar este código, porque no solicita confirmación. Una vez introducido, lo único que lo detiene es quitar la batería del móvil. Este código formatea el almacenamiento interno y resetea todas las configuraciones.

  • *#*#34971539#*#*

Dá información sobre la cámara. El menú que aparece será: actualizar el firmware de la cámara, obtener información del firmware, y recibir las veces que se ha actualizado. No pulseis la primera de las opciones porque la cámara no funcionará y tendreis que llevarlo al servicio técnico.

  • *#*#7594#*#*

Permite modificar la función del botón de apagado. Por defecto el teléfono se apaga si lo mantenemos pulsado un rato. Con este código podemos cambiar esto, para que se apague con solo una pulsación corta de este botón.

  • *#*#273283*255*663282*#*#*

Con este código se abre una pantalla para copiar archivos, donde podemos realizar una copia de seguridad de nuestra música, imagenes etc.

  • *#*#197328640#*#*

Con este código entramos en el modo servício. Podemos cambiar configuraciones y ejecutar test.

  • *#*#8255#*#*

Veremos un monitor del servicio Gtalk.

Página Anterior Página Siguiente