Noticias Weblogs Código

Variable not found

¡Vacaciones!

July 29, 2015 05:30 PM

Y de nuevo llegó la mejor época del año, una de las escasas ocasiones en las que podemos separarnos un poco de de las pantallas y dedicarnos a disfrutar de lo que hay fuera, eso que algunos llaman mundo real :) Toca desconectar un poco, oxigenarse y recargar pilas, que ya va siendo hora.

Variable not found quedará a la deriva hasta septiembre, cuando volveremos listos para afrontar la nueva temporada, que promete ser intensa :)

Felices vacaciones, nos vemos a la vuelta!!

Playas de Rota (Cádiz)

» Leer más, comentarios, etc...

Blog Bitix

A Microsoft no le importa que uses Windows u Office sin licencia

July 28, 2015 05:30 PM

Si Microsoft quisiera no habría usuarios de Windows sin la correspondiente licencia de uso. Pero lo consiente, tampoco le importa que para un uso personal se haga de forma «pirata». Pocos días después del señalado 29 de julio Windows 10 aparecerá en las redes de compartición de archivos y páginas de descarga, también pocos días después aparecerá un programa que evite el sistema de validación como ha ocurrido con anteriores versiones.

Microsoft

Microsoft ha lanzado a la venta y preinstalará la licencia por el derecho de uso (que no propiedad del producto) de su próximo sistema operativo, Windows 10. Aunque la mayoría adquirirán esa licencia a través del impuesto Windows al comprar un nuevo equipo (aunque no quieran) y aunque (raramente) es posible conseguir su reembolso aún con trabas, la gran mayoría no lo hará bien por desconocimiento de que el equipo y su sistema operativo son dos productos distintos (muchos no saben tampoco que es un sistema operativo), desconocimiento de la posibilidad del reembolso o por no realizar el esfuerzo (me declaro culpable) del cual el fabricante es habitual que proporcione cero información sobre cómo proceder y cuando se realiza es con dificultades. Muchos pagamos la licencia de Windows aunque no la queremos y aunque Microsoft lógicamente prefiere que adquieras la licencia creo que no le importa que no la pagues para un uso personal.

¿Por qué digo que no le importa que no pagues la licencia? Porque versión tras versión la medidas incluidas en Windows u Office para protegerlos de un uso sin licencia son evitadas sin aparentemente muchas dificultades y al cabo de muy poco tiempo aparecen en las páginas de descargas las imágenes junto con las instrucciones a seguir para instalarlo sin ningún tipo de problema. Y en Windows 10 será igual. ¿Por que las medidas de validación incluidas no evitan el uso sin licencia? Porque le conviene a Microsoft no ser muy restrictivos. Si lo fueran algunos pagarían la licencia pero otros muchos dirían ¡¿que? ¿que la licencia cuesta 119 € (o 199, o 50 según lo que se consigue con devolución en un equipo nuevo)? ¿un tercio (aprox.) de lo que me costó el ordenador?!, y eso solo Windows, si además le sumamos Office y otros programas el coste de las licencias podría superar con creces el precio del equipo. Peor aún, cantidad a desembolsar cada unos pocos años por la obsolescencia y nuevas versiones. ¿Y qué harían esos que no pudiesen usar Windows u Office? Buscar alternativas y… ¿cuál creéis que eligirían? La también cara competencia de Apple con sus Mac o alguna distribución GNU/Linux como Ubuntu, Linux Mint, Debian, Fedora, openSUSE, etc… Que la gente supiese y pagase el coste de las licencias de software probablemente sería una de las mejores formas de fomentar el uso del software libre y GNU/Linux.

¿Alguien cree que una empresa como Microsoft con los recursos y capacidad que posee no podría implementar una validación que impidiera su uso indebidamente, más ahora donde la conexión a internet es común? No, la respuesta es que no quiere y tiempo ha tenido para demostrar lo contrario. Perdiendo muchos usuarios a favor de sus alternativas haría que esas personas estuvieran capacitadas para usar esas mismas alternativas en el trabajo (incluidas escuelas y empresas de formación), el mundo empresarial donde Microsoft les es más fácil exigir su derecho legalmente en vez de individualmente a personas y de donde obtendrá sus mayores ingresos. Hacerlo provocaría que bajase su cuota de uso en niveles monopolísticos actualmente y posiblemente a largo plazo un peligro de sus ingresos.

Solo hay que ver las millonadas obscenas que se adjudican en contratos para la compra de licencias en la administración pública. Dinero que salen de tus impuestos que aún muchos políticos y funcionarios (ir)responsables de tales adjudicaciones no comprenden (o no quieren comprender) que dicho abultado gasto recurrente está mucho mejor invertido en empresas locales que crean puestos de trabajo en la región y en software libre del que cualquiera puede beneficiarse en vez de en una empresa que para poco de su desarrollo realiza en cada país donde es usado (notar la diferencia entre gasto e inversión como se comenta en El blog de danitxu). El coste de las alternativas de software libre pueden ser igual de obsceno, más abultado aún o mucho menor pero la diferencia entre otras es que muy seguramente no sea por las licencias sino por los servicios de consultoría o desarrollo que pueden ser ofrecidos por empresas locales y de los que dependiendo del caso cualquiera podría beneficiarse.

Microsoft sabe que estás usando su software sin la correspondiente licencia y te lo dice mostrándote un mensaje cada cierto tiempo o te quita el fondo de pantalla, incordia un poco pero que no impide su uso. Voluntariamente o negligentemente los sistemas de validación incorporados en Windows u Office consienten que muchos usuarios usen la versión la versión Pirated, usuarios que no están dispuestos a pagar el considerable coste de la licencia. Aunque preferirá que los usuarios compren la licencia Microsoft permite en cierta medida el uso de su software sin ella, la alternativa sería perder la posibilidad de convencer a algunos a usar el software legalmente aparte de perder couta de uso a favor de otras alternativas, quizá le es más provechosa una situación donde se use su software ilegalmente que una alternativa. Microsoft también comete las injusticias que la ley le deja o nadie le exige, preinstalado su sistema indeseable por algunos que no lo queremos al mismo tiempo que no proporciona información clara y el proceso sea sencillo para conseguir su devolución junto con el reembolso de su coste y en los impuestos que usando ingeniería fiscal Microsoft junto con otras empresas se llevan a donde menos pagan.

Una nueva versión de Windows o un nuevo equipo es una ocasión ideal para en vez de migrar a la nueva versión de Windows dar el salto a GNU/Linux y dejar de preocuparte de estar violando esclavizantes licencias o aceptando cláusulas que la mayoría de personas si leyera y comprendiera no aceptaría tan alegremente. Yo lo hice hace unos años pasando por varias distribuciones, de Windows a Arch Linux, y después de casi seis años aun sigo en Arch, De Arch Linux a Arch Linux.

Referencia:
De Windows a Arch Linux
De Arch Linux a Arch Linux
Misión cumplida: me han reembolsado la licencia de Windows
Los usuarios de portátiles no pueden obtener reembolso en caso de elegir un SO distinto a Windows
Casado con Windows
Concurso millonario para migrar de Windows XP a 8.1 en la Comunidad de Madrid
Devolución del canon Windows
¿Cuánto gana Microsoft por cada PC con Windows que se vende?

» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

Business Process Outsourcing, Internet of Things

July 28, 2015 01:34 PM

Me da gusto saber de este tipo de noticias, avanzando bien los países latinoamericanos en los temas de BPO sobre todo

Noticia

» Leer más, comentarios, etc...

Variable not found

Roadmap de ASP.NET 5/MVC 6

July 28, 2015 07:05 AM

ASP.NET y .NET 2015Junto con la gran oleada de novedades y lanzamientos a los que asistimos la semana pasada, se publicaron también los planes oficiales que hay para los futuros lanzamientos ASP.NET 5 y MVC 6.

Aunque algunos miembros del equipo habían ido adelantando pistas bastante clarificadoras, e incluso el amigo José Manuel Alarcón ya había publicado al respecto, hasta ahora no podíamos decir que tuviéramos información pública, casi totalmente precisa y de primera mano. Pero por fin ha llegado, y como era de esperar, a través del repositorio oficial del proyecto en Github.

Resumidamente, así está la planificación a día de hoy para ASP.NET 5 y MVC 6:
  • La Beta 6 estaba prevista para ayer, 27 de julio de 2015, aunque por temas de última hora este lanzamiento se ha pospuesto un día; de hecho, es posible que en el momento en que estéis leyendo esto haya sido ya publicada o estén a punto de hacerlo. Sus principales novedades serán el soporte para localización, la posibilidad de targeting para .NET 4.6, buffering y caching de resultados, caché distribuido a través de SQL Server, y algunas otras características.
     
  • La Beta 7, prevista para el 24 de agosto, estará centrada en el desarrollo multiplataforma sobre .NET Core. Se lanzarán los entornos de ejecución para Mac y Linux, facilitando los workflows básicos del desarrollador y la descarga e instalación de los componentes.
     
  • La Beta 8 se lanzará el 21 de septiembre y será la última en la que se añadan features. Se centrará también en la integración con VS y VS Code.
     
  • A partir de este momento, el producto entrará en una fase de estabilización y mejora de fiabilidad y rendimiento. La primera versión candidata, ASP.NET 5 RC 1 se lanzará en noviembre de 2015, siendo la primera distribución production-ready y cross-platform completa. Dependiendo del feedback, ya se verá si se lanzan RC posteriores hasta llegar a la RTM.
            
  • La versión RTM de ASP.NET 5/MVC 6 no verá la luz hasta el primer trimestre de 2016. Esto quiere decir que, si la cosa no se retrasa, podríamos tener estas tecnologías disponibles a finales de marzo.
     
  • Tras ello, se espera la llegada de otros temas que no podrán ser incluidos en la RTM, como el soporte para Visual Basic, SignalR 3, o Web Pages 4. En el roadmap estiman que estos temas se retrasarán hasta el Q3, es decir, que no habrá novedades al respecto hasta verano de 2016.
Toda la información oficial está disponible en Github.

Publicado en Variable not found.

» Leer más, comentarios, etc...

Poesía Binaria

Problema con dos discos duros externos en USB3

July 27, 2015 08:14 AM

dos_discos_duros

De repente, llegan a mis manos dos discos duros externos de 2.5″. Ambos USB3, enchufados a un HUB USB3.0 como el de la foto de más abajo, y tengo que copiar información entre ellos (varios Gb de datos, por lo que, cuanto más rápida sea la copia mejor). Como mi ordenador sólo dispone de un puerto USB3.0, el HUB era necesario. Cuidado, en muchos ordenadores que tienen varios puertos USB3.0, en realidad tienen un HUB interno y estamos en las mismas.

El HUB en cuestión es este, tiene 8 puertos USB, 4 de ellos son USB3 y los otros 4 son USB2.
usb hubEl problema en cuestión es que:

  • La transferencia empieza a ir increíblemente lenta (como si usáramos USB2 o, en ocasiones incluso mucho más lenta. De media, alcancé 1.7Mb/s.
  • Hay errores de entrada/salida cada vez que transmito algún archivo.

Y puede dar uno u otro sin regla aparente.

Otro detalle es que, tanto un disco duro como otro, funcionan si los conecto exclusivamente al puerto USB o desde el HUB si no hay nada conectado. E incluso si enchufo un pendrive USB3 en el HUB sí que puedo hacer transmisiones a velocidades decentes.

Entonces, ¿cuál es el problema? A mí me costó un tiempo darme cuenta y es que, los discos duros consumen más energía que un simple pendrive, normal, son magnéticos, tienen partes mecánicas. Por lo que, en este caso, es necesario utilizar una fuente de alimentación adicional que entregue la potencia necesaria a los dispositivos conectados, ya que el puerto USB de mi ordenador no puede entregarla.

Afortunadamente, el HUB USB3.0 del que dispongo (me alrededor de 15€), trae también un alimentador externo con el que sí puedo trabajar. Así que, si te ha pasado lo mismo, busca una fuente de energía externa. Muchos discos duros externos, se pueden enchufar con y sin alimentación externa (tienen una clavija para conectar un alimentador, o traen en el cable un usb extra para enchufarlo a otro puerto del ordenador o a un cargador.

Si analizamos un poco, la potencia máxima que puede entregar un USB3.0 es de 900-1000mA, frente a USB2 que es capaz de entregar hasta 500mA. Bueno, todo esto depende del fabricante de nuestro ordenador, algunos pueden llegar a soportar más, otros, aunque es raro, pueden llegar a soportar menos, dependiendo de las ganas de ahorrar que tenga la empresa. Pero, en mi caso, en torno a 1mA, bien, mirando en una web de Western Digital (porque los dos discos son de la misma marca), con especificaciones de discos duros, podemos ver que la potencia máxima que consume cada disco duro es de 650mA (pongo la captura por si la página de especificaciones deja de estar disponible).

Screenshot 15-07-2015-160720

Claro, al haber dos discos duros, transmitiendo datos de uno a otro, están trabajando a máxima potencia, por lo que tenemos 650mA * 2 = 1300mA y si le sumamos lo que consume (que aunque sea poco, algo consume el HUB), nos falta potencia, alrededor de 300mA. Esa también es la razón por la que, aunque estén los dos discos duros enchufados, podamos acceder a uno de ellos. Especifican, que cuando no se está utilizando pueden consumir el 30% de potencia, por lo que 650 + 195 = 845mA y todavía tenemos algo de margen.

Otro dato curioso, transmitiendo datos entre particiones NTFS he conseguido velocidades de hasta 60Mb/s, pero transmitiendo datos entre particiones ext4 he conseguido hasta 95Mb/s, pero eso ya es cosa de otro post.

Foto: Las fotos son mías !!! Bueno, una es una captura de pantalla…

The post Problema con dos discos duros externos en USB3 appeared first on Poesía Binaria.

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 209

July 27, 2015 07:00 AM

Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada, algo escasos por el espíritu vacacional que me tiene ya poseído ;D y muy protagonizados por los lanzamientos de nuevos productos y plataformas de la semana pasada.

Espero que os resulten interesantes :-)

.Net

ASP.NET

Data access

Html/Css/Javascript

Visual Studio/Complementos/Herramientas

Cross-platform

Otros

Publicado en Variable not found

» Leer más, comentarios, etc...

Koalite

Uno, dos, tres, cuatro

July 27, 2015 05:06 AM

El tiempo pasa rápido, y más cuanto más viejo te haces. Hace un par de semanas se cumplía el cuarto aniversario desde que empecé a escribir este blog y, como díría José María Aguilar, que para mi siempre será un referente en esto de los blogs sobre desarrollo en español, toca un poco de autobombo.

Cuarto año completado

Este año me ha costado más, e incluso he roto la cadencia de publicación de un post semanal en alguna ocasión, a veces por falta de tiempo, a veces por falta de ganas. Imagino que es normal, no siempre se encuentran temas sobre los que le apetezca a uno escribir.

Si echo la vista atrás y releo mis posts del pasado, además de sentir cierta vergüenza (buena señal), percibo también un cambio en la manera de enfocar los temas. Creo que ahora intento hacer posts más autocontenidos, aunque resulten más largos, y evito las series de varios posts sobre un mismo tema.

Eso también contribuye a hacer más difícil mantener la frecuencia de publicación, porque de lo que antes sacaba 3 posts ahora sólo saco uno, pero prefiero hacerlo así. Habrá opiniones para todos los gustos y seguro que hay quien prefiere posts más cortos y rápidos de leer, pero yo prefiero aumentar la cohesión y poder explicar mejor en un único post la idea que quiero contar.

Espero que dentro de otros 4 años pueda seguir releyendo posts y viendo como cambia el estilo.

Vacaciones

Y como siempre, aprovecho estos absurdos posts de aniversario para celebrar algo que me también me alegra mucho: irme de vacaciones y descansar.

Eso quiere decir que por aquí no habrá mucho movimiento hasta por lo menos finales de agosto aunque, como siempre, seguiré quejándome en twitter de casi todo.

gaviota

La foto de la esa simpática gaviota no es mía, la tiene M. Rey en Flickr.

Posts relacionados:

  1. Tres años de Koalite

» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

Business Analysis Concept

July 26, 2015 02:32 AM

Las empresas deben poner mucho foco en esta área, que promueve a través de sus actividades agregar valor a las compañías

…the practice of enabling change in an enterprise by defining needs and recommending solutions that deliver value to stakeholders. Business analysis enables an enterprise to articulate needs and the rationale for change, and to design and describe solutions that can deliver value.

Artículo

» Leer más, comentarios, etc...

Navegapolis

Las promesas de la agilidad han fallado

July 25, 2015 11:55 AM

dardosEsta fue una de las afirmaciones de Steve McConell, que ayer (1) defendió su postura ecléctica sobre los modelos de desarrollo de software en su intervención "10 Most Important Ideas in Software Development" en el congreso SD WEST2006 (Software Development Conference & Expo).
Su experiencia profesional combina el conocimiento teórico de la ingeniería del software, por su etapa como editor jefe y miembro de IEEE Computer Society, con la visión real de la industria del desarrolo por su puesto actual de Ingeniero Jefe de Construx Software.

Desde su planteamiento central de que diferentes tipos de software necesitan diferentes modelos de desarrollo, argumentó el error que supone plantearse si para nuestra industria lo conveniente es la perspectiva ágil o la basada en procesos.

Defensor del valor de las personas sobre los procesos, y del desarrollo incremental e iterativo sin embargo en su razonamiento ecléctico criticó el exceso de confianza en los modelos ágiles, "en los que inicialmente se había depositado un entusiasmo excesivo. Algo frecuente en las nuevas tecnologías, como ya ocurrió por ejemplo con las herramientas CASE."
Apuntó la contradicción que están demostrando los modelos ágiles cuyos valores teóricos son las personas y su interacción, y que sin embargo en la mayor parte utilizan procesos y tecnología.

En cuanto al resumen de su charla: ideas correctas, e ideas erróneas en el desarrollo de software, expuso los principios que recogen sus obras:

Algunas de las ideas correctas:

  • El software lo desarrollan personas, y su capacidad es un factor crítico.
  • El desarrollo incremental e iterativo es esencial.
  • El coste de arreglar defectos es mayor cuanto más avanzado está el desarrollo, independientemente de que el modelo sea ágil o no.
  • Diferentes tipos de software necesitan diferentes modelos de desarrollo.
  • Ya hay un cuerpo de conocimiento de la ingeniería del software (SWEBOK) con disciplinas como la gestión de la configuración, mantenimiento y pruebas.
  • No cree que SWEBOK sea la ultima palabra pero es un buen inicio.
  • La precisión de las estimaciones se puede mejorar con el tiempo.

Algunas de las ideas erróneas:

  • Sólo hay dos opciones para desarrollar software: iteración continua o modelo secuencial.
  • Con los modelos ágiles el coste de reparar errores no se incrementa al avanzar el desarrollo.
  • Los proyectos de desarrollo de software son problemáticos "per se".
  • Los cambios en los requisitos son inevitables.
  • Los requisitos no se "obtienen", basta tomarlos como maná caido del cielo.
  • Los proyectos empresariales no deben temer a los riesgos
  • Un buen modelo de desarrollo se puede aplicar a todos los proyectos.

Diapositivas de la presentación.

(1) Artículo publicado el 14 de marzo de 2006 en la versión anterior de navegápolis (navegapolis.net)

 

» Leer más, comentarios, etc...

Blog Bitix

Cambiar la ruta raíz del entorno de docker

July 24, 2015 06:00 PM

Cambiando la ruta raíz del entorno de ejecución de docker, dónde guarda las imágenes de los contenedores, los datos de los contenedores y otros metadatos, podemos almacenar esta información en un disco duro externo o memoria USB.

Docker

Por defecto el directorio donde se guardan las imágenes y los contenedores junto con otros metadatos de Docker es /var/lib/docker. En mi caso hace un tiempo me compre un disco de estado sólido Samsung 840 EVO de 250 GiB y comenté en el artículo del anterior enlace. Aunque probablemente un disco SSD sea suficientemente fiable como para que antes de que falle cambiémos de ordenador porque ya es antiguo, yo trato de evitar hacer muchas escrituras al disco. Al trabajar con Docker ya sea descargando imágenes, construyendo imágenes propias con archivos Dockerfile y al arrancar contenedores cuyos procesos escriben en disco prefiero externalizar esas escrituras en una unidad USB ya sea un pendrive o un disco duro. En este artículo comentaré como modificar Docker para que las imágenes y los contenedores estén almacenados en una memoria USB o en otra localización de la por defecto.

En Arch Linux el proceso de docker se arranca con un servicio de systemd:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/1dd776471f97f0c383a9/raw/docker-start.sh">docker-start.sh</pre></a></noscript>

En la definición del servicio de docker se establecen los parámetros de inicio del demonio de docker y deberemos cambiarlo para cambiar la localización de las imágenes y contenedores. En la información de ayuda del comando de docker podemos ver que si queremos cambiar la localización por defecto de las imágenes y contenedores de docker debemos emplear la opción -g “/var/lib/docker”.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/1dd776471f97f0c383a9/raw/docker-help.sh">docker-help.sh</pre></a></noscript>

En Arch Linux el servicio de systemd de docker se guarda en /usr/lib/systemd/system/docker.service. Modificando el parámetro ExecStart de la sección [Service] para añadir el parámetro -g nos quedaría algo como:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/1dd776471f97f0c383a9/raw/docker.service">docker.service</pre></a></noscript>

Iniciando ahora el servicio de Docker veremos que en el directorio que hayamos elegido se crean los metadatos y si hacemos un pull de una imagen se guardará en esta localización.

Directorio raíz de docker
Cada vez que se actualice el paquete de docker el archivo del servicio de systemd se sobreescribirá y perderemos la configuración, de modo que en cada actualización de docker deberemos realizar de nuevo la modificación.

Este artículo es uno de otros que he publicado, en otros artículos he escrito sobre otras cosas relacionadas con docker.

» Leer más, comentarios, etc...

Juanjo Navarro

El "Gran Cañon" chino

July 23, 2015 07:11 PM

Leyendo esta recomendación sobre el uso de la construcción “//” al principio de una url para que se autoajuste a http o https (resumen: no lo hagas, usa siempre https) he leído sobre lo que llaman el Great Cannon chino.

Según parece, Github sufrió en marzo la madre de todos los ataques de denegación de servicio.

We are currently experiencing the largest DDoS (distributed denial of service) attack in github.com’s history. The attack began around 2AM UTC on Thursday, March 26, and involves a wide combination of attack vectors. These include every vector we’ve seen in previous attacks as well as some sophisticated new techniques that use the web browsers of unsuspecting, uninvolved people to flood github.com with high levels of traffic. Based on reports we’ve received, we believe the intent of this attack is to convince us to remove a specific class of content.

Parece ser que el objetivo eran dos sitios de Github que eran mirrors de webs críticas con el gobierno chino.

Lo curioso es cómo se hacía el ataque: En lugar de utilizar servicios de crackers para dirigir el ataque (que utilizan ordenadores zombies bajo su control) este ataque aprovechaba el conocido como Great Firewall of China. Este es un sistema de infraestructuras y firewalls por los que pasa el tráfico de salida desde china y, aquí viene lo interesante, también el de entrada. Es decir: Cuando accedemos a cualquier web situada en china estamos pasando a través de este firewall. Los atacantes utilizaban páginas inocentes que simplemente incluían los javascript de estadísticas de Baidu (el equivalente a Google Analytics chino). Cuando un navegador en cualquier lugar del mundo visitaba una de estas páginas, en lugar de dichos scripts, el firewall devolvía un script malicioso que hacía que el navegador cargase continuamente dichas páginas objetivo. De esta manera, nuestro ordenador (situado fuera de china) participaba en el ataque, a pesar de que ni nuestro navegador ni la página que visitábamos tenían ninguna vulnerabilidad (de hecho, ni siquiera la página de Baidu tenía ninguna vulnerabilidad).

No está claro si el ataque fue realizado por algún grupo de crackers que logro acceder al Great Firewall o directamente por el gobierno chino. Lo que está claro es que este tipo de infraestructuras que pueden realizar ataques man in the middle son muy poderosas. Una solución que se apunta es utilizar conexiones https que evitan esta suplantación del servidor.

» Leer más, comentarios, etc...

Picando Código

Música, Maestro Yoda: Una noche de música geek

July 23, 2015 04:00 PM

ACTUALIZADO CON CAMBIO DE LUGAR

El viernes 31 de julio a las 19:30 horas, en la Asociación Odontológica Uruguaya (Durazno 937, entre Río Branco y Convención) se llevará a cabo “Música, Maestro Yoda”, un concierto de música instrumental de bandas sonoras cinematográficas.

Este recital multimedia, abierto al público y sin fines de lucro, estará a cargo de un cuarteto de cuerdas integrado por destacados músicos locales, dirigidos por el violinista uruguayo radicado en Estados Unidos, Gerónimo Oyenard.

Actuarán el violinista Mathías Pereyra, el violista Milton Gallo y la violonchelista Virginia Jara. Estos últimos son jefes de fila de la Orquesta Juvenil del S.O.D.R.E. y figuran en las filas de la Orquesta Filarmónica de Montevideo y la O.S.S.O.D.R.E.

La parte musical será complementada y enriquecida con la proyección de secuencias e imágenes de las películas en cuestión. Las selecciones serán asimismo presentadas y comentadas por Leo Lagos e Ignacio Alcuri, quienes junto a Oyenard comparten la pasión por el llamado “mundo nerd” o “mundo geek“.

El programa ofrecerá selecciones musicales en arreglos auténticos de partituras de los grandes compositores del cine actual de superhéroes, ciencia ficción y fantasía, como John Williams, Danny Elfman, Hans Zimmer, Alan Silvestri, Howard Shore y Klaus Badelt. Estas bandas sonoras conforman un repertorio poco ejecutado en nuestro medio y merecen mayor difusión en un contexto acorde.

La idea es atraer al público joven que no frecuenta conciertos de música de cámara con instrumentos clásicos, pero sí está familiarizado con el repertorio. De esta forma, se integrarían expresiones de cultura popular de alto nivel (como es la música cinematográfica), ejecutados por músicos con preparación académica, en un marco accesible.

El éxito de asistencia de eventos como Montevideo Comics (8.000 personas en dos días, según estimaciones) y otras convenciones de temática similar, son prueba del interés general y grado de concurrencia.

La entrada de 200 pesos tiene como único objetivo compensar los gastos técnicos, los arreglos musicales y la labor de los artistas.

Música, Maestro Yoda

¡Nos vemos ahí!

» Leer más, comentarios, etc...

Juanjo Navarro

Stacktraces "perdidas" en Java

July 22, 2015 04:58 PM

Hoy, revisando un log de error de una aplicación Java me he encontrado con una cosa curiosa y que nunca había visto: Se estaba registrando una excepción, pero en lugar de mostrar toda la traza de la pila de llamadas (stacktrace) simplemente se estaba mostrando el nombre de la clase de excepción (en este caso un ArrayIndexOutOfBoundsException).

Después de investigar un rato he descubierto que esta es una optimización introducida en el JDK 5. En los casos en que una excepción se produzca en muchas ocasiones, la JVM puede optar por precrear la excepción y lanzar siempre la misma, sin generar nuevas. Esas excepciones precreadas no tienen información de stacktrace y por eso solo muestran su nombre.

En las notas del JDK 5 :

The compiler in the server VM now provides correct stack backtraces for all “cold” built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow

La solución, ya se puede ver, es usar el siguiente parámetro en el arranque de la JVM:

-XX:-OmitStackTraceInFastThrow

» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

CRM Implementation

July 21, 2015 10:00 PM

Desde el blog de Leon Tribe, excelentes artículos de tips sobre una implementación de CRM

Parte 1
Parte 2
Parte 3

» Leer más, comentarios, etc...

Blog Bitix

Cómo trabajar con importes, ratios y divisas en Java

July 21, 2015 06:00 PM

Aún en Java 8 no tenemos una API incluida en el JDK dedicada al manejo de importes, divisas y conversiones. Si la especificación JSR-354 se incluye en alguna versión podremos hacer uso de ella sin necesidad de ninguna dependencia adicional, pero si tenemos necesidad ahora podemos usar la librería que ha producido la especificación. Usando las clases y métodos de la API evitaremos hacer y mantener una implementación nosotros mismos que además seguro no llega al nivel de esta.

Java

Las aplicaciones de comercio electrónico o que realizan operaciones financieras con importes seguro que necesitan una forma de representar un importe junto con una divisa. También si necesitan convertir importes en diferentes divisas necesitarán obtener los ratios de conversión de alguna fuente, en el artículo Servicio para obtener ratios de conversión entre divisas comentaba uno que podemos usar, Open Exchange Rates. Java incluye clases para datos numéricos y con ellos se pueden representar importes como por ejemplo BigDecimal. Para importes no debemos usar en ningún caso un tipo de dato float o double ya que estos son incapaces de representar ciertos valores de forma exacta, usando float y double tendremos errores de precisión, redondeo y representación. En vez de crear un nuevo tipo de datos (una clase) que tenga como propiedades un BigDecimal para el importe y un String o similar para representar la divisa además de implementar las varias operaciones aritméticas y de comparación entre otras muchas cosas que necesitaremos podemos usar la librería que la especificación JSR-354 proporciona una API dedicada a importes y divisas en Java. En Java 8 no se incluyó pero en una futura versión quizá si se incluya en el propio JDK. En este artículo comentaré como usando Java 8 podemos hacer uso de esta API desde ya y que ofrece.

Aunque la especificación no es parte de Java aún el grupo de trabajo encargado ha generado una dependencia que podemos usar. En el repositorio de GitHub podemos encontrar el código de la librería. Incluyéndola como dependencia de un proyecto podemos usarla, usando Gradle con:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/build.gradle">build.gradle</pre></a></noscript>

La librería hace uso de lambdas, una de las novedades que introdujo de Java 8 en el lenguaje, y nos facilita varias funcionalidades. También permite usar streams. Veamos algunas de las posibilidades.

Representación de divisas e importes

Las divisas se representan con CurrencyUnit y los importes se representan usando la clase MoneyAmount, tenemos varias formas de crear instancias de estas clases.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-1.java">Main-1.java</pre></a></noscript>

La API ofrece varios métodos para extraer los valores numéricos, la parte entera y decimal, que una instancia de MoneyAmount contiene así como obtener los valores en un tipo de datos más básico como BigDecimal.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-2.java">Main-2.java</pre></a></noscript>

Operaciones aritméticas, de comparación y operaciones personalizadas

Podemos hacer operaciones aritméticas (suma, resta, multiplicación y división) entre dos importes.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-3.java">Main-3.java</pre></a></noscript>

También podremos hacer comparaciones:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-4.java">Main-4.java</pre></a></noscript>

Redondear importes

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-9.java">Main-9.java</pre></a></noscript>

E incluso implementar operaciones más complejas y habituales personalizadas con la clase MonetaryOperator que se puede aplicar usando el método with de MonerayAmount.

Formateado y analizado

Dependiendo de país o la moneda los importes se representan de forma diferente, por ejemplo, en Estados Unidos se usa «,» como separador de millares y «.» como separador de los decimales, en España es diferente, se usa «.» para los millares y «,» para los decimales. También hay monedas que no tienen decimales como el Yen japonés. Disponemos de métodos y clases para formatear correctamente el importe.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-5.java">Main-5.java</pre></a></noscript>

Podemos hacer la operación contraria parseando o analizando la cadena, obtener un objeto MoneyAmount desde su representación en String.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-6.java">Main-6.java</pre></a></noscript>

Ratios de conversión, conversiones entre divisas

Si necesitamos convertir el importe de una moneda a otra necesitaremos el ratio de conversión entre las monedas, es decir, por cada dólar estadounidense cuántos euros son si queremos hacer una conversión de USD a euro. Se puede obtener el ratio de conversión o hacer la conversión directamente entre las dos monedas. En el siguiente código se muestra cuántos euros son 10 USD con la cotización entre las divisas en el momento de escribir el artículo.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-7.java">Main-7.java</pre></a></noscript>

La librería incluye varias fuentes para las cotizaciones de cada moneda, una de ellas es el Banco Central Europeo pero también podemos crear la implementación de una nueva fuente que por ejemplo use Open Exchange Rates.

Streams y filtros

Por si todo esto fuera poco podemos usar las características de programación funcional de Java 8 ya que la librería ofrece soporte para streams para ejemplo filtrar o para agrupar.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/6d22d043d7ca6f6146cb/raw/Main-8.java">Main-8.java</pre></a></noscript>

El código fuente completo del ejemplo está en uno de mis repositorios de GiHub.

Referencia:
JSR 354 API
JSR 354 RI
JSR 354 - Currency and Money
JSR 354 Money and Currency — Specification
Looking into the Java 9 Money and Currency API (JSR 354)
Java 9 is coming with money api
Joda Money
Adopt JSR 354

» Leer más, comentarios, etc...

Picando Código

Batman: Arkham City Armored Edition Wii U

July 21, 2015 03:30 PM

Batman: Arkham City Armored Edition fue uno de los primeros juegos que adquirí para Wii U. Arkham City es la segunda entrega de la saga Batman: Arkham. Está disponible también para XBox 360, PlayStation 3 y PC. La versión para Wii U (que salió más tarde que las demás) incluye todo el contenido disponible en versiones anteriores mas un modo Battle Armored Tech, soporte para el GamePad de Wii U y más.

Batman: Arkham City Armored Edition

Es un juego de aventuras para un solo jugador. El modo principal nos permite asumir el rol de nuestro hombre murciélago favorito que ha sido encarcelado -como Bruce Wayne (o Bruno Díaz)- en Arkham City, una nueva super prisión de Ciudad Gótica (o Gotham). Invertí bastantes horas en este modo hasta terminar la misión principal. Por suerte siempre solo, así podía decir “I am Batman!” con la voz de Abed Nadir imitando al Batman de Christian Bale sin que nadie me juzgara.

Desde el principio se nota un excelente trabajo en la historia. De tanto jugar y leer cómics en esa época, llegué a un punto donde no sabía si algo que había vivido con Batman había sido en el juego o leyéndolo. Esto puede ser bueno, porque implica que la historia está al nivel de un buen cómic de Batman (y supongo que los lectores de cómics somos gran parte del público objetivo de este tipo de juegos). También puede ser algo malo, porque puede que mi cerebro no esté ocupándose de las cosas realmente importantes, o sí…

La historia fue escrita por Paul Dini -que escribió y produjo capítulos de la serie animada de Batman, y escribió algún que otro cómic de DC-, junto a Paul Crocker y Sefton Hill, que de nombre no los saco.

Las partes cinemáticas nos relatan qué está pasando y nos sentimos parte de una película o cómic interactivo, y el elenco de voces es genial. La voz de Batman es la misma de la serie animada, varias películas animadas de DC y prácticamente todos los videojuegos donde aparece Batman: Kevin Conroy. Otro reconocido actor que presta su talento es la voz de Joker: el maestro Jedi Mark Hamill (supuestamente en su última vez como Joker, pero volvió para el siguiente juego de Arkham).

Como decía la historia se desarrolla dentro de la nueva prisión Arkham City, espacio obviamente compartido con los inadaptados de siempre: Clayface, El Acertijo, Harley Quinn, Bane, Poison Ivy, Two-Face, El Pingüino, Mr. Freeze, Deadshot, entre otros (y ya mencioné antes a Joker).

La prisión es bastante grande, y el juego entra en la categoría “open world”, podemos movernos libremente por todos lados. Se nos provee un hilo conductor para terminar la misión principal, pero está lleno de misiones paralelas que se pueden ir completando en cualquier momento.

Para recorrer la ciudad tenemos la famosa pistola gancho de Batman que nos permite dispararla y retraernos hacia nuestro objetivo al mejor estilo Batfleck en el reciente trailer de Batman V Superman:

Batfleck

Batfleck – el Batman que estábamos necesitando

Para navegar desde las alturas podemos abrir la capa y planear, zambullirnos desde el aire, y otras maniobras aéreas como caerle con las dos patas en la espalda a algún malviviente. Ya sé que no se dice “patas” cuando se habla de seres humanos, pero como se trata del hombre murciélago, vamos a dejarla pasar…

Durante el juego podemos enfrentarnos con cuanto malhechor encontremos, o ser sigilosos y jugar más un estilo Splinter Cell y tratar de neutralizar a nuestros enemigos sin ser detectados. De hecho algunas de las misiones requieren este lado más ninja de Batman, y el equilibrio entre “no puedo dejar que me vean” y “acá entro y rompo todo” lo hace bastante entretenido y le da un poco de variedad a las misiones.

Las peleas están muy buenas, los movimientos y contraataques de Batman son variados y los golpes finales que noquean a los rufianes le dan un toque cinematográfico genial. Con el tiempo se pueden llegar a volver aburridas por repetitivas, pero siempre hay más cosas por hacer en el juego.

Una de las características que se destacan de este juego es que al día de hoy sigue siendo uno de los que mejor aprovecha el GamePad del Wii U. Desde el principio Batman cuenta con varios de sus gadgets y va adquiriendo más en el camino. Dominar el uso de los gadgets es imprescindible para completar el juego y super entretenido.

Para algunos bati aparatos como el Batarang remoto, está genial usar el GamePad e ir dirigiendo -ya sea con las palanquitas o con el sensor de movimiento- el Batarang que aparentemente lleva una GoPro atrás y vamos viendo hacia dónde va. Podemos tirar un Batarang desde el techo de una torre y pegárselo en la nuca a alguno de los chicos malos que deambulan por ahí.

El mapa también se puede ver en todo momento en el GamePad lo cual ayuda mucho. Podemos marcar lugares a donde queremos ir, lo que hace más fácil la navegación si andamos medio desorientados. El scanner detectivesco cuando necesitamos buscar pistas está super integrado al GamePad y es bastante entretenido y el tipo de innovación que Nintendo buscaba con el periférico y los desarrolladores de este juego supieron aprovechar al máximo.

Otro detalle es que algunas de las comunicaciones que obtenemos de Oracle o Alfred se escuchan solamente a través del GamePad y no del televisor. También se puede jugar en modo GamePad, de modo que no necesitamos usar la televisión, pero pierde un poco de la gracia.

Robin

Además de Batman nos vamos a encontrar con varios personajes conocidos de la bati farándula: Gordon, Alfred, Robin, Oracle y Gatúbela. Comentar que Catwoman tiene su propio modo de juego. Es una campaña alternativa en el mismo lugar, pero con las habilidades propias del personaje, las garras, boleadoras y su clásico látigo.

Robin también está disponible para usarlo como personaje por lo menos en la campaña Harley Quinn’s Revenge que se desbloquea tras terminar la historia principal. Otro aspecto interesante que se desbloquea son los distintos skins de Batman. Podemos jugar como varias versiones de Batman de distintos universos: Batman: The Animated Series, The Dark Knight Returns (uno de mis favoritos), Year One, Earth One, Sinestro Corps Batman, Batman Inc., 1970’s (traje azul), y Batman Beyond.

Me avergüenza admitir que terminada la campaña principal y todo, llevo apenas un 52% del juego terminado. Pero recientemente volví a jugarlo para probar las cosas que había desbloqueado y eso me motivó a escribir esta reseña del juego. Vi que tengo mucho por descubrir todavía, así que le voy a dedicar un poco más de tiempo próximamente entre partidas online de Splatoon.

Si tienen un Wii U, definitivamente deberían conseguirlo. Por alguna razón siempre se encuentra muy barato en Amazon. Es increíble la cantidad de contenido que tiene, los gráficos son excelentes y ya sea que conozcan o no la mitología de Batman, es un juego entretenido. Ya estoy considerando también a futuro adquirir Batman: Arkham Origins para Wii U, que seguramente no tenga tanto contenido, pero entra en la misma continuidad y también se consigue bastante barato. Una lástima que Arkham Knight no haya salido para Wii U.

Si quieren ver el juego en acción, pueden mirar el trailer de Wii U que se concentra en las características exclusivas para Wii U.

» Leer más, comentarios, etc...

Picando Código

¿Qué tan muerto está el proyecto SeaMonkey?

July 21, 2015 02:00 PM

SeaMonkeyUna excelente pregunta que se hizo en el grupo de noticias de la suite de aplicaciones para Internet SeaMonkey el día de mi cumpleaños. En el blog oficial del proyecto, Rainer Bielefeld decidió responder con datos.

Mediante unas consultas a Bugzilla, sacó la siguiente tabla que compara algunos parámetros de actividad con el año pasado y 5 años atrás.

Cambios en los bugs / AÑO201520142010
reportes nuevos252208322
corregidos119122273
nuevos6839190
cambiado a funciona para mí, duplicado o incompleto147120310
TOTAL5864891095

Varios reportes fueron creados y corregidos. El parámetro “nuevos” es indicador de actividad de QA. La tabla muestra que en lo que va del 2015 SeaMonkey lleva la mitad de actividad que en 2010. Pero tiene mejores números comparados con el año anterior.

También menciona que el blog ha revivido y que LXLE (distribución GNU/Linux ligera) adoptó a SeaMonkey como su suite para internet por defecto entre otros detalles. El autor alienta a la comunidad a colaborar con el objetivo de definir el éxito del proyecto. Como primer paso, tratar de confirmar algunos reportes de bug, con un ejemplo del autor mismo, y alentando a incluirlo en copia en el reporte para comprobar que las investigaciones fueron exhaustivas.

Es interesante ver que SeaMonkey siga viva en estos tiempos donde los navegadores están en una guerra constante por actualizarse y mantenerse al día. El proyecto es la continuación de la suite original Mozilla que a su vez era la continuación de Netscape. La gestión se abrió de Mozilla cuando dicha fundación decidió concentrarse en Firefox y Thunderbird y ahora es un proyecto mantenido por su comunidad.  Se trata de una suite de aplicaciones por incluir -además del navegador web (descendiente de Netscape)- un cliente de correo y noticias, un editor HTML y un cliente IRC.

SeaMonkey Not Dead

Como fanático de probar navegadores web distintos, siempre mantengo una instalación de SeaMonkey en mi sistema. Creo que lo uso más por nostalgia porque me recuerda a Netscape que por otra razón. Mi navegador preferido sigue siendo Firefox y tengo 3 versiones instaladas en mi sistema: Firefox Developer Edition, Firefox Nightly e Iceweasel (fork de Debian). SeaMonkey es lo suficientemente familiar, y de código abierto, como para quedarme cómodo también.

Pero es incómodo que esté algunas versiones atrasado en Gecko, el mismo motor de navegación que usa Firefox, aunque no deja de ser una buena alternativa. El tema de las extensiones está un poco atrasado también. No hay tantas extensiones como las que tiene Firefox, pero algunas se pueden instalar. Yo todavía conservo mi colección de extensiones para SeaMonkey en el repositorio de add-ons.

Si no conocían SeaMonkey les recomiendo probarlo, y si ya lo conocían vean que sigue vivo, de repente este post les anima a darle otra oportunidad.

Escrito en WordPress desde SeaMonkeySeaMonkey

» Leer más, comentarios, etc...

Variable not found

Código específico para distintos entornos (development, release…) en MVC 6/ASPNET 5

July 21, 2015 11:01 AM

En versiones anteriores de ASP.NET, podíamos utilizar la expresión HttpContext.Current.IsDebuggingEnabled para determinar si una aplicación web está ejecutándose en modo depuración o no, lo cual podía ser útil a la hora de introducir porciones de código específicas para cada caso.

Compilation debug en Web.configEl valor de esa propiedad estaba directamente relacionado con el de la propiedad debug del tag <compilation> presente en el archivo de configuración web.config.

Como sabemos, en ASP.NET 5 esto no sería posible por tres motivos:
Bien, ¿y cómo podemos introducir código dependiente del entorno de ejecución? Pues tenemos varias fórmulas.


La primera y más obvia consiste en acceder directamente al nombre del entorno activo a través de una instancia de IHostingEnvironment proporcionada por el sistema de inyección de dependencias, como vemos en el siguiente ejemplo:

Uso de IHostingEnvironment para obtener el entorno de ejecución

La siguiente captura de pantalla muestra el contenido de la instancia de IHostingEnvironment, y el valor de su propiedad EnvironmentName cuando ejecutamos la aplicación en el entorno “Development”:

IHostingEnvironment

Por tanto, introducir código específico para un entorno concreto sería trivial:

Código

Por supuesto, podríamos eliminar fácilmente esas magic strings del nombre del entorno creando extensores directos sobre IHostingEnvironment (por ejemplo, algo como IsDevelopment() o IsStaging()) o estableciendo constantes globales para ello. De hecho, incluso sería bastante recomendable: por ejemplo, en el código anterior, estamos usando incorrectamente "development" (con minúsculas) en lugar de "Development".

¿Y si quisiéramos introducir ese código en la vista? ¡Sin problema, claro! Recordad que ahora las vistas también pueden recibir dependencias utilizando la nueva directiva @inject de MVC 6, por lo que todo sería bastante similar a lo visto anteriormente:

@inject en la vista

Otra posibilidad bastante interesante recae sobre los tag helpers, una nueva y espectacular característica presente en MVC 6 que permitirá crear vistas mucho más limpias gracias a la introducción de tags preprocesados desde el lado servidor.

En la nueva versión, tendremos disponible un nuevo tag llamado <environment> que será procesado directamente en servidor, en cuyo interior introduciremos el código que habrá de ser incluido en la página si el entorno de ejecución coincide con los que indiquemos en su parámetro names.

Seguro que ve mucho mejor con un ejemplo. Como se puede intuir en el siguiente ejemplo, el <div> sólo será enviado al cliente cuando el entorno de ejecución actual sea “Development”:

Tag environment

Y veamos un ejemplo más de uso, donde aprovechamos el tag <environment> para cargar scripts distintos en función del entorno de ejecución:

Tag environment

Y para finalizar, un truquillo: podéis probar el cambio de entorno muy fácilmente, pues a estas alturas disponemos ya de tooling en Visual Studio 2015. Para ello, a través de las propiedades del proyecto podemos asignar a la variable de entorno ASPNET_ENV el nombre del entorno de ejecución que queramos utilizar:

ASPNET_ENV settings

Publicado en Variable not found.

» Leer más, comentarios, etc...

Picando Código

In Real Life – Cory Doctorow y Jen Wang

July 20, 2015 12:30 PM

In Real Life - Cory Doctorow y Jen WangIn Real Life es una novela gráfica escrita por Cory Doctorow, adaptada y dibujada por Jen Wang. Está basada en un cuento escrito por Doctorow llamado “Anda’s Game”.

Anda, la protagonista, es una joven que acaba de mudarse con sus padres a una ciudad nueva. Permiso de sus padres de por medio, empieza a participar en un juego de rol masivo online (MMORPG) llamado Coarsegold Online.

Anda descubre que es bastante habilidosa por lo que adquiere popularidad y éxito en el juego bastante rápido. Empieza a generar nuevas relaciones y disfrutar de su nuevo rol de heroína en un mundo virtual.

Pero la cosa empieza a cambiar cuando conoce a un minero de oro, un joven chino que debe recurrir a actividades ilegales en el juego como recurso económico.

Al conocer a este personaje empieza a surgir el espíritu subversivo que caracteriza al trabajo del autor. Anda empieza a cuestionarse qué esta bien y mal dentro de las reglas del juego y darse cuenta que a pesar de ser a través de una pantalla, la comunicación en el juego es entre personas del mundo real.

Cory Doctorow se caracteriza por la habilidad de escribir este tipo de historia entretenida dejando más de un mensaje e intentando apelar al espíritu activista de quien lo lee.

La tapa del libro trae una cita de Felicia Day: “Una encantadora novela gráfica para chicas gamers de todas las edades”. No puedo hablar en nombre de las chicas gamers, pero sí puedo agregar que es una lectura entretenida y una linda adición a la colección de este varón que nunca jugó más de 1 hora a World Of Warcraft. Lo recomiendo para gente de todas las edades, es una lectura liviana con ese toque “revolucionario”, pero entretenido y un arte muy bueno que acompaña la historia.

Sobre los autores

Jen Wang es caricaturista e ilustradora. Ha trabajado en los cómics de Adventure Time y LA Magazine. Su primera novela gráfica fue Koko Be Good, IRL es su segundo libro. Es la primera vez que me encuentro con su trabajo y tiene un estilo excelente muy bien complementado con los colores que usa.

Cory Doctorow es periodista, novelista de ciencia ficción y activista. Uno de los dueños de Boing Boing, miembro de la Electronic Frontier Foundation y columnista de varias revistas y diarios. Leí y reseñé dos de sus novelas más conocidas: Little Brother, y la secuela Homeland. Entre esas novelas y otros cuentos y artículos, Doctorow pasó a la lista de mis autores preferidos. In Real Life sumó un punto más a su favor.

In Real Life

» Leer más, comentarios, etc...

Poesía Binaria

Revolución tecnológica, ciencia ficción y software libre

July 20, 2015 08:37 AM

2019666143_22e1499cc4_o

La situación

El mundo de la tecnología evoluciona al ritmo de Usain Bolt. Y es que, parece que fue ayer, cuando Internet era libre, cuando casi nadie sabía lo que era Facebook, cuando comprábamos un pendrive de 128Mb y nos costaba lo mismo que comer dos semanas, o cuando instalábamos Windows 95 en disquetes (13 disquetes, y el último nunca lo pedía).

Bueno, actualmente, Internet no es libre, y pongo el caso de España, aunque es cierto que muchos países lo tienen peor. De Facebook mejor no hablar. Un pendrive de 256Gb (2000 veces más), cuesta unos 100€, y Windows… en su versión 8.1, podría ocupar unos 1800 disquetes por lo que el soporte sería más caro que el software.

Pero lo que me trae hoy a compartir mis reflexiones es otra cosa, es que gracias a los avances en electrónica, e informática, cada día es mucho más fácil y más barato hacer que cualquier aparato esté gobernado por un ordenador y sean capaces de realizar tareas complejas. Es decir, hace 15 años, los teléfonos móviles, cámaras de seguridad, televisiones, programadores de enchufes, máquinas deportivas o cualquier otro aparato tecnológico, si tenía que correr algún programa o mostrar una interfaz al usuario para configurarse o indicar su estado, éstas solían estar programadas en lenguajes de muy bajo nivel, tal vez código máquina específico para la circuitería que traía el aparato. Era muy caro y costoso energéticamente o en espacio poner una CPU como las de los ordenadores en un aparato, pero los diseñadores se quebraban la cabeza en utilizar microcontroladores o CPUs con capacidades reducidas y adaptar los programas a ellas, de todas formas, una televisión para cambiar los canales, el volumen y sintonizarla no necesitaba mucho, y la máquina de deporte (por ejemplo una bicicleta estática), sólo tiene que marcar la distancia, el tiempo y más o menos la velocidad, tampoco es que necesite una potencia de cálculo bestial para actualizar esa información.

La revolución

La verdadera revolución ha llegado hace pocos años, ya que las capacidades de una CPU han aumentado muchísimo, es más, muchísima gente tiene un ordenador sobredimensionado, quiero decir, quad-core, 2GHz, 4Gb de RAM y 1Tb de disco duro para navegar por Internet y tener como mucho 4 pestañas abiertas, un día excepcional de su vida coger un virus que se apodere de su PC y que use un 50% de su capacidad… además, es posible hacer circuitos integrados más pequeños, e incluso que en un tamaño menor que hace 15 años podamos multiplicar por 100 las características de un microcomputador. Hoy en día, cualquier móvil puede tener cuatro núcleos, 1.2GHz y 1Gb de RAM en el tamaño de una moneda, y además, consumir poco (vale que a los móviles les puede durar la batería 2 días frente a 2 semanas de hace unos años, pero hacen más cosas).

La forma de programar también ha cambiado, ahora, al tener chips más potentes, nos podemos permitir utilizar lenguajes de más alto nivel, que no dependan tanto del chip y así tener ventajas adicionales (entre otras muchas):

  • Al no depender de un lenguaje exclusivo del chip que estamos incorporando, si cambiamos el chip (actualizamos a un modelo nuevo, cambiamos de proveedor, etc), no hay que repetir el trabajo.
  • La forma de desarrollo es mucho más rápida y nos permite automatizar muchos procesos.
  • Podemos aprovecharnos de muchas otras tecnologías a nuestro alcance desarrolladas por miles de personas y empresas alrededor del mundo: algoritmos mejor hechos o más probados, incorporar nuevos elementos como conectividad, acceso a Internet, etc

Ahora vemos, máquinas deportivas que envían al móvil nuestro recorrido o que nos dejan navegar por Internet, cámaras de seguridad a las que podemos acceder desde cualquier parte del mundo para ver qué está pasando en nuestra casa o negocio, coches que aparcan solos, marcapasos que pueden ser revisados a distancia… ¡ hasta el monopatín de Regreso al Futuro ! Pero claro, cuanto más complejo es el software más probabilidad de fallos en su programación (recordemos que los desarrolladores de software aunque digamos en broma que somos máquinas que transforman café y pizza en programas informáticos, somos humanos y metemos la pata… y mucho.

No estoy diciendo con eso que nos conformemos con características estilo años noventa, pero es lo que hay, aunque hay muchas técnicas para detectar y prevenir fallos, metodologías y plataformas que previenen malas prácticas, al final, el software tiene fallos y un programador se empeña en meter el círculo en el triángulo y reinventar las malas prácticas, no todos y no siempre, pero hay muchas cosas que pueden salir mal…

Ciencia ficción

El miedo que nos metían las películas era la inteligencia artificial (IA), las máquinas nos atacarán sin piedad, descubrirán la forma de replicarse y actualizarse y nos utilizarán como baterías cultivándonos cuales pollitos en una granja.
Todo empieza desarrollando comodidades para nuestra vida diaria, es perfecto que un frigorífico detecte su contenido, le digas qué quieres comer esta semana y te haga la compra. ¡ Vivimos en la sociedad de la información ! Es muy importante estar conectado y hacernos sentir en el futuro hablándole a la televisión para que cambie de canal o grabe un programa o activando la calefacción de casa desde el teléfono móvil para estar calentito cuando lleguemos a casa; coger hologramas para manejar una compleja interfaz… en fin muchas cosas que están a nuestro alcance ya, o si no a nuestro alcance, al menos se han conseguido hacer ya.

Aunque poco a poco, incluso en la ficción se está tratando un poco más el tema de la privacidad. Si bien es cierto que en películas y series se tiende a dramatizar un poco, pero claro, si nos podemos permitir hacer tantas cosas con los aparatos o como lo llaman otros el Internet de las cosas, todas estas cosas pueden estar enviando información a una central, o claro, pueden ser hackeadas sin que el dueño se entere y el cibercriminal puede recibir información de ese aparato. Información que puede ser audio, vídeo, coordenadas GPS y más.

Hace poco, en una serie que empecé a ver, CSI Cyber (con Patricia Arquette de Medium, Stigmata, Boyhood… y James Van Der Beek, de Dawson’s Creek) vamos CSI de toda la vida, pero en la Unidad de Delitos Cibernéticos. En el episodio piloto tratan el tema de un vigilabebés, que como los padres tienen dinero se han comprado uno que hace muchas cosas, entre otras poder utilizarse desde Internet y que, gracias a que, por un lado, tenía muchas opciones y posibilidades de conexión y por otro lado a que, la empresa desarrolladora permitió un agujero de seguridad (espero no spoilear demasiado), hackearon el aparato. Lo peor de la historia es que puede ser cierto…

Ahora viene la historia de miedo

A día de hoy, tenemos que tener en cuenta una cosa, cuanta más conectividad tenga un aparato, más susceptible de que la información que envía o reciba pueda ser interceptada, más posibles brechas de seguridad que permitan que sea controlado y más fallos puede tener en general. Pero claro, no es plan de rechazar el modo de vida del siglo XXI al que estamos acostumbrados por una pequeña paranoia persecutoria porque, ¿quién va a querer saber mis datos o apoderarse de mis dispositivos?

Porque si hay que espiar a alguien que sea a políticos (bueno, esto ya pasó en los 90 con las líneas de móvil analógicas).
Aunque por otro lado, si te compras una cámara IP que está tan de moda, se han dado casos de algunas en las que cambiando la dirección de entrada, introduciendo algún argumento, o trabajando un poco más, se llega a ver la imagen sin necesidad de contraseña. [Info / Info ] Y… ¿ quién va a querer ver tu cámara o acceder a ella ? Hay mucho loco suelto, pero imagina que van a cometer un robo y pueden provocar un punto ciego de esta forma.

O, que un coche de última generación pueda ser controlado desde fuera sin mucho esfuerzo [ Info ]. ¿Quién puede querer controlarme el coche? Bueno, si te has comprado un coche con esta tecnología, lo primero es alguien que quiera robártelo, lo siguiente, alguien que quiera provocar un accidente, para matarte a ti, o bien para otra persona y a lo mejor tu eres el que tenía un coche que podía controlar y te ha tocado ser un daño colateral.

Que en un sistema de voto electrónico, un ciudadano pueda emitir varios votos [Info]. Bueno, ¿esto se permitió por diseño? ¿fue un lapsus?

Que una conversación privada delante de tu televisor pueda ser escuchada [Info]. Aunque Samsung desmintió la noticia, dice que no escuchan, pero advierten que podría ser posible. Tal vez la compañía no sea la pecadora, puede que alguien intercepte la señal de nuestra televisión, por ejemplo tomando el control de nuestro router. ¿ Y quién puede querer… ? Pues desde una empresa para enviarnos publicidad o conocer nuestras costumbres delante de la televisión, hasta un ladrón que quiera robar en nuestra casa y controle nuestros horarios, una pareja celosa, etc. ¿ He hablado de las cámaras que suelen traer incorporadas muchas televisiones ? No creo que tarden mucho en poder interceptar esas señales.

Lo mismo puede pasar con nuestro teléfono móvil, tenemos teléfonos inteligentes en los que, cada vez más, almacenamos parte de nuestra vida, fotografías, datos de nuestra cuenta del banco… ¡ hasta números de teléfono ! Es más, siempre queremos estar conectados, y claro, como la conexión de datos de la operadora es más lenta y cuesta dinero, queremos WiFi a toda costa, por lo que nuestro terminal haciendo gala de la promiscuidad que le hemos hecho tener, se conectará a redes inalámbricas abiertas, sin pensar en si son de confianza o no, y en muchos sitios públicos, hay quien puede habilitar redes para que se conecten otros terminales y poder espiarles. Por ejemplo, aplicaciones como Whatsapp, que siempre ha destacado por su gran seguridad [Info], pueden ser interceptadas. ¿ Y quién va a querer ver mi Whatsapp ? ¡Es el radiopatio del siglo XXI!

¡¡Freddy Krueger es un principiante!!

O, imaginémonos que, un marcapasos puede ser utilizado para dar descargas mortales cuando un atacante quiera… [Info]
Bueno, hasta aquí algunas pequeñas vulnerabilidades de los sistemas, pero claro. Hay muchas más cosas detrás de todo esto, y es que, al mismo tiempo que todos los aparatos puede hacer cada vez más cosas, muchas de las cosas que pueden hacer pueden ser el envío de información hacia el exterior por parte de las empresas. Como comenté antes con las televisiones Samsung, un móvil también puede enviar, tus coordenadas GPS cada cierto tiempo al fabricante, o tus hábitos, o tus datos, y muchas veces esto viene expresado en la licencia o nada más encender el móvil se da su consentimiento sin leer mucho de qué va el tema.

Incluso, aunque muchos fabricantes nos digan que pueden utilizar nuestros datos con fines estadísticos, ¿ es del todo cierto ?

Estamos en la era de las aplicaciones en la nube. Y eso no es más que decir que, tus datos no los almacenas tú, los almacenamos nosotros. Y, si tienes un secreto, cuanta más gente lo sepa, menos secreto será y más probabilidad de que se difunda [Info]. Y, lo más grave, si esa aplicación en la nube falla, y tiene una filtración, te aguantas, porque puede que tus datos puedan verse, incluso cuando tienes tus dispositivos apagados, porque los datos no están sólo en tu poder, o puede que ni siquiera estén en tu poder.

¿ Damos nuestros datos demasiado pronto ? Hace poco se desveló cuánto cobra change.org por nuestros datos [Info], y casi siempre son datos de calidad, que podrán ser utilizados, y serán utilizados en el futuro. Aunque para esto, el único remedio es un poco de sentido común y advertencias.

¿ Podemos confiar en la nube ? ¿ En los fabricantes de hardware o software ?

Cuestión de confianza

No podemos detener el futuro, y, aunque hay personas que no usan ciertas tecnologías por miedo a todo esto, no queremos ser los parias de nuestros círculos. Siempre podemos tomar ciertas precauciones al adquirir cierto hardware y software o informarnos sobre aplicaciones en la nube más o menos seguras (si se filtran los datos estamos perdidos, pero al menos tú puedes ser el dueño de los datos.

Algo a tener en cuenta es que el hecho de que una cosa se pueda hacer, no significa que sea bueno, ni mucho menos lo mejor. El otro día viendo un programa en la tele de piscinas (uno de esos que viene algún millonario y quiere construir una piscina en su casa que al final termina siendo una obra de dimensiones exageradas. El constructor, instaló un dispositivo para controlar algunas bombas de agua y luces del complejo que había construido desde el móvil. Hasta ahí bien, pero… ¡ necesitaba conexión a Internet ! Está muy chulo, pero vamos, de toda la vida, se ha podido hacer eso desde un cajón de mando, barato (dentro de lo que cabe, porque construir eso no era barato), y seguro (a no ser que corten los cables). Pero claro, necesitas Internet, eso significa que alguien (sin las llaves de la sala de mandos) puede “tocarte las luces”, y que, si se te corta Internet, te quedas sin luces y sin agua en tu piscina. Lo que quiero decir, me parece bien que se pueda controlar desde el móvil, pero me parece excesivo que se necesite Internet para ello.

Un detalle que sí me gustaría aclarar es que el software libre (no digo gratis) puede solucionar algunos de los problemas que se relatan. No digo que sea la solución a todos los problemas del mundo, pero sí a unos cuantos, aunque eso implica que muchas empresas y organismos se pongan las pilas y eso sólo se conseguirá si la gente empieza a preocuparse por su privacidad y seguridad en la red.

Está claro que todos los programadores pueden hacer las cosas mal, y tienen fallos, por supuesto, y los programadores de software libre más aún. Es más, en el software libre se detectan muchos más fallos cada año que en el software privativo. Pero yo lo veo como algo bueno, eso significa que hay más ojos mirando, al poder acceder en cierto modo al código fuente, se puede estudiar y se pueden detectar problemas. También es cierto que hay problemas que llevan 20 años sin solución en ciertos proyectos, pero hay empresas donde ha pasado lo mismo. Sólo digo que hay más posibilidades que de los problemas de software se corrijan. Y pondré como ejemplo el software que controla esas cámaras IP y vigilabebés que pueden tener una puerta trasera, o por ejemplo, un sistema de voto electrónico, seguro que cientos organismos hay pendientes del código fuente para asegurarse de que todo funciona como debe y no beneficia a nadie.

O cientos de programas que utiliza la administración pública con nuestros datos, datos de toda una población que por una puerta trasera podrían estar expuestos.

Si pudiéramos asegurarnos de que la televisión no envía voz a través de la red, tal vez haciendo que los comandos se procesen en la televisión, que se puede, aunque Google, Apple y muchos más prefieran hacerlo enviando toda la información a sus servidores y procesarla allí, no tendríamos problemas de escuchas, bueno con el tema de los móviles, hay mucha controversia, por un lado, lo más fácil es poner un software en nuestro móvil para escucharnos, porque por los saltos en frecuencia de la red móvil actual es muy difícil que nos escuchen, pero claro, estamos enviando una señal con datos, y si algo puede ser reconstruido, puede ser robado.

Y lo más importante, yo no viviría tranquilo, pensando que tengo un marcapasos, que mi vida depende de él, y que puede tener una puerta trasera que permitiría que alguien pudiera matarme. ¿ Y si estuviera disponible el código fuente del software que acompaña a ese marcapasos ? Lo más intuitivo sería pensar que sería lo peor del mundo, que si hay una posibilidad de matar a alguien, se aprovechará. Pero por otra parte, es un dispositivo de vida o muerte, por lo que muchas personas se implicarían en perfeccionar ese software, en que no tuviera puertas traseras que permitan a nadie sin permiso entrar y al final, en mejorar la experiencia del usuario.

Nota al final

He dicho que algún dispositivo es hackeado, bueno, y en las películas se usa la palabra hacker muy a la ligera, es más, la RAE también lo hace y eso no está bien. Me costó mucho trabajo hace muchos años explicarle a mis padres que los hackers no son malos. A los malos, llamémosles crackers o cibercriminales. Porque, al final, un hacker, no es más que alguien apasionado con este mundo que a lo mejor entra sin permiso en un sistema, pero lo hace por el mero hecho de hacerlo, por el descubrimiento y para que esos sistemas sean mejorados y no para robar información o romper nada. Pasteur era un gran hacker… en su campo.

Foto: manuelfloresv (Flickr CC-by)

The post Revolución tecnológica, ciencia ficción y software libre appeared first on Poesía Binaria.

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 208

July 20, 2015 07:00 AM

Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada, espero que os resulten interesantes :-)

.Net

ASP.NET

Azure / Cloud

Conceptos/Patrones/Buenas prácticas

Data access

Html/Css/Javascript

Visual Studio/Complementos/Herramientas

Otros

Publicado en Variable not found

» Leer más, comentarios, etc...

Koalite

Carga asíncrona de datos en ReactJS a través de React Router

July 20, 2015 05:06 AM

Hace poco explicaba cómo utilizar un mixin para cargar datos de forma asíncrona con ReactJS y veíamos que era una solución que nos podía ahorrar bastante código. En este post vamos a ver otra alternativa para realizar la carga de datos externos en nuestros componentes de ReactJS, esta vez aprovechando react-router.

Si no lo conoces, puedes ver este mini tutorial de React Router para hacerte una idea de cómo funciona. Simplificando mucho, React Router nos permite definir una estructura de rutas y navegar entre ellas; siendo su característica más interesante que las rutas pueden estar anidadas.

Esto implica que para generar la página correspondiente a una ruta pueden verse involucrados varios componentes de ReactJS organizados jerárquicamente, y cada uno de ellos genera una parte de la página. Comparándolo con ASP.NET MVC u otros sistemas similares, podrías verlo como una mezcla entre el sistema de routing y el de master pages o layouts. Tienes un ejemplo completo en tutorial de React Router que mencionaba antes.

Apoyándonos en React Router

Para poner en funcionamiento el mecanismo de routing usamos el siguiente código:

Router.run(routes, function(Root, state) {
  React.render(<Root/>, document.body);
});

Con este código al Router le pasamos un objeto routes con la definición de las rutas y una función que se usará cada vez que haya que realizar la navegación a una nueva ruta. Esta función recibe el componente que debemos renderizar, Root, y un objeto state que usaremos más adelante. Normalmente esta función se limita a montar a montar el componente sobre el nodo html que contiene la aplicación de ReactJS.

El plan es aprovechar esta función para poder realizar la carga de datos, escribiendo un código parecido a éste:

Router.run(routes, function(Root, state) {
  fetchData().then(function(data) {
    React.render(<Root data={data}/>, document.body);
  }):
});

Es una idea sencilla: cuando vamos a navegar a una ruta, antes de mostrarla, obtenemos los datos que necesita y cuando los tengamos disponibles mostramos la ruta inyectando esa información a través de this.props.data.

OJO: Puesto que las rutas pueden estar anidadas, esta información que le pasamos al componente Root deberá ser traspasada al resto de las rutas:

var App = React.createClass({
  render: function() {
    return <div>
	         <TitleBar/>
			 <NavBar/>
			 <div className="content">
			   // Esta parte es importante: hay que propagar la información
		       <RouteHandler data={this.props.data}/>
			 </div>
	       </div>;
  }
});

Parece un buen plan, pero tenemos un pequeño inconveniente: necesitamos saber cómo obtener la información específica de cada ruta. En el código que hemos puesto siempre llamamos a fetchData, pero dependiendo de la ruta a la que navegemos, necesitamos cargar una información y otra. Para ello necesitamos saber cuál es el componente al que se está navegando realmente y, a partir de esa información, obtener la función que nos permite cargar su información.

Implementando una solución

Vayamos por partes.

En realidad, no estamos navegando a un único componente, sino a una lista de componentes, ya que como decíamos antes, las rutas pueden estar anidadas. La información de los componentes a los que estamos navegando la podemos obtener del objeto state que recibe la función de navegación. En state.routes se almacena un array con las rutas a las que estamos navegando, y cada elemento de ese array contiene, entre otras cosas, el handler (el componente de ReactJS) asociado a esa ruta.

Con esto tenemos el (o los componentes) implicado en la navegación. Para asociar una función de carga de datos a cada componente hay muchas opciones, pero una de las más idiomáticas en ReactJS es utilizar la propiedad statics al definir el componente:

var UserList = React.createClass({
  statics: {
    fetchData: function(params, query) {
      return server.getUsers(params.department, query.sortedBy);
    }
  }
  render: function() {
    // Esto queremos que nos los inyecte el router a partir de
    // la información obtenida en fecthData
    var users = this.props.data;
    return <ul>...</ul>;
  }
});

En los componentes definiremos una función estática que llamaremos fetchData y recibirá el objeto params y el objeto query asociado a la ruta actual para poder cargar datos que dependan de la ruta en la que nos encontramos. Esta función deberá devolver una promesa que, al resolverse, contendrá la información que espera recibir nuestro componente en this.props.data.

Teniendo esto, podemos modificar nuestro Router.run:

Router.run(routes, function(Root, state) {
  var routes = state.routes,
      params = state.params,
      query = state.query,
      route = routes[routes.length -  1],
      futureData = route.handler.fecthData
                     ? route.handler.fecthData(params, query)
                     : $.when();

  futureData.then(function(data) {
    React.render(<Root data={data}/>, document.body);
  }):
});

El código no es muy complicado, pero hay un par de cosas que aclarar.

Sólo estamos utlizando el fetchData de la última parte de la ruta. Esto es una clara limitación, porque podríamos tener varios componentes dentro de la jerarquía de rutas que necesitan obtener datos externos.

En la documentación de React Router hay un ejemplo de cómo resolverlo, pero cuando cambiamos entre subrutas de un componente, se vuelven a pedir al servidor todos los datos de todos los componentes involucrados en la ruta, lo que suponen más llamadas al servidor de las necesarias. Para un escenario así ésta no es la mejor solución y es preferible gestionar la carga de forma independiente de la ruta, por ejemplo con el mixin de carga asíncrona de datos que vimos hace un par de posts.

También podría darse el caso de que el componente con la función fetchData no siempre sea el último de la jerarquía de rutas. Si ese es tu caso, la solución es sencilla, en lugar de usar el último puedes buscar el primer fetchData que encuentres en la jerarquía y quedarte con él.

Por otra parte, en caso de que no tengamos un fetchData para cargar datos, utilizamos directamente una promesa resuelta, que si usamos jQuery podemos crear con $.when(), para mantener todo el código homogéneo.

Los problemas de la navegación asíncrona

Independientemente de la limitación anterior, el código presenta un problema difícil de apreciar a simple vista. Al hacer la carga de datos de forma asíncrona antes de navegar a la ruta seleccionada, estamos convirtiendo la navegación también en algo asíncrono, lo que hace que se produzca una situación extraña cuando el usuario intenta navegar a una ruta mientras todavía no se ha completado la navegación anterior.

Imagina que se intenta navegar a la ruta /contacts, pero el servidor tarda en devolver los datos de los contactos. Mientras estamos esperando, el usuario se aburre y pulsa un enlace a /products. Los productos se cargan rápido y mostramos una lista de productos, pero unos segundos más tarde se completa la llamada al servidor para obtener contactos y mandamos al sorprendido usuario a una pantalla con los contactos.

Para evitar esto, cuando se completa la recuperación de la información, es decir, cuando se resuelve la promesa, necesitamos saber si esta ruta sigue siendo a la que queremos llegar o el usuario ha cambiado de opinión. Una forma de hacerlo es controlando cuál es la última promesa que hemos usado para cargar datos, y descartar la información si la promesa que se acaba de resolver no es esa. Suena lioso, pero utilizando closures es bastante fácil:

// Mantenemos la promesa asociada a la última ruta a la que hemos 
// intentado navegar.
var currentFuture;

Router.run(routes, function(Root, state) {
  var routes = state.routes,
      params = state.params,
      query = state.query,
      route = routes[routes.length -  1],
      futureData = route.handler.fecthData
		             ? route.handler.fetchData(params, query)
		             : $.when();

  currentFuture = futureData;

  futureData.then(function(data) {
    if (futureData !== currentFuture) {
		// Descartamos la navegación porque se ha navegado
		// a otra ruta mientras cargábamos ésta
		return;
	}
    React.render(<Root data={data}/>, document.body);
  });
});

En currentFuture mantenemos la última promesa utilizada para cargar datos, y cuando se resuelve una promesa, comprobamos si sigue siendo válida o ya hemos navegado a otro sitio, ignorando su resultado en ese caso.

Resumen

Si nuestra aplicación utiliza React Router, la solución descrita en este post es una buena alternativa para cargar datos externos en nuestros componentes.

Una ventaja de esta solución es que los datos llegan a través de las propiedades del componente en lugar de tener que almacenarlos en el estado. Esto simplifica el renderizado del componente, porque no tenemos que estar distinguiendo en el método render entre el caso de tener que mostrar la información y el caso de estar todavía cargándola. El código resultante es más limpio y sencillo de entender.

La desventaja más evidente es que perdemos flexibilidad a la hora de cargar información en los componentes. Sólo podemos recibir información al realizar la navegación entre rutas y, además, tenemos las limitaciones que veíamos antes cuando hay varios componentes en una ruta que necesitan cargar información. Para esos escenarios, la solución basada en mixins ofrece un mayor control sobre la forma de cargar la información y puede resultar más apropiada.

Posts relacionados:

  1. Rutas en ReactJS con React Router
  2. Un mixin para carga asíncrona de datos en ReactJS
  3. Crear un componente con ReactJS

» Leer más, comentarios, etc...

Blog Bitix

Usar docker con Docker Machine en Linux, Windows o Mac

July 18, 2015 10:00 AM

Aunque no usemos Linux podemos hacer uso de docker a través de una máquina virtual de VirtualBox y con Docker Machine. Docker Machine permite crear un sistema con la misión de albergar contenedores de docker, puede ser en VirtualBox pero también en Amazon EC2 o Digital Ocean además de otras muchas opciones.

Docker

Docker ha dejado de ser únicamente una tecnología de contenedores formando un ecosistema alrededor de docker más completo, Docker Compose que permite definir un grupo de contenedores en un archivo, por supuesto parte importante de este ecosistema es Docker Hub para compartir imágenes de contenedores y Docker Swarm que permite formar un cluster de máquinas. En este artículo comentaré cómo usar Docker Machine y dejaré para un futuro Docker Swarm (ya que por el momento las pruebas que he hecho no han sido exitosas).

Antes de nada decir que tanto Docker Machine en el momento de escribir este artículo están en las fases iniciales de desarrollo y pueden cambiar significativamente antes de lanzar una versión 1.0, ahora Docker Machine está en las version 0.3.0. La combinación de Docker Machine y Docker Swarm en algunos puntos son parecidos a los que se ofrecen en CoreOS.

Si has usado Vagrant te resultará Docker Machine muy similar ya que permite crear máquinas virtuales en diferentes proveedores en una máquina anfitrión con VirtualBox hasta Amazon EC2 o Digital Ocean, la lista de controladores soportados es bastante amplia. Estas máquinas que creamos con Docker Machine están destinadas como único objetivo a albergar contenedores docker usando el sistema operativo boot2docker.

Para usar Docker Machine debemos descargar el binario, darle permisos de ejecución y si queremos añadirlo a la variable PATH del sistema.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/691729e2d27cade948ea/raw/docker-machine-version.sh">docker-machine-version.sh</pre></a></noscript>

Con los siguientes comandos podemos crear una máquina virtual para los contenedores docker, listar las máquinas virtuales creadas, hacer SSH a ella, ejecutar un contenedor en ella, parala y eliminar una máquina virtual además de obtener la IP asignada.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/691729e2d27cade948ea/raw/docker-machine-create.sh">docker-machine-create.sh</pre></a></noscript>

Estableciendo las variables de entorno de la máquina virtual podemos usar el comando docker como si de la máquina anfitrión fuera, todos los comandos de docker que lancemos se ejecutarán contra el contenedor docker de la máquina virtual. En el siguiente caso se ejecuta el contenedor de busybox en la máquina virtual dev. Con –unset podemos reiniciar la configuración a la máquina anfitrión.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/691729e2d27cade948ea/raw/docker-machine-run.sh">docker-machine-run.sh</pre></a></noscript>

Podemos detener, volver a iniciar, hacer SSH y eliminar la máquina virtual con:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/691729e2d27cade948ea/raw/docker-machine-manage.sh">docker-machine-manage.sh</pre></a></noscript>
<noscript><a href="https://asciinema.org/a/23600" target="_blank"><img src="https://asciinema.org/a/23600.png" width="734" /></a></noscript> Comandos y uso de Docker Machine en una máquina virtual

El directorio por defecto donde se guardarán los archivos de las máquinas virtuales es ~/.docker/machine, si queremos cambiarlo podemos utilizar el parámetro –storage-path en cada uno de los comandos anteriores de la siguiente forma, el orden de los parámetros es importante:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/691729e2d27cade948ea/raw/docker-machine-storage-path.sh">docker-machine-storage-path.sh</pre></a></noscript>

En el administrador de VirtualBox veremos que se ha creado la máquina virtual dev además de poder cambiar la configuración de memoria y otros parámetros de la máquina virtual.

Máquina de Docker Machine en VirtualBox

Dado que los contenedores se ejecutan en una máquina virtual de VirtualBox y VirtualBox está disponible en Windows y Mac OS además del binario de Docker Machine para estas plataformas podemos usar docker en cualquiera de estos. Aunque no sea de forma nativa como en Linux para un entorno de desarrollo donde las personas trabajan con cualquiera de estos sistemas operativos puede sernos de utilidad.

Como nota final diré que después de crear una máquina virtual las siguientes veces al crear una nueva Docker Machine se me quedaba indefinidamente en el mensaje Starting VM…, algún problema con Docker Machine o VirtualBox que en una futura versión podría solucionarse, la única forma de resolverlo que se es reiniciando el ordenador pero seguro que hay alguna mejor.

Referencia:
Docker Machine

» Leer más, comentarios, etc...

xailer.info

Nueva versión de la utilidad jpg reducer

July 17, 2015 11:47 AM

JPGREDUCER es un reductor de tamaño de ficheros JPG. Permite, de forma masiva, reducir el tamaño de múltiples archivos JPG. Sólo hay que establecer el directorio origen, el destino y el ancho final (el alto lo puede calcular automáticamente para mantener el ratio). Muy cómodo para crear thumbnails o reducir sus fotos a un tamaño más pequeño y llevarlas en el teléfono, por ejemplo. Se incluye el proyecto completo además del ejecutable. Nueva versión 4 incluye guardado de parámetros y posibilidad de establecer la fecha del archivo destino igual que el de captura de la foto.

Saludos

» Leer más, comentarios, etc...

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin