<![CDATA[Laux]]>http://laux.es/Ghost 0.7Tue, 21 Feb 2017 11:26:30 GMT60<![CDATA[Antipublicidad]]>Como cada mes de Enero, Spotify resume mi año musical. Siempre me gusta echar un vistazo atrás y ver qué he escuchado durante el año pasado. No soy un gran amante de la música, aunque si es cierto que siempre está presente en distintos momentos de mi día a día.

]]>
http://laux.es/antipublicidad/f39c29be-edba-484c-98b7-91c4f0ec1f19Mon, 11 Jan 2016 13:59:00 GMT

Como cada mes de Enero, Spotify resume mi año musical. Siempre me gusta echar un vistazo atrás y ver qué he escuchado durante el año pasado. No soy un gran amante de la música, aunque si es cierto que siempre está presente en distintos momentos de mi día a día.

Antipublicidad

Antipublicidad

EDM, Rap, Pop... son los géneros musicales que más he escuchado en 2015. Si os habéis preguntado como yo, qué es el género "EDM", cabe decir que no es un género músical y viene de mi lista Farming Code.

Salvando tendencias y redecillas musicales, respecto a los artistas he escuchado 209 diferentes entre los cuales destacan:

Antipublicidad

¿Algún rastro de reggaeton? ¿Algún rastro de cualquier género latino? Entonces, ¿por qué la gran mayoría los anuncios que Spotify me muestra son de listas, discos y artistas de Reggaeton? Tienen todos mis gustos musicales y son capaces de resumir mi año musical, pero no son capaces de encajar un anuncio que realmente me interese.

¿O quizás si? Quitando los anuncios de reggaeton, Spotify suele anunciarme su servico Premium haciendo especial hincapié en que mejorando mi cuenta, eliminaré los anuncios. Esto me ha llevado a pensar que o bien el 90% de sus anunciantes son distribuidoras de este tipo de música o que realmente su "antipublicidad" busca mi suscripción a su servicio Premium.

]]>
<![CDATA[Eliminar Referrer Spam en Nginx y Analytics]]>http://laux.es/referrer-spam-nginx-ganalytics/faf92673-aa99-42fa-a268-efe25fe81c3fWed, 22 Apr 2015 13:20:50 GMTPara poneros en situación, el Referrer o Referencia es un campo de cabecera de una petición HTTP. Este campo indica la URL origen desde la cual se ha originado la solicitud. En otras palabras, es la dirección desde la cual la persona que visita tu página ha hecho click en el enlace que le ha llevado a esta. Para más información, podéis pasaros por la Wikipedia.

Captura de pantalla de la aplicación de Google Analytics mostrando las referencias

Referencias sospechosas en Google Analytics

Hoy de paso por Google Analytics me he fijado que algunas referencias de otras webs eran un tanto sospechosas. Es raro que dominios como social-buttons o free-share-buttons se interesen por un blog de UX y desarrollo, así que con una búsqueda encontré de qué se trataba toda esta historia.

Referer Referrer SPAM. ¿Qué ganan con ello?

Muchas webs utilizan herramientas analíticas (como Google Analytics) a diario. Estas nos proporcionan mucha información útil, que nos permite desde saber que artículo es el más visitado en nuestro blog, hasta como enfocar mejor una campaña publicitaria.

De este modo, es especialmente importante que los datos recopilados sean reales, es decir, que el tráfico analizado no provenga de bots o programas automatizados (Al final las personas siempre somos lo más importante :P). En resumen, al recibir ataques de este tipo, nuestras analíticas quedan infectadas ofreciendo información errónea.

Los que utilizan esta práctica consiguen incluir sus links en nuestras herramientas y logs. El Referrer SPAM está bastante penalizado por los buscadores (por ejemplo, la búsqueda de estos dominio en Google no ofrece ningún resultado).

Entonces, ¿por qué este tipo de ataques? La primera es que algo molesto y los que trabajamos con estas herramientas, al final acabamos entrando en dichas webs para comprobar si realmente son "reales" o por curiosidad. Así de simple, consiguen retornar tráfico ahacia su web.

A pararle los pies

Para solucionar este problema tenemos dos frentes con los que lidiar: nuestro servidor y las plataformas analíticas. En este artículo vamos a centrarnos en Nginx y Google Analytics.

Google Analytics

Si ya hemos recibido algún ataque de este tipo, los datos están almacenados en nuestra cuenta. Lo único que nos queda es filtrarlos para evitar que se muestren en la interfaz. Para filtrarlos, primero nos dirigimos a nuestra cuenta y pulsamos en Administrador > Filtros:

Sección de filtros en Google Analytics

Sección de filtros en Google Analytics

Una vez dentro, pulsamos en Filtro Nuevo y rellenamos los campos como se muestra en la siguiente captura. La expersión regular a incluir la podéis encontrar en el siguiente Gist. Si véis que falta algo, no dudéis en comentar y lo agregamos ;).

Agregar un filtro de exclusión en Google Analytics

Filtro de exclusión en Google Analytics

De cara al tráfico futuro, Google Analytics nos permite ignorar dominios de referencia de manera que cuando lleguen nuevos datos con dicha referencia serán ignorados. Aplicar estos filtros es un poco más tedioso, ya que debemos de hacerlo uno a uno. Para ello nos dirigimos a la sección de Lista de exclusión de referencias:

Menú de listas de exclusión de referencias

Menú de listas de exclusión de referencias

Una vez dentro de la sección, pulsamos en Agregar lista de exclusión de referencia e incluimos cada dominio con su extensión: .es, .com...

NGINX

También es importante parar estos ataques desde el servidor. Con los cambios anteriores eliminamos los datos erróneos en Google Analytics, pero las peticiones siguen por lo que consumen el ancho de banda de nuestro servidor.

Para bloquear el acceso desde determinadas referencias nos dirigimos a los archivos de configuración de nuestros hosts virtuales. Estos se encuentran en nginx/sites-availables/ o nginx/sites-enabled (personalmente los archivos de configuración los tengo en sites-available y para activarlos creo un symlink en sites-enabled).

En cada archivo de configuración, dentro de location introducimos el siguiente condicional:

# Stop SPAM Referrers
        if ($http_referer ~* (Free-Traffic|babes|click|diamond|forsale|girl|jewelry|love|nudit|poker|porn|poweroversoftware|sex|teen|video|webcam|zippo|social-buttons|simple-share-buttons|free-share-buttons)){
                  return 403;
        }

En el Gist que comenté anteriormente tenéis un ejemplo. Antes de reiniciar Nginx, comprobamos que no nos hemos equivocado mediante el comando nginx -t. Si todo está ok reiniciamos nginx: service nginx restart.

Ahora solo nos queda probar que todo ha ido bien, para ello realizamos una petición a nuestro servidor e introducimos como referencia alguna web que debería bloquear. En mi caso he utilizado CURL, y como era de esperar, con una referencia de free-share-buttons obtenemos un error 403.

Petición con CURL agregando como referencia free-share-buttons

Al realizar una petición con una referencia Spam, obtenemos un error 403

Más soluciones

Os dejo otros artículos con más información y soluciones a estos ataques :)

]]>
<![CDATA[¿Por qué refactorizar?]]>http://laux.es/refactorizar/232a786e-a9a4-415b-996d-478c8076161cThu, 02 Apr 2015 13:36:55 GMT

La refactorización es el proceso de modificación del código fuente de una aplicación sin afectar a su comportamiento actual. En otras palabras, modificamos internamente su estructura sin perder ni agregar funcionalidad.

Generalmente, el objetivo es mejorar la calidad del código, optimizarlo y corregir problemas. ¿Quién no ha abierto un archivo que había programado hace dos meses y ha soltado una lagrimita?

Cada aplicación es un mundo

Programar algo es fácil, pero programar bien es bastante más complicado. Tenemos a nuestra disposición una gran cantidad de manuales, tutoriales, librerías, proyectos OpenSource... Una navaja Suiza que convierten una aplicación en un joven Frankestein.

¿Por qué refactorizar?

¡El servidor arranca! ¡Funciooona!

Como toda navaja, es un arma de doble filo. Copiar y pegar, adoptar una solución sin sopesar los pros y los contras, o sobrecargar a nuestro Frankestein con 18 piernas cuando con dos es suficiente, hace que a la larga, nuestra aplicación comience a no poder ofrecer el servicio para que el que se programó.

Los plazos ajustados, la inexperiencia en el lenguaje y muchas más situaciones que cada uno hemos tenido, provocan que sea usual encontrarnos con problemas de este tipo en nuestras aplicaciones.

¿Cuándo?

Cualquier momento es bueno para aplicar nuevos conocimiento en tu código, ¿pero cuándo es bueno pararnos a mejorar lo anterior?

Si algo funciona, no lo toques. Esta es una frase que comparto en algunas ocasiones, pero si basamos nuestra aplicación en esta idea, pronto tendremos problemas. Aunque parezca que pararte a retocar algo que funciona es una pérdida de tiempo, a la larga lo agradecerás.

Un código mal estructurado provoca lo que yo llamo "avalancha mojónica" o "tsunami de ñapas". Un problema en un punto de la aplicación debido a algún aspecto que no se consideró empieza a afectar a otros componentes, teniendo que modificar gran cantidad de código por un detalle.

Para mi, el mejor momento para refactorizar es al acabar un ciclo de desarrollo en el que te has dado cuenta que todo ha supuesto un esfuerzo mayor del que debería. Por supuesto, no es necesario refactorizar todo una aplicación entera (y tampoco recomendable). Lo mejor es crear una nueva rama en Git, trabajar en ello poco a poco y aplicar lo aprendido al nuevo código.

Refactoring

Las ventajas de refactorizar son múltiples, tanto a nivel de aplicación como a nivel personal. Pararte a refactorizar implica el replanteamiento de un problema, enfrentarte de nuevo ante algo que "funciona" pero que se puede mejorar gracias a tu experiencia.

Papel y boli son tus amigos. Analiza el problema de nuevo, observa como lo resolviste y plantea una nueva solución teniendo en mente el futuro. Es importante no olvidarte de que no estás solo, amigos, escritores en blogs (ejem) o alguien en Twitter seguro que se han enfrentado a una situación similar y están dispuestos a ayudarte.

De manera personal puedo decirte que tras un tiempo refactorizando partes de nuestra aplicación de @redBorder_net es cuando realmente he sentido que entiendo de Ruby.

He de decir, que he soltado algún grito como "whaaaaat!" cuando he repasado archivos que creé hace tiempo. Pero gracias a amigos como @carlosrdrz, @cmeniz y @pikislabis, al tiempo que llevo programando y a leer, ahora puedo decir que soy mejor programador :D.

]]>
<![CDATA[Colorear logs en consola]]>http://laux.es/colorear-logs-en-consola/6ab1a541-e8ab-43be-ba00-26e05a930ebeWed, 04 Mar 2015 20:35:46 GMTTrabajar en tiempo real cazando datos en Logs es una locura, pero a veces, irremediablemente necesario.

Para estos momentos, suelo ayudarme de dos comando para leer y destacar las partes que me interesan. Con tail y la opción -f, leo los datos de un log en tiempo real, los cuales pasan a través de egrep que aplica una expresión regular para colorear y mostrar los datos. Por ejemplo, para leer de un Log de producción y destacar la palabra controller, podemos ejecutar el siguiente comando:

tail -f production.log | egrep ---color 'controller'

En este caso, solo se mostrará por consola las líneas que contengan dicha palabra que además, aparecerá destacada en color.

En el caso de necesitar leer todas las líneas, agregamos al patrón regex la detección de última línea. De esta manera, al encontrar siempre dicho "caracter", mostrará todas.

tail -f production.log | egrep ---color 'controller|$'
]]>
<![CDATA[UX y SmartBands]]>http://laux.es/smartbands/9a7af396-d6cf-4737-97eb-5b7bf569c7a9Sat, 17 Jan 2015 17:06:47 GMTMi band

Mi Band

Ante todo decir que este artículo no pretende hacer un análisis de esta pulsera, sino de qué rodea a las smartbands y como han influido en mi día a día

Son ya 5 días con esta pulsera en mi muñeca. Dormir, ducharme, trabajar, salir... tareas diarias que quedan registradas y sincronizadas con la aplicación y sus servidores.

Alejándome de su uso deportivo, cada vez más personas la incorporan a su rutina. El elevado precio de algunas de estas pulseras, la falta de funcionalidad para actividades diarias y muchas veces, el miedo de perder la privacidad, son motivos que llevan a uno a plantearse la compra de dicho gadget.

3 puntos al día!

Contar pasos es una de esas características que traen todas las pulseras del mercado, y el sedentarismo uno de los principales problemas de la sociedad en la que vivimos.

Llegar al trabajo y ponerte delante de una pantalla, moverte en coche/transporte público, sentarte en el sofá a ver la tele o ponerte con el ordenador, ¿te suena?. Cada vez estamos más concienciados de que hacemos poco deporte y la relación de este con nuestra salud.

Contar nuestros pasos es una manera de decirnos a nosotros mismos que nos movemos más de lo que creemos. Para una persona adulta, el deporte es necesario y andar (sin entrar en senderismo...) no es suficiente, pero ver que he andado 8 kilómetros en un día sirve como "placebo" en cuanto a satisfacción personal.

Esto lo saben muy bien en Mi Band y esta te permite establecer tu meta de pasos al día: quiero dar a diario 6000 pasos. En todo momento puedes saber como llevas tu objetivo pues la pulsera tiene tres LEDs en la zona superior y su iluminación indica el porcentaje actual para llegar a tu objetivo.

Mi band indicando que ya he cumplido mi objetivo

Las tres luches indican que ya he dado los 6000 pasos que me propuse

En cuanto cumples tu objetivo, la pulsera vibra y se ilumina. ¡Te has propuesto algo y lo has conseguido! ¿Fácil y efectivo verdad?. Ahí llevas tu ración de satisfacción diaria, eres capaz de cumplir tus objetivos.

Dormir, dorm... zzzZZ

Otra de las funcionalidades típicas es la de seguimiento del sueño y alarmas inteligentes. Dormir bien hace que rindamos más y nos encontremos mejor y de buen humor.

Todos sabemos que es difícil mantenter la costumbre de dormir al menos, 8 horas al día. Insomnio, preocupaciones, o simplemente tener que acabar un proyecto o prácticas de universidad hacen que durmamos menos de lo que debiéramos. Cabe decir, que cada uno se conoce a sí mismo y hay quién duerme más y quién menos.

Las alarmas inteligentes son una manera despertarte con el pie derecho (¿o izquierdo si eres zurdo?). Estas alarmas evitan romper ese sueño del que ni un concierto debería despertarte.

No obstante, lo que más me he gustado de este sistema es el ser consciente de que estoy durmiendo menos de lo que debería. Es esa llamada de atención que me dice que estoy durmiendo poco lo que realmente merece la pena de dormir con algo pegado a la muñeca (un poco molesto para mi gusto).

Aplicación Mi band y estadísticas de los últimos días

Debo de dormir un poco más...

Privacidad

Es complicado tratar este tema cuando llevas un objeto encima que monitoriza todos tus pasos y normalmente, los exporta a un servidor.

Llegados a este punto debes de decidir si acceder a ello o no. Solo quiero comentar que le otro día conecté mi móvil al ordenador y me puse a echar un vistazo al volcado de Logs de información de Android (en el siguiente apartado veréis por qué hice esto). Me llevé una sorpresa con un mensaje de la aplicación Mi Band a las 12:30 de la noche que decía:

Es muy tarde, acuestate ya!

Es algo que prácticamente nadie verá, pero está ahí y nos ayuda a hacernos una idea de la información que pueden obtener sobre nuestros hábitos.

¿Y el futuro?

Lo primero que se me viene a la cabeza cuando me preguntan qué me parecen las smartbands, es que están muy desaprovechadas. Monitorizar el sueño y los pasos es algo que hacen prácticamente todas, pero por ejemplo, cambiar de canción con una pulsación no. Mi Band es capaz de detectar pulsaciones, ¿por qué no agregar esta funcionalidad?

El freno a este desarrollo viene por dos partes, el precio y el software de propietario. Android liberó hace poco un SDK (Kit de desarrollo de software) que te permite interactuar directamente con estos dispositivos.

En el caso de Mi Band (cuesta unos 20€), el problema viene porque no se ha liberado la API para trabajar con ella. Como consecuencia, solo los desarrolladores de esta pulsera pueden trabajar en nuevas características.

Aunque siempre algo se escapa de sus manos y la ingeniería inversa está ahí. Este es el motivo de que el otro día estuviera con el móvil conectado al PC y leyendo Logs. Si os queréis informar un poco más, aquí tenéis un proyecto que pretende obtener una API para la Mi Band: MiBand Notifier.

La smartband ideal

Por supuesto, la Mi Band no lo es. Al final, una pulsera inteligente no es más que un complemento a tu día a día. Te ayuda a darte cuenta de qué haces a diario, qué deberías de hacer y te facilita distintas tareas.

La idea de llevarla personalmente me gusta, pero pienso que es muy importante tener en mente que nos deben de ayudar, no controlarnos. Este es el límite que nunca debería de pasar ninguna empresa porque a nadie nos gusta que nos digan que nos acostemos o que hagamos más ejercicio.

La pequeña diferencia entre hacer que nos demos cuenta de que es mejor cambiar algo en vez de intentar obligarnos a ello, es lo que al final influye realmente en nuestro comportamiento.

]]>
<![CDATA[Copiar clave rsa para ssh desde Mac Os]]>¿Echas de menos el comando ssh-copy-id en Mac OS?. Puedes susituirlo por la siguiente línea:

cat ~/.ssh/id_rsa.pub | ssh usuario@ip "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Solo hace falta modificar tu usuario y la IP o la dirección de la máquina destino y listo :)

]]>
http://laux.es/copiar-clave-publica-ssh-mac-os/365cd1a1-f1be-4cfb-bd89-1e0b5ebae545Tue, 30 Dec 2014 18:15:56 GMT¿Echas de menos el comando ssh-copy-id en Mac OS?. Puedes susituirlo por la siguiente línea:

cat ~/.ssh/id_rsa.pub | ssh usuario@ip "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Solo hace falta modificar tu usuario y la IP o la dirección de la máquina destino y listo :)

]]>
<![CDATA[Alto consumo de CPU por net.agent]]>http://laux.es/alto-consumo-de-cpu-por-net-agent/58dd63b3-5178-4798-ba4d-4962d46c73afMon, 29 Dec 2014 22:14:22 GMTAntes al conectarme a mi Raspberry Pi con Raspbian observé que la carga del sistema era superior a 1 y que el consumo de CPU era demasiado alto.

Al echar un vistazo con comando top, había un proceso que estaba consumiendo casi todo el sistema: net.agent.

Interfaz local

El problema era tan simple como no haber iniciado la interfaz local (lo) del sistema. Podeis comprobar si la teneis activa con el comando:

ifconfig | grep -A 6 lo

Para activarla basta con ejecutar con permisos de superusuario:

ifup lo

Solo queda automatizar el inicio de la interfaz local al encender la Raspberry. Editamos el fichero /etc/network/interfaces con permisos de superusuario y agregamos las siguientes línea:

auto lo
iface lo inet loopback
]]>
<![CDATA[El guante sin pareja]]>El guante sin pareja

El guante sin pareja

Esta es la primera vez que escribo un artículo personal en este blog. Es una corta historia que por lo menos a mí me pareció bastante curiosa.

En el bus

La mitad de los días de la semana, mi rutina al volver a casa es coger

]]>
http://laux.es/el-guante-sin-pareja/4c094ffb-5a02-4481-8db0-e3901a7bab93Sat, 20 Dec 2014 13:43:03 GMTEl guante sin pareja

El guante sin pareja

Esta es la primera vez que escribo un artículo personal en este blog. Es una corta historia que por lo menos a mí me pareció bastante curiosa.

En el bus

La mitad de los días de la semana, mi rutina al volver a casa es coger el metro y después el autobús. No soy de los que tienen prisa en bajar, espero que el autobús llegue a la parada y cuando para, es cuando cojo mi mochila y me dirijo hacia la puerta.

Ese día viajaba en la zona de atrás del bus. Al llegar a mi parada, el conductor cerró la puerta demasiado rápido y no me dió tiempo a llegar a ella, por lo que mientras seguía entrando gente, me acerqué hasta la mitad del bus y le dije al conductor que abriera otra vez las puertas.

Como es normal, subí el tono de voz para que se enterase, pero iba con la radio y no me oyó. Los que si me oyeron fueron el resto de personas que iban en el bus.

Empecé a andar más rápido, ya que la siguiente parada me obligaba a andar 15 minutos más y era bastante tarde. Lo que me sorpredió, es que a pesar de que todos me miraban, ninguno de los que estaban cerca del conductor le dijo que abriera.

Es por ello, que mientras todos seguían cruzandome la mirada, tuve que correr hacía el conductor para avisarle. Cuando estaba a un metro de él, pude decirle que me abriera y conseguí bajar, pero mientras me acercaba choqué con varias personas y el guante se me cayó del bolsillo.

Y me quedé sin guante

No sé si fue indiferencia, falta de reacción o ¿verguenza?, de pedir al conductor que me abriera. A veces no nos damos cuenta de que un pequeño gesto puede ayudar a otra persona, o estamos demasiado cansados como para preocuparnos por algo que no nos ocurre a nosotros o no nos parece importante.

Esta es la historia de como mi guante se quedó sin pareja.

]]>
<![CDATA[Posición de los botones]]>Como continuación al artículo Ok y Cancelar no es suficiente, dónde se hablaba sobre el contenido de los botónes en cuadros de diálogos y formularios, en este vamos a tratar sobre el posicionamiento de dichos botones.

Big

Generalmente, las personas que utilizan nuestras aplicaciones están acostumbradas a leer de izquierda

]]>
http://laux.es/posicion-botones/d1a6f711-e2de-4422-89c5-db500221b065Sun, 30 Nov 2014 17:41:39 GMTComo continuación al artículo Ok y Cancelar no es suficiente, dónde se hablaba sobre el contenido de los botónes en cuadros de diálogos y formularios, en este vamos a tratar sobre el posicionamiento de dichos botones.

Big

Generalmente, las personas que utilizan nuestras aplicaciones están acostumbradas a leer de izquierda a derecha. Mientras rellenamos los datos de un formulario o leemos un cuadro de diálogo, las líneas se van sucediendo, extrayendo de ellas el contenido relevante.

En un estudio realizado por Luke Wroblewski, 23 personas realizaron la tarea de completar un formulario y enviarlo. Cada formulario tenía una disposición y morfología distinta de botones de "enviar" y "cancelar".

Como conclusión, dada la alineación del texto y la dirección de lectura de las personas que realizaron el estudio, los diseños más eficientes eran los que situaban los botones a la izquierda del formulario. Los diseños que situaban los botones a la derecha no eran tan eficientes en visualización, pero también tuvieron un 100% de éxito en el envío.

Cuadro de diálogo con los botones alineados a la izquierda

Cuadro de diálogo con los botones alineados a la izquierda

Si queréis ampliar más, os dejo el enlace al estudio: Primary & Secondary Actions in Web Forms.

Small

En el caso de las pantallas de móviles, tendemos a coger el móvil con una sola mano y usamos el pulgar para navegar. En este caso, la zona de confort (zona azul del dibujo) para pulsar con nuestro pulgar se reduce, por lo que si algún elemento se sale de ese límite nos obligará a coger el móvil con la otra mano o a estirar el dedo tapando el contenido.

(Quiero remarcar que este esquema está pensado para personas diestras o zurdos que utilicen el móvil con la mano derecha)

Zona de confort de pulsación con el pulgar

Zona de confort de pulsación con el pulgar

Además, debido a la anchura de la pantalla, podemos captar toda la información de una línea en un solo vistazo, por lo que cambiar la posición de los botones no supone una ruptura en nuestro flujo de lectura.

Dadas estas condiciones, la opción más óptima en móviles es situar los botones a la derecha, ya que entrarían dentro de la zona de pulsación del pulgar.

Botones de acción dentro de la zona de pulsación del pulgar

Botones de acción dentro de la zona de pulsación del pulgar

Eficiencia

Según el estudio de Luke las personas solo tuvieron problemas a la hora de lidiar con botónes separados e iguales, por lo que si descartamos esa pequeña mejora de eficiencia, mientras distingamos ambos botones y los coloquemos juntos, para un diseño web será más que suficiente.

Os dejo otra referencia más, por si os animáis a leerla ;)

]]>
<![CDATA[Buscar comandos en el terminal de UNIX]]>Escribimos una gran cantidad de comandos en nuestros terminales. Encontrar los últimos es sencillo, nos bastamos con nuestra tecla ↑. ¿Pero que ocurre cuando necesitamos el comando que ejecutamos hace varios días?

Búsqueda hacia atrás

Uno de los comandos más útiles de UNIX es el llamado Reverse-i-search. Para ejecutarlo basta

]]>
http://laux.es/comandos-anteriores-linux/56deca73-2e81-41ca-91b2-87fb4e07b5e6Mon, 06 Oct 2014 20:16:00 GMTEscribimos una gran cantidad de comandos en nuestros terminales. Encontrar los últimos es sencillo, nos bastamos con nuestra tecla ↑. ¿Pero que ocurre cuando necesitamos el comando que ejecutamos hace varios días?

Búsqueda hacia atrás

Uno de los comandos más útiles de UNIX es el llamado Reverse-i-search. Para ejecutarlo basta con pulsar en CTRL + R en la consola, y empezar a introducir nuestro criterio de búsqueda.

Veamoslo de manera práctica. Imaginemos que hemos ejecutado en el terminal los siguientes comandos, siendo el del final el último ejecutado:

#~ sudo service app restart
#~ sudo service app2 restart
#~ sudo service app3 restart
#~ mv file bbb/ 
#~ cat bbb/file
#~ cat bbb/another_file
#~ cd ~
#~ mkdir ccc

Después del último comando, para llegar otra vez a sudo service app restart, necesitaríamos pulsar ↑ 8 veces hasta llegar a la línea deseada.

En cambio su pulsamos CTRL+R y comenzamos a escribir "sudo" obtenemos en la consola lo siguiente:

Terminal de Mac OS al ejecutar Reverse-i-search

Terminal de Mac OS al ejecutar Reverse-i-search

Al buscar hacía arriba la primera coincidencia con "sudo" es sudo service app3 restart. No es nuestro objetivo, pero no hay ningún problema, al pulsar otra vez CTRL + R obtenemos la siguiente coincidencia: sudo service app2 restart. Como imagináis, otra vez más a CTRL + R y finalmente:

Terminal de Mac OS una vez encontrado el resultado que necesitamos

Terminal de Mac OS una vez encontrado el resultado que necesitamos

Una vez que hemos llegado al comando en cuestión tenemos dos opciones. Si queremos ejecutar directamente el comando pulsamos en ENTER. Por el contrario, si queremos el comando para modificarlo antes de ejecutarlo, pulsamos en →.

Búsqueda hacía delante

También se puede dar el caso de que nos hayamos pasado el comando que necesitamos. En este caso podemos parar la ejecución y volver a empezar, o podemos acudir a i-search.

Preparamos el terreno

En la mayoría de los terminales será necesario configurar la consola para poder ejecutar el comando de búsqueda hacia delante (i-search). Para ello simplemente ejecutamos el siguiente comando:

stty -ixon

Si queréis más información sobre el por qué de esta necesidad, dirigios al siguiente enlace de StackOverflow.

Continuamos!

Ahora solo queda saber cómo activar dicho comando. Al igual que Reverse, tiene su propio atajo de teclado y es: CTRL + S.

Al ejecutar este comando veremos como el terminal cambia el programa de Reverse-i-search a i-search. Ejecutando otra vez más CTRL + S comenzaremos a ir hacía delante en función de nuestro criterio de búsqueda.

Ejecución del comando i-search en el terminal de MAC

Ejecución del comando i-search en el terminal de MAC

]]>
<![CDATA[Comparación de Arrays con Ruby]]>Trabajando hoy, he tenido que realizar distintas comparaciones entre varios arrays en ruby 2.1.2. Os recopilo las distinas maneras para comparar ya sea con otros arrays u otros valores.

Comparar con valores

Utilizamos la función include?. Preguntamos al array si este incluye un elemento retornando como respuesta true

]]>
http://laux.es/comparacion-de-arrays-con-ruby/a3575d64-4b69-4317-9ec2-abbed89f39edFri, 29 Aug 2014 22:41:23 GMTTrabajando hoy, he tenido que realizar distintas comparaciones entre varios arrays en ruby 2.1.2. Os recopilo las distinas maneras para comparar ya sea con otros arrays u otros valores.

Comparar con valores

Utilizamos la función include?. Preguntamos al array si este incluye un elemento retornando como respuesta true o false.

a = ["a","b","c"]   
a.include? "a"         # true

Existen otras opciones como utilizar la función index. Si el valor retornado es nil es que el valor no se encuentra en el array

a = ["a","b","c"]    
a.index? "z"         # nil

Esta manera es menos óptima que la anterior, pero también puede resultar útil en determinadas ocasiones.

Dos arrays

En el caso de querer comparar dos arrays la función a utilizar no es tan directa. Para compararlos vamos a aprovechar el uso de operadores básicos y binarios.

Coincidencia de algún valor

Si queremos comprobar si algún valor de un array está contenido en otro, podemos utilizar el operador AND de array:

A = ["a","b","c"]
B = ["c","d","e"]
C = A & B            
# C = ["c"]

Podemos aprovechar esto para comparar:

C.empty?            
# true si coincide algún valor

Inclusión de un array en otro

Si queremos comprobar que todos los valores de un array están en incluidos en otro, utilizamos el operador resta de array.

En este caso, vamos a comparar si el array A está incluído en B:

A = ["a","b","c"]
B = ["c","d","e"]

(B - A).empty?    
# true si a está incluido

Como en el caso anterior, podemos utilizar el operador AND:

(A & B).size == A.size 
# true si a está incluido
]]>
<![CDATA[Errores 404]]>Un error 404 es un error, y como tal viene provocado por un comportamiento no esperado de nuestra web. Esto provoca que un usuario no haya sido capaz de encontrar el contenido que desea, bien sea por un cambio en la estructura de la web o por un enlace mal

]]>
http://laux.es/errores-404/ff9b337f-0688-44e6-b8b6-bd31d6c8bb0aWed, 26 Feb 2014 10:56:15 GMTUn error 404 es un error, y como tal viene provocado por un comportamiento no esperado de nuestra web. Esto provoca que un usuario no haya sido capaz de encontrar el contenido que desea, bien sea por un cambio en la estructura de la web o por un enlace mal escrito.

¿Qué significa? Que nuestro usuario está perdido y que debemos de ayudarle.

Patada en la...

También podemos pegarle una patada a la experiencia de usuario (siempre tenemos esa opción) mostrando el siguiente error:

Error 404

Error 404 de la web de mi Universidad

Por si fuera poco, el error es suyo. Esta web ha sido modificada recientemente cambiando todas las URL y sin dar re-direccionamiento a las anteriores. Como consecuencia todo enlace de otras webs y buscadores nos trae hasta esta maravilla de aviso 404.

No solo no ayuda de ninguna manera al usuario sino que asocia este error con algo tan negativo como una señal de peligro. ¿Qué peligro tenemos aquí? Una mala asociación de conceptos provoca una muy mala experiencia de usuario: estamos ante un error, pero nada más allá que no encontrar un fichero.

... entrepierna

Si queremos que a la UX de nuestra web no le duela esta parte tan sensible debemos de evitar los errores 404 en la medida de lo posible y gestionarlos de manera correcta cuando ocurren.

Ante un error 404, podemos avisar al usuario por qué ha sido provocado el error, introducirle alguna "cuña" como un vídeo, caricatura... que quite importancia a este, explicarle como encontrar contenido en la web o incluso ofrecerle otros enlaces que podrían ser su destino. Todas estas son posibilidades totalmente válidas y que mejoran la experiencia del usuario.

Os dejo dos ejemplos que gestionan bien los errores 404:

Error 404 en Github

Error 404 Github

Error 404 en UXMAD

Error 404 UXMAD

]]>
<![CDATA[Interacción al votar]]>Interesante interacción de la web de Askmen. Se trata de un ranking y de está manera, al tu votar muestran la información sobre todos los votos. Muy gráfico e intuitivo.

]]>
http://laux.es/interaccion-ranking/76b45dd8-aadc-4dfa-8fe4-a2b8edb54bf6Sat, 15 Feb 2014 20:41:30 GMTInteresante interacción de la web de Askmen. Se trata de un ranking y de está manera, al tu votar muestran la información sobre todos los votos. Muy gráfico e intuitivo.

]]>
<![CDATA[UX y seguridad, en busca del equilibrio]]>Hace tiempo empecé a escribir este artículo y lo dejé en borrador, pero la siguiente lectura ha hecho que vuelva a retomarlo: How I Lost My $50,000 Twitter Username. Resumidamente, cuenta la historia de Naoki Hiroshima, un desarrollador que fue extorsionado para ceder una cuenta de twitter bastante extraña

]]>
http://laux.es/ux-seguridad-en-busca-del-equilibrio/ec0873b4-c218-48ac-8582-ee61970b6553Mon, 03 Feb 2014 09:33:08 GMTHace tiempo empecé a escribir este artículo y lo dejé en borrador, pero la siguiente lectura ha hecho que vuelva a retomarlo: How I Lost My $50,000 Twitter Username. Resumidamente, cuenta la historia de Naoki Hiroshima, un desarrollador que fue extorsionado para ceder una cuenta de twitter bastante extraña y valiosa: @N.

Twitter es una gran red social donde personas, marcas y organismos conviven. Desde que fue fundada en 2006, muchos nos hemos registrado. Como ocurre con los dominios web, los nombres de las cuentas están cotizados, bien por corresponder a una entidad real (nombres de ciudades, marcas...), por antiguedad o por ser "especiales". Dentro de esta última categoría podemos incluir la cuenta @N.

¿Cómo extorsionar a un desarrollador para ceda su cuenta @N? El "tesoro" que el cracker robó y con el que pudo extorsionar fue nada más y nada menos que la cuenta de GoDaddy de Naoki. ¿Cómo os sentiríais si de un momento a otro perdierais el control de todos los servidores/dominios que llevan a vuestros proyectos?

Easy

Una taza de café

Una persona y un teléfono

Una de las partes más interesantes de esta historia es el ofrecimiento del cracker a contar como había conseguido las credenciales de acceso a la cuenta de GoDaddy. Esto demuestra lo orgulloso que se sentía este señor/señora y a nosotros nos ayuda a ver que la seguridad es un factor importante.

Para obtener las credenciales, primero llamó a PayPal, con previo conocimiento del email de Naoki. Con esa llamada y algunos trucos de ingeniería social, obtuvo los 4 últimos dígitos de la tarjeta de crédito de este y con ellos consiguió una nueva contraseña para la cuenta de GoDaddy. La política de recuperación de GoDaddy exige que sean los últimos 6 dígitos y no 4, aunque solo hizo falta un poco de persistencia.

Así, con dos llamadas y si moverse de su silla, una única persona pudo hacerse con el control de una cuenta de hosting.

UX y seguridad

La seguridad informática es un tema que afecta directamente al usuario. La pérdida de control y la fuga de datos debe de ser una prioridad a la hora de tratar con estos. Siempre que ofrecemos una funcionalidad que implica directamente datos de usuario debemos de pensar en la balanza: funcionalidad y seguridad.

Existen infinidad de situaciones y siempre es complejo decantarse por una o por otra. Personalmente, os comparto mi manera de plantear una nueva funcionalidad para una aplicación:

  • Planteo los posibles problemas de seguridad que puede causar dicha funcionalidad: pérdida o robo de datos, uso indebido de credenciales, sobrecarga en el servidor...
  • Marco cuales de de los problemas soy capaz de asumir. Es decir, qué problemas dada mi experiencia como programador soy capaz de corregir y evitar que se produzcan.
  • Esto suelo tenerlo de antemano, pero ahora toca escribir las ventajas que supone dicha funcionalidad para las personas que la van a utilizar: facilitar una tarea, introducir un concepto nuevo...
  • Una vez que tenemos los "pros y los contras", valoro si introduzco la funcionalidad. Mi único consejo en este momento es que os pongáis en la piel de la persona que sufre el problema y como os tomaríais el que accedieran a vuestra cuenta, no pudiérais acceder a la aplicación porque el servidor está caído...

Por ejemplo, podemos ofrecer a los usuarios el registro con Twitter en nuestra web con el fin de ofrecerle un botón para tuitear directamente a su cuenta. Así ofrecemos la facilidad y comodidad de tuitear directamente, pero en nuestra mano queda el hecho de proteger ese acceso para evitar publicaciones no deseadas.

¿Por qué yo?

Personas en un autobús, por Matthew Wiebe

Hay varias razones para "atacar" una aplicación, y en Internet somos muchos (Fotografía por Matthew Wiebe)

Una idea muy recurrente en estos casos es preguntarse: ¿pero quién va a querer atacarme a mí?. Hay parte de razón en esta afirmación pues si tenemos un proyecto pequeño, en principio, no debe de ser el objetivo de ciberdelincuentes que buscan beneficios económicos más que molestar.

El problema viene de la costumbre y de cubrirnos en esta pregunta para todos nuestros proyectos. Si por ejemplo extrapolamos esta pregunta a una empresa que tiene una presencia y una marca que mantener, un problema de seguridad puede conllevar multas y lo que es peor, un escándalo que afecta a la propia imagen y reputación de esta.

Debemos de pensar que la seguridad es como un fantasma, cuando aparece un problema asusta a todos. Es un factor importante, pero se vuelve importantísimo cuando se pierde.

In extremis no

En temas de seguridad casi siempre tenemos los dos extremos: personas que se preocupan de cada detalle de seguridad o totalmente despreocupadas de ello.

Lo importante es no caer en los extremos. No tenemos que asegurar cada pequeño detalle de nuestras aplicaciones hasta el punto de no dejarla avanzar, pero debemos de ser conscientes de qué hacemos, qué implicación tiene y si compensa.

Aceptar nuestros términos de uso es sencillo y nos cubren las espaldas, pero por un problema de seguridad podemos perder nuestro valor más preciado, nuestros usuarios.

]]>
<![CDATA[GinAndUX, primer día]]>Mesa preparada para el GinAndUX

Mesa preparada para el GinAndUX (en 47 Degrees)

En el último Betabeers de Cádiz al que fui, una de las ideas que más me gustó fue la que propuso Jorge: GinAndUX. Bien os puede parecer un tanto extraño o perfecto, pero después de ir a la primera edición sé que

]]>
http://laux.es/ginandux-primer-dia/f8566a70-5381-4dc0-9621-223a05363e13Sun, 01 Dec 2013 18:22:19 GMTMesa preparada para el GinAndUX

Mesa preparada para el GinAndUX (en 47 Degrees)

En el último Betabeers de Cádiz al que fui, una de las ideas que más me gustó fue la que propuso Jorge: GinAndUX. Bien os puede parecer un tanto extraño o perfecto, pero después de ir a la primera edición sé que no puede haber una combinación mejor.

Antes de la manteca

Después de un primer momento botellona dónde todos estábamos de pie, con nuestro Gin tonic y contando anécdotas, empezamos a sentarnos para abrir la primera quedada.

Me quedé impresionado con el público. Allí nos habíamos reunido personas de Cádiz y Sevilla, pero no solo eso, eramos desde tipógrafos y diseñadores, a desarrolladores web y móvil pasando por expertos en usabilidad y aprendices. Sólo por conseguir aunar a personas que trabajamos en campos que no deberían estar tan separados, pero por desgracia lo están, demuestra que la experiencia de usuario está ahí y consigue que un equipo multidisciplinar formen un sólo conjunto.

Jorge hizo una introducción a la Ginebra que bebimos, aunque Hendrick no nos diera amor. Personalmente ni suelo beber ni soy un erudito en Ginebras, pero después de cortar ese pepino de 30 centímetros, la verdad es que sabía bastante bien.

¡A la manteca!

Vamos a la manteca (Foto de @raulraja

En esta primera sesión se habló sobre prototipado. Aprovechando que eramos unos 15 asistentes, las diapositivas eran introducidas y comentadas por todos.

Principalmente tratamos sobre la importancia del prototipado dentro del proceso de desarrollo de una aplicación. Este punto de parada antes de comenzar a diseñar/codificar permite que el cliente y todo el equipo formen parte del proyecto como uno solo, no como varias partes.

Por su parte, el cliente es capaz de exponer sus ideas y con ayuda del equipo desarrollador, exponer y validar estas como prototipo con el fin de ahorrar tiempo en el futuro y que ambas partes queden satisfechas con el producto final. Quiero destacar la importancia del equipo en esta parte, pues como se dijo, un cliente no tiene que saber qué es un prototipo, somos nosotros los que debemos de enseñarle que esta es la mejor manera ganar tiempo e integrarse en el proyecto como uno más.

Esto derivó en una charla entre las experiencias personales de cada uno en referencia a los clientes. Sabemos que no siempre están dispuestos a formar parte de una manera tan directa, pero como concluyeron los componentes de 47 Degrees: si un cliente está realmente interesado en desarrollar su aplicación y tú le ofreces la posibilidad de acercarse, este querrá hacerlo.

Tras el debate entre cliente y proyecto pasamos a las herramientas para la realización de sketchs y wireframes. Destacaron aplicaciones como Sketch y POP. Estas herramientas se complementan pues con sketch podemos realizar wireframes sencillos o detallados y con POP los hacemos navegables como si fueran aplicaciones móviles. Son dos herramientas muy poderosas pues combinadas nos hacen tener una visión muy real de como será la aplicación en futuro.

Fin de la manteca

Entre Gin tonics  y comentarios acabamos con la manteca, pero por supuesto con ganas de más. Personalmente creo que es un gran evento, pues como he comentado, UX une a todos en un mismo objetivo y en las charlas tenemos experiencias de todos los gustos y colores.

Si a esto unimos buena gente, una mesa de ping pong y Gin tonics de por medio, como resultado tenemos tres horas de convivencia y aprendizaje que no cambio por nada. Os animo a todos a entrar en estos grupos pues una vez que vas a uno, cada semana que puedas sacar algo de tiempo tendrás otro a donde ir.

Sin más dejo por aquí unos enlaces de interés sobre el evento y una comunidad de facebook y me quedo a la espera de enlazar a este artículo las diapositivas de la charla. Cualquier error en el texto o idea que haya escrito mal o se me haya pasado, no dudéis en avisar ;)

]]>